lib/databases/mysql
e263c82e
 #!/bin/bash
 #
6d04fd7b
 # lib/databases/mysql
 # Functions to control the configuration and operation of the **MySQL** database backend
428af5a2
 
 # Dependencies:
6a5aa7c6
 #
 # - DATABASE_{HOST,USER,PASSWORD} must be defined
428af5a2
 
 # Save trace setting
523f4880
 _XTRACE_DB_MYSQL=$(set +o | grep xtrace)
428af5a2
 set +o xtrace
 
b3d8822e
 MYSQL_DRIVER=${MYSQL_DRIVER:-PyMySQL}
cc6b4435
 
428af5a2
 register_database mysql
 
1d968d7a
 MYSQL_SERVICE_NAME=mysql
ec47bc1d
 if is_fedora && ! is_oraclelinux; then
1d968d7a
     MYSQL_SERVICE_NAME=mariadb
53753293
 fi
cc6b4435
 
 # Functions
 # ---------
 
0eec4f86
 function get_database_type_mysql {
     if [[ "$MYSQL_DRIVER" == "PyMySQL" ]]; then
         echo mysql+pymysql
     else
         echo mysql
     fi
 }
 
995eb927
 # Get rid of everything enough to cleanly change database backends
 function cleanup_database_mysql {
1d968d7a
     stop_service $MYSQL_SERVICE_NAME
995eb927
     if is_ubuntu; then
         # Get ruthless with mysql
8f90f765
         apt_get purge -y mysql* mariadb*
995eb927
         sudo rm -rf /var/lib/mysql
4376ae04
         sudo rm -rf /etc/mysql
995eb927
         return
1d968d7a
     elif is_oraclelinux; then
ec47bc1d
         uninstall_package mysql-community-server
         sudo rm -rf /var/lib/mysql
1d968d7a
     elif is_suse || is_fedora; then
1f316beb
         uninstall_package mariadb-server
         sudo rm -rf /var/lib/mysql
995eb927
     else
         return
     fi
 }
 
