#!/bin/sh # # mysql A very fast and reliable SQL database engine # # chkconfig: 2345 84 25 # # description: A very fast and reliable SQL database engine. # # Source function library . /etc/rc.d/init.d/functions # Get network config . /etc/sysconfig/network # Get service config if [ -f /etc/sysconfig/mysql ]; then . /etc/sysconfig/mysql else nls "Error: %s not found" /etc/sysconfig/mysql nls " MySQL can't be run." exit 1 fi if [ "$MYSQL_DB_CLUSTERS" ]; then nls "Warning: MYSQL_DB_CLUSTERS is set. It's obsolete. Use %s instead." /etc/mysql/clusters.conf fi if [ -f /etc/mysql/clusters.conf ]; then MYSQL_DB_CLUSTERS=`cat /etc/mysql/clusters.conf | grep -v '^#' | cut -s -f 2 -d '='` else nls "Waning: Missing clusters config file %s" /etc/mysql/clusters.conf nls "Using default cluster /var/lib/mysql (compatibility mode)" MYSQL_DB_CLUSTERS=/var/lib/mysql fi # Check that networking is up if is_yes "${NETWORKING}"; then if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then msg_network_down MySQL exit 1 fi else exit 0 fi action="$1" # any db cluster as command line argument? if [ $# -gt 1 ]; then\ shift # perform action for specified clusters only DB_CLUSTERS="$@" else DB_CLUSTERS="$MYSQL_DB_CLUSTERS" fi MYSQL_ERRLOG=/var/log/mysql/err # # Useful functions. # # # check for mysql status # # arguments: # $1 - db cluster # # sets variables: # MYSQL_STATUS = running | not running # MYSQL_PID = pid of mysqld process # mysqlstatus() { clusterdir="$1" mysqlgetconfig "$clusterdir" MYSQL_STATUS="not running" MYSQL_PID="unknown" [ -f "$MYSQL_PIDFILE" ] && MYSQL_PID=$(cat "$MYSQL_PIDFILE") if [ ! -d "/proc/$MYSQL_PID" -a "$MYSQL_PID" != "unknown" ]; then MYSQL_STATUS="died" elif [ -d "/proc/$MYSQL_PID" ]; then grep -q "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline && MYSQL_STATUS="running" || MYSQL_STATUS="not running" fi } # get mysql configuration in variables # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE # # arguments # $1 - db cluster mysqlgetconfig() { clusterdir="$1" # emulate old behaviour if only one cluster specified if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then MYSQL_NO_CLUSTER_COMPAT=yes; export MYSQL_NO_CLUSTER_COMPAT config_file=/etc/mysqld.conf fi config=`cat /etc/mysql/clusters.conf | grep '$clusterdir$' | cut -s -f 1 -d '='` if [ -f "$config" ]; then config_file=$config elif [ -f /etc/mysql/$config ]; then config_file=/etc/mysql/$config elif [ -f "$clusterdir/mysqld.conf" ]; then config_file=$clusterdir/mysqld.conf elif [ -f /etc/mysql/mysqld.conf ]; then config_file=/etc/mysql/mysqld.conf fi MYSQL_CLUSTER_DIR="$clusterdir"; export MYSQL_CLUSTER_DIR MYSQL_CONFIG="$config_file"; export MYSQL_CONFIG if [ ! -f "$config_file" ]; then nls "Error: config file %s not found" "$config_file" nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?" exit 6 fi eval `awk ' /^[ \t]*\[.*\][ \t]*$/ { match($0,/\[.*\]/) section=substr($0,RSTART+1,RSTART+RLENGTH-3) } section=="mysqld" && $2~"=" { if ($1=="datadir") { printf("MYSQL_DATA_DIR=%s;", $3) } else if ($1=="user") { printf("MYSQL_USER=%s;", $3) } else if ($1=="pid-file") { printf("MYSQL_PIDFILE=%s;", $3) } else if ($1=="socket") { printf("MYSQL_SOCKET=%s;", $3) } } END { print "export MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE MYSQL_SOCKET" } ' $config_file` if is_yes "$MYSQL_NO_CLUSTER_COMPAT"; then MYSQL_DATA_DIR_SUB="" else MYSQL_DATA_DIR_SUB="/mysqldb" fi if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "${clusterdir}${MYSQL_DATA_DIR_SUB}/db" ]; then nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db" nls " MySQL can't be run." exit 6 fi if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" ]; then nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" nls " MySQL can't be run." exit 6 fi if [ -z $MYSQL_USER ]; then echo "$(nls 'MySQL user not configured properly')"'!' >&2 nls "Edit %s and configure it." "$config_file" >&2 exit 6 fi } # start mysql mysqlstart() { clusterdir="$1" mysqlgetconfig "$clusterdir" if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then nls "MySQL cluster %s not initialized." "$clusterdir" nls "Try \`%s init %s' before start." "$0" "$clusterdir" exit 6 fi msg_starting "MySQL $clusterdir" busy [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0 TMPDIR=/tmp nice -n ${SERVICE_RUN_NICE_LEVEL:-$DEFAULT_SERVICE_RUN_NICE_LEVEL} /usr/bin/setsid /usr/sbin/mysqld --defaults-file=$MYSQL_CONFIG --datadir=$MYSQL_DATA_DIR --pid-file=$MYSQL_PIDFILE >> $MYSQL_ERRLOG 2>&1 & sleep 2 mysqlstatus "$clusterdir" if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then ok elif [ "$MYSQL_STATUS" = "died" ]; then RETVAL=1 died else RETVAL=1 fail fi } # stop mysql mysqlstop() { clusterdir="$1" mysqlstatus "$clusterdir" msg_stopping "MySQL $clusterdir" busy [ "$MYSQL_PID" != "unknown" ] && kill -TERM "$MYSQL_PID" 2> /dev/null # 3 seconds for nr in 1 2 3; do [ -d "/proc/$MYSQL_PID" ] && sleep 1 done mysqlstatus "$clusterdir" if [ "$MYSQL_STATUS" = "died" ]; then died elif [ "$MYSQL_STATUS" = "running" ]; then fail else ok fi rm -f "$MYSQL_PIDFILE" } # # check for running mysql instances; if any instance is running then # create subsys lock file # mysqlsubsys() { # check for every defined db cluster in sysconfig file for mysqldir in $DB_CLUSTERS; do mysqlstatus "$mysqldir" if [ "$MYSQL_STATUS" = "running" ]; then touch /var/lock/subsys/mysql return fi done rm -f /var/lock/subsys/mysql } mysqlinit() { clusterdir="$1" if [ -f /etc/mysqld.conf ]; then nls "Running in \`no cluster compat' mode: can't initialize database." nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)." exit 1 fi #if [ -f "$clusterdir/mysqld.conf" ]; then # Let's say that config for each cluster is mandatory... mysqlgetconfig "$clusterdir" #else # MYSQL_USER="mysql" # MYSQL_CLUSTER_DIR="$clusterdir" # MYSQL_DATA_DIR="$clusterdir/mysqldb/db" # MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid" # MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock" #fi nls "Initializing cluster %s" "$clusterdir" # Check if not exist init database if [ -d "$MYSQL_DATA_DIR/mysql" ]; then nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysqldb/mysql" nls "before initializing database." nls "For now skipping cluster %s." "$clusterdir" return fi show "Creating privilege mysql tables for $MYSQL_DATA_DIR" busy TMP=/tmp TMPDIR=/tmp # Install this in the user table, too hostname="`hostname --fqdn 2> /dev/null | tr -d '[:space:]'`" [ -z "$hostname" ] && hostname="localhost-unknown" # Check if hostname is valid if [ -z "$hostname" ]; then deltext fail nls "Sorry, the host name is not configured." nls "Please configure the 'hostname' command to return a hostname." exit 1 elif ! hostname -i >/dev/null 2>&1; then deltext fail nls "Sorry, the host '%s' could not be looked up." "$hostname" nls "Please configure the 'hostname' command to return a correct hostname." exit 1 fi # Initialize variables c_d="" i_d="" c_h="" i_h="" c_u="" i_u="" c_f="" i_f="" c_t="" c_c="" # Check for old tables if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/db.frm then # mysqld --bootstrap wants one command/line c_d="$c_d CREATE TABLE db (" c_d="$c_d Host char(60) DEFAULT '' NOT NULL," c_d="$c_d Db char(64) DEFAULT '' NOT NULL," c_d="$c_d User char(16) DEFAULT '' NOT NULL," c_d="$c_d Select_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Update_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Create_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d References_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Index_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d PRIMARY KEY Host (Host,Db,User)," c_d="$c_d KEY User (User)" c_d="$c_d )" c_d="$c_d comment='Database privileges';" i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y'); INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');" fi if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/host.frm then c_h="$c_h CREATE TABLE host (" c_h="$c_h Host char(60) DEFAULT '' NOT NULL," c_h="$c_h Db char(64) DEFAULT '' NOT NULL," c_h="$c_h Select_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Update_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Create_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h References_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Index_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h PRIMARY KEY Host (Host,Db)" c_h="$c_h )" c_h="$c_h comment='Host privileges; Merged with database privileges';" fi if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/user.frm then c_u="$c_u CREATE TABLE user (" c_u="$c_u Host char(60) DEFAULT '' NOT NULL," c_u="$c_u User char(16) DEFAULT '' NOT NULL," c_u="$c_u Password char(16) DEFAULT '' NOT NULL," c_u="$c_u Select_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Update_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Create_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Process_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u File_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u References_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Index_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Super_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL," c_u="$c_u ssl_cipher BLOB NOT NULL," c_u="$c_u x509_issuer BLOB NOT NULL," c_u="$c_u x509_subject BLOB NOT NULL," c_u="$c_u max_questions int(11) unsigned DEFAULT 0 NOT NULL," c_u="$c_u max_updates int(11) unsigned DEFAULT 0 NOT NULL," c_u="$c_u max_connections int(11) unsigned DEFAULT 0 NOT NULL," c_u="$c_u PRIMARY KEY Host (Host,User)" c_u="$c_u )" c_u="$c_u comment='Users and global privileges';" i_u="INSERT INTO user VALUES ('localhost','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0); INSERT INTO user VALUES ('$hostname','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0); REPLACE INTO user VALUES ('localhost','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0); REPLACE INTO user VALUES ('$hostname','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0); INSERT INTO user VALUES ('localhost','mysql_logrotate','','N','N','N','N','N','N','Y','N','N','N','N','N','N','N','N','N','N','N','N','N','N','','','','',0,0,0);" fi if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/func.frm then c_f="$c_f CREATE TABLE func (" c_f="$c_f name char(64) DEFAULT '' NOT NULL," c_f="$c_f ret tinyint(1) DEFAULT '0' NOT NULL," c_f="$c_f dl char(128) DEFAULT '' NOT NULL," c_f="$c_f type enum ('function','aggregate') NOT NULL," c_f="$c_f PRIMARY KEY (name)" c_f="$c_f )" c_f="$c_f comment='User defined functions';" fi if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/tables_priv.frm then c_t="$c_t CREATE TABLE tables_priv (" c_t="$c_t Host char(60) DEFAULT '' NOT NULL," c_t="$c_t Db char(64) DEFAULT '' NOT NULL," c_t="$c_t User char(16) DEFAULT '' NOT NULL," c_t="$c_t Table_name char(60) DEFAULT '' NOT NULL," c_t="$c_t Grantor char(77) DEFAULT '' NOT NULL," c_t="$c_t Timestamp timestamp(14)," c_t="$c_t Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL," c_t="$c_t Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL," c_t="$c_t PRIMARY KEY (Host,Db,User,Table_name)," c_t="$c_t KEY Grantor (Grantor)" c_t="$c_t )" c_t="$c_t comment='Table privileges';" fi if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/columns_priv.frm then c_c="$c_c CREATE TABLE columns_priv (" c_c="$c_c Host char(60) DEFAULT '' NOT NULL," c_c="$c_c Db char(60) DEFAULT '' NOT NULL," c_c="$c_c User char(16) DEFAULT '' NOT NULL," c_c="$c_c Table_name char(60) DEFAULT '' NOT NULL," c_c="$c_c Column_name char(60) DEFAULT '' NOT NULL," c_c="$c_c Timestamp timestamp(14)," c_c="$c_c Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL," c_c="$c_c PRIMARY KEY (Host,Db,User,Table_name,Column_name)" c_c="$c_c )" c_c="$c_c comment='Column privileges';" fi mkdir -p "$MYSQL_DATA_DIR" > /dev/null 2>&1 chown root:root "$MYSQL_CLUSTER_DIR" chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1 chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb" if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then sed -e "s#datadir.*=.*#datadir = $MYSQL_DATA_DIR#g" \ -e "s#pid-file.*=.*#pid-file = $MYSQL_PIDFILE#g" \ -e "s#socket.*=.*#socket = $MYSQL_SOCKET#g" \ /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf" chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf" chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf" fi if [ ! -e /var/lib/mysql/mysql.sock ]; then ln -s "$MYSQL_SOCKET" /var/lib/mysql/mysql.sock fi if /usr/sbin/mysqld --bootstrap --skip-grant-tables \ --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER << END_OF_DATA CREATE DATABASE mysql; use mysql; $c_d $i_d $c_h $i_h $c_u $i_u $c_f $i_f $c_t $c_c END_OF_DATA then ok cat << END_OF_MSG PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS! This is done (after starting database) with: /usr/bin/mysqladmin -u mysql -S $MYSQL_SOCKET password 'password' /usr/bin/mysqladmin -h $hostname -u mysql -S $MYSQL_SOCKET password 'password' /usr/bin/mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password' NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in mysqladmin section. See the manual for more instructions. IMPORTANT: The configuration file is mysqld.conf in MYSQ_DB_CLUSTERS directories. END_OF_MSG else fail cat << END_OF_MSG Installation of grant tables FAILED! Examine the logs in $MYSQL_DATA_DIR for more information. You can also try to start the mysqld demon with: /usr/sbin/mysqld --skip-grant & You can use the command line tool /usr/bin/mysql to connect to the mysql database and look at the grant tables: shell> /usr/bin/mysql -u mysql mysql mysql> show tables Try 'mysqld --help' if you have problems with paths. Setting on logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that may be helpful. The latest information about MySQL is available on the web at http://www.mysql.com/. Please check PLD ftp site for newer versions of this package. Please consult the MySQL manual section: 'Problems running mysql_install_db', and the manual section that describes problems on your OS. Another information source is the MySQL email archive. Please check all of the above before mailing us! And if you do mail us, you MUST use the /usr/bin/mysqlbug script! END_OF_MSG exit 1 fi } # # End of useful functions. # RETVAL=0 case "$action" in start) if [ ! -f $MYSQL_ERRLOG ]; then touch $MYSQL_ERRLOG fi chown mysql:mysql $MYSQL_ERRLOG chmod 640 $MYSQL_ERRLOG for mysqldir in $DB_CLUSTERS; do mysqlstatus "$mysqldir" if [ "$MYSQL_STATUS" = "running" ]; then msg_already_running "MySQL $mysqldir" else mysqlstart "$mysqldir" fi done mysqlsubsys ;; stop) for mysqldir in $DB_CLUSTERS; do mysqlstatus "$mysqldir" if [ "$MYSQL_STATUS" = "not running" ]; then msg_not_running "MySQL $mysqldir" else mysqlstop "$mysqldir" fi done mysqlsubsys ;; status) for mysqldir in $DB_CLUSTERS; do mysqlstatus "$mysqldir" echo "MySQL cluster $mysqldir: $MYSQL_STATUS" done exit $? ;; restart|force-reload) $0 stop $0 start exit $? ;; init) for mysqldir in $DB_CLUSTERS; do mysqlinit "$mysqldir" done exit $? ;; flush-logs) for mysqldir in $DB_CLUSTERS; do mysqlgetconfig "$mysqldir" /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs done ;; *) msg_usage "$0 {start|stop|init|restart|force-reload|status}" exit 3 esac exit $RETVAL # vi: shiftwidth=4 tabstop=4