428af5a2
 function recreate_database_mysql {
     local db=$1
2832f280
     mysql -u$DATABASE_USER -p$DATABASE_PASSWORD -h$MYSQL_HOST -e "DROP DATABASE IF EXISTS $db;"
157c84b8
     mysql -u$DATABASE_USER -p$DATABASE_PASSWORD -h$MYSQL_HOST -e "CREATE DATABASE $db CHARACTER SET utf8;"
428af5a2
 }
 
 function configure_database_mysql {
3ef23bce
     local my_conf mysql slow_log
428af5a2
     echo_summary "Configuring and starting MySQL"
 
c18b9651
     if is_ubuntu; then
3ef23bce
         my_conf=/etc/mysql/my.cnf
ec47bc1d
     elif is_suse || is_oraclelinux; then
         my_conf=/etc/my.cnf
00011c08
     elif is_fedora; then
3ef23bce
         my_conf=/etc/my.cnf
13e81ad1
         local cracklib_conf=/etc/my.cnf.d/cracklib_password_check.cnf
         if [ -f "$cracklib_conf" ]; then
             inicomment -sudo "$cracklib_conf" "mariadb" "plugin-load-add"
         fi
00011c08
     else
         exit_distro_not_supported "mysql configuration"
428af5a2
     fi
 
     # Start mysql-server
00011c08
     if is_fedora || is_suse; then
         # service is not started by default
1d968d7a
         start_service $MYSQL_SERVICE_NAME
00011c08
     fi
 
     # Set the root password - only works the first time. For Ubuntu, we already
9abb26d6
     # did that with debconf before installing the package, but we still try,
     # because the package might have been installed already.
     sudo mysqladmin -u root password $DATABASE_PASSWORD || true
00011c08
 
ea21eb4f
     # Update the DB to give user '$DATABASE_USER'@'%' full control of the all databases:
428af5a2
     sudo mysql -uroot -p$DATABASE_PASSWORD -h127.0.0.1 -e "GRANT ALL PRIVILEGES ON *.* TO '$DATABASE_USER'@'%' identified by '$DATABASE_PASSWORD';"
 
     # Now update ``my.cnf`` for some local needs and restart the mysql service
 
ea21eb4f
     # Change bind-address from localhost (127.0.0.1) to any (::) and
0526bb82
     # set default db type to InnoDB
dc7b4294
     iniset -sudo $my_conf mysqld bind-address "$(ipv6_unquote $SERVICE_LISTEN_ADDRESS)"
88b84094
     iniset -sudo $my_conf mysqld sql_mode TRADITIONAL
9c0b9f30
     iniset -sudo $my_conf mysqld default-storage-engine InnoDB
4b59fbb8
     iniset -sudo $my_conf mysqld max_connections 1024
9c0b9f30
     iniset -sudo $my_conf mysqld query_cache_type OFF
     iniset -sudo $my_conf mysqld query_cache_size 0
428af5a2
 
c4f47345
     if [[ "$DATABASE_QUERY_LOGGING" == "True" ]]; then
         echo_summary "Enabling MySQL query logging"
1f316beb
         if is_fedora; then
3b53aeba
             slow_log=/var/log/mariadb/mariadb-slow.log
         else
             slow_log=/var/log/mysql/mysql-slow.log
         fi
0526bb82
         sudo sed -e '/log.slow.queries/d' \
             -e '/long.query.time/d' \
             -e '/log.queries.not.using.indexes/d' \
3ef23bce
             -i $my_conf
0526bb82
 
         # Turn on slow query log, log all queries (any query taking longer than
         # 0 seconds) and log all non-indexed queries
9c0b9f30
         iniset -sudo $my_conf mysqld slow-query-log 1
         iniset -sudo $my_conf mysqld slow-query-log-file $slow_log
         iniset -sudo $my_conf mysqld long-query-time 0
         iniset -sudo $my_conf mysqld log-queries-not-using-indexes 1
c4f47345
     fi
7c73e8de
 
1d968d7a
     restart_service $MYSQL_SERVICE_NAME
428af5a2
 }
 
 function install_database_mysql {
c18b9651
     if is_ubuntu; then
428af5a2
         # Seed configuration with mysql password so that apt-get install doesn't
         # prompt us for a password upon install.
90333437
         sudo debconf-set-selections <<MYSQL_PRESEED
 mysql-server mysql-server/root_password password $DATABASE_PASSWORD
 mysql-server mysql-server/root_password_again password $DATABASE_PASSWORD
 mysql-server mysql-server/start_on_boot boolean true
428af5a2
 MYSQL_PRESEED
     fi
 
     # while ``.my.cnf`` is not needed for OpenStack to function, it is useful
     # as it allows you to access the mysql databases via ``mysql nova`` instead
     # of having to specify the username/password each time.
     if [[ ! -e $HOME/.my.cnf ]]; then
         cat <<EOF >$HOME/.my.cnf
 [client]
 user=$DATABASE_USER
 password=$DATABASE_PASSWORD
199d8574
 host=$MYSQL_HOST
428af5a2
 EOF
         chmod 0600 $HOME/.my.cnf
     fi
     # Install mysql-server
1d968d7a
     if is_oraclelinux; then
         install_package mysql-community-server
     elif is_fedora || is_suse; then
ec47bc1d
         install_package mariadb-server
1d968d7a
         sudo systemctl enable $MYSQL_SERVICE_NAME
ec47bc1d
     elif is_ubuntu; then
         install_package mysql-server
ca5c4713
     else
00011c08
         exit_distro_not_supported "mysql installation"
ca5c4713
     fi
5686dbc4
 }
b1d8e8e2
 
5686dbc4
 function install_database_python_mysql {
b1d8e8e2
     # Install Python client module
37421991
     pip_install_gr $MYSQL_DRIVER
     if [[ "$MYSQL_DRIVER" == "MySQL-python" ]]; then
         ADDITIONAL_VENV_PACKAGES+=",MySQL-python"
0f63eb3a
     elif [[ "$MYSQL_DRIVER" == "PyMySQL" ]]; then
         ADDITIONAL_VENV_PACKAGES+=",PyMySQL"
37421991
     fi
428af5a2
 }
 
 function database_connection_url_mysql {
7e79d913
     local db=$1
     echo "$BASE_SQL_CONN/$db?charset=utf8"
428af5a2
 }
 
cc6b4435
 
428af5a2
 # Restore xtrace
523f4880
 $_XTRACE_DB_MYSQL
584d90ec
 
 # Local variables:
 # mode: shell-script
 # End: