3 # mysql A very fast and reliable SQL database engine
5 # chkconfig: 2345 84 25
7 # description: A very fast and reliable SQL database engine.
10 # Source function library
11 . /etc/rc.d/init.d/functions
14 . /etc/sysconfig/network
17 if [ -f /etc/sysconfig/mysql ]; then
18 . /etc/sysconfig/mysql
20 nls "Error: %s not found" /etc/sysconfig/mysql
21 nls " MySQL can't be run."
25 if [ "$MYSQL_DB_CLUSTERS" ]; then
26 nls "Warning: MYSQL_DB_CLUSTERS is set. It's obsolete. Use %s instead." /etc/mysql/clusters.conf
29 if [ -f /etc/mysql/clusters.conf ]; then
30 MYSQL_DB_CLUSTERS=`cat /etc/mysql/clusters.conf | grep -v '^#' | cut -s -f 2 -d '='`
32 nls "Waning: Missing clusters config file %s" /etc/mysql/clusters.conf
33 nls "Using default cluster /var/lib/mysql (compatibility mode)"
34 MYSQL_DB_CLUSTERS=/var/lib/mysql
37 # Check that networking is up
38 if is_yes "${NETWORKING}"; then
39 if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
40 msg_network_down MySQL
49 # any db cluster as command line argument?
50 if [ $# -gt 1 ]; then\
52 # perform action for specified clusters only
55 DB_CLUSTERS="$MYSQL_DB_CLUSTERS"
58 MYSQL_ERRLOG=/var/log/mysql/err
65 # check for mysql status
71 # MYSQL_STATUS = running | not running
72 # MYSQL_PID = pid of mysqld process
76 mysqlgetconfig "$clusterdir"
78 MYSQL_STATUS="not running"
81 [ -f "$MYSQL_PIDFILE" ] && MYSQL_PID=$(cat "$MYSQL_PIDFILE")
83 if [ ! -d "/proc/$MYSQL_PID" -a "$MYSQL_PID" != "unknown" ]; then
85 elif [ -d "/proc/$MYSQL_PID" ]; then
86 grep -q "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline && MYSQL_STATUS="running" || MYSQL_STATUS="not running"
90 # get mysql configuration in variables
91 # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE
99 # emulate old behaviour if only one cluster specified
100 if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then
101 MYSQL_NO_CLUSTER_COMPAT=yes; export MYSQL_NO_CLUSTER_COMPAT
102 config_file=/etc/mysqld.conf
105 config=`grep \"$clusterdir$\" /etc/mysql/clusters.conf | cut -s -f 1 -d '='`
106 if [ -f "$config" ]; then
108 elif [ -f /etc/mysql/$config ]; then
109 config_file=/etc/mysql/$config
110 elif [ -f "$clusterdir/mysqld.conf" ]; then
111 config_file=$clusterdir/mysqld.conf
112 elif [ -f /etc/mysql/mysqld.conf ]; then
113 config_file=/etc/mysql/mysqld.conf
116 MYSQL_CLUSTER_DIR="$clusterdir"; export MYSQL_CLUSTER_DIR
117 MYSQL_CONFIG="$config_file"; export MYSQL_CONFIG
118 if [ ! -f "$config_file" ]; then
119 nls "Error: config file %s not found" "$config_file"
120 nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?"
125 /^[ \t]*\[.*\][ \t]*$/ {
127 section=substr($0,RSTART+1,RSTART+RLENGTH-3)
129 section=="mysqld" && $2~"=" {
131 printf("MYSQL_DATA_DIR=%s;", $3)
132 } else if ($1=="user") {
133 printf("MYSQL_USER=%s;", $3)
134 } else if ($1=="pid-file") {
135 printf("MYSQL_PIDFILE=%s;", $3)
136 } else if ($1=="socket") {
137 printf("MYSQL_SOCKET=%s;", $3)
141 print "export MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE MYSQL_SOCKET"
146 if is_yes "$MYSQL_NO_CLUSTER_COMPAT"; then
147 MYSQL_DATA_DIR_SUB=""
149 MYSQL_DATA_DIR_SUB="/mysqldb"
152 if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "${clusterdir}${MYSQL_DATA_DIR_SUB}/db" ]; then
153 nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db"
154 nls " MySQL can't be run."
158 if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" ]; then
159 nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid"
160 nls " MySQL can't be run."
164 if [ -z $MYSQL_USER ]; then
165 echo "$(nls 'MySQL user not configured properly')"'!' >&2
166 nls "Edit %s and configure it." "$config_file" >&2
174 mysqlgetconfig "$clusterdir"
175 if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
176 nls "MySQL cluster %s not initialized." "$clusterdir"
177 nls "Try \`%s init %s' before start." "$0" "$clusterdir"
181 msg_starting "MySQL $clusterdir"
183 [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
184 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 &
186 mysqlstatus "$clusterdir"
187 if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
189 elif [ "$MYSQL_STATUS" = "died" ]; then
201 mysqlstatus "$clusterdir"
202 msg_stopping "MySQL $clusterdir"
204 [ "$MYSQL_PID" != "unknown" ] && kill -TERM "$MYSQL_PID" 2> /dev/null
207 [ -d "/proc/$MYSQL_PID" ] && sleep 1
209 mysqlstatus "$clusterdir"
210 if [ "$MYSQL_STATUS" = "died" ]; then
212 elif [ "$MYSQL_STATUS" = "running" ]; then
217 rm -f "$MYSQL_PIDFILE"
221 # check for running mysql instances; if any instance is running then
222 # create subsys lock file
225 # check for every defined db cluster in sysconfig file
226 for mysqldir in $DB_CLUSTERS; do
227 mysqlstatus "$mysqldir"
228 if [ "$MYSQL_STATUS" = "running" ]; then
229 touch /var/lock/subsys/mysql
233 rm -f /var/lock/subsys/mysql
239 if [ -f /etc/mysqld.conf ]; then
240 nls "Running in \`no cluster compat' mode: can't initialize database."
241 nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)."
245 #if [ -f "$clusterdir/mysqld.conf" ]; then
246 # Let's say that config for each cluster is mandatory...
247 mysqlgetconfig "$clusterdir"
250 # MYSQL_CLUSTER_DIR="$clusterdir"
251 # MYSQL_DATA_DIR="$clusterdir/mysqldb/db"
252 # MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid"
253 # MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock"
256 nls "Initializing cluster %s" "$clusterdir"
258 # Check if not exist init database
259 if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
260 nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysqldb/mysql"
261 nls "before initializing database."
262 nls "For now skipping cluster %s." "$clusterdir"
266 show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
271 # Install this in the user table, too
272 hostname="`hostname --fqdn 2> /dev/null | tr -d '[:space:]'`"
273 [ -z "$hostname" ] && hostname="localhost-unknown"
275 # Check if hostname is valid
276 if [ -z "$hostname" ]; then
279 nls "Sorry, the host name is not configured."
280 nls "Please configure the 'hostname' command to return a hostname."
282 elif ! hostname -i >/dev/null 2>&1; then
285 nls "Sorry, the host '%s' could not be looked up." "$hostname"
286 nls "Please configure the 'hostname' command to return a correct hostname."
290 # Initialize variables
297 # Check for old tables
298 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/db.frm
300 # mysqld --bootstrap wants one command/line
301 c_d="$c_d CREATE TABLE db ("
302 c_d="$c_d Host char(60) DEFAULT '' NOT NULL,"
303 c_d="$c_d Db char(64) DEFAULT '' NOT NULL,"
304 c_d="$c_d User char(16) DEFAULT '' NOT NULL,"
305 c_d="$c_d Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
306 c_d="$c_d Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
307 c_d="$c_d Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
308 c_d="$c_d Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
309 c_d="$c_d Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
310 c_d="$c_d Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
311 c_d="$c_d Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
312 c_d="$c_d References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
313 c_d="$c_d Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
314 c_d="$c_d Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
315 c_d="$c_d Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
316 c_d="$c_d Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
317 c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
318 c_d="$c_d KEY User (User)"
320 c_d="$c_d comment='Database privileges';"
322 i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
323 INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');"
327 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/host.frm
329 c_h="$c_h CREATE TABLE host ("
330 c_h="$c_h Host char(60) DEFAULT '' NOT NULL,"
331 c_h="$c_h Db char(64) DEFAULT '' NOT NULL,"
332 c_h="$c_h Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
333 c_h="$c_h Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
334 c_h="$c_h Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
335 c_h="$c_h Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
336 c_h="$c_h Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
337 c_h="$c_h Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
338 c_h="$c_h Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
339 c_h="$c_h References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
340 c_h="$c_h Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
341 c_h="$c_h Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
342 c_h="$c_h Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
343 c_h="$c_h Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
344 c_h="$c_h PRIMARY KEY Host (Host,Db)"
346 c_h="$c_h comment='Host privileges; Merged with database privileges';"
349 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/user.frm
351 c_u="$c_u CREATE TABLE user ("
352 c_u="$c_u Host char(60) DEFAULT '' NOT NULL,"
353 c_u="$c_u User char(16) DEFAULT '' NOT NULL,"
354 c_u="$c_u Password char(16) DEFAULT '' NOT NULL,"
355 c_u="$c_u Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
356 c_u="$c_u Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
357 c_u="$c_u Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
358 c_u="$c_u Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
359 c_u="$c_u Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
360 c_u="$c_u Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
361 c_u="$c_u Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
362 c_u="$c_u Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
363 c_u="$c_u Process_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
364 c_u="$c_u File_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
365 c_u="$c_u Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
366 c_u="$c_u References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
367 c_u="$c_u Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
368 c_u="$c_u Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
369 c_u="$c_u Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
370 c_u="$c_u Super_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
371 c_u="$c_u Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
372 c_u="$c_u Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
373 c_u="$c_u Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
374 c_u="$c_u Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
375 c_u="$c_u Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
376 c_u="$c_u ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL,"
377 c_u="$c_u ssl_cipher BLOB NOT NULL,"
378 c_u="$c_u x509_issuer BLOB NOT NULL,"
379 c_u="$c_u x509_subject BLOB NOT NULL,"
380 c_u="$c_u max_questions int(11) unsigned DEFAULT 0 NOT NULL,"
381 c_u="$c_u max_updates int(11) unsigned DEFAULT 0 NOT NULL,"
382 c_u="$c_u max_connections int(11) unsigned DEFAULT 0 NOT NULL,"
383 c_u="$c_u PRIMARY KEY Host (Host,User)"
385 c_u="$c_u comment='Users and global privileges';"
387 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);
388 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);
390 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);
391 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);
393 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);"
396 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/func.frm
398 c_f="$c_f CREATE TABLE func ("
399 c_f="$c_f name char(64) DEFAULT '' NOT NULL,"
400 c_f="$c_f ret tinyint(1) DEFAULT '0' NOT NULL,"
401 c_f="$c_f dl char(128) DEFAULT '' NOT NULL,"
402 c_f="$c_f type enum ('function','aggregate') NOT NULL,"
403 c_f="$c_f PRIMARY KEY (name)"
405 c_f="$c_f comment='User defined functions';"
408 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/tables_priv.frm
410 c_t="$c_t CREATE TABLE tables_priv ("
411 c_t="$c_t Host char(60) DEFAULT '' NOT NULL,"
412 c_t="$c_t Db char(64) DEFAULT '' NOT NULL,"
413 c_t="$c_t User char(16) DEFAULT '' NOT NULL,"
414 c_t="$c_t Table_name char(60) DEFAULT '' NOT NULL,"
415 c_t="$c_t Grantor char(77) DEFAULT '' NOT NULL,"
416 c_t="$c_t Timestamp timestamp(14),"
417 c_t="$c_t Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL,"
418 c_t="$c_t Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
419 c_t="$c_t PRIMARY KEY (Host,Db,User,Table_name),"
420 c_t="$c_t KEY Grantor (Grantor)"
422 c_t="$c_t comment='Table privileges';"
425 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/columns_priv.frm
427 c_c="$c_c CREATE TABLE columns_priv ("
428 c_c="$c_c Host char(60) DEFAULT '' NOT NULL,"
429 c_c="$c_c Db char(60) DEFAULT '' NOT NULL,"
430 c_c="$c_c User char(16) DEFAULT '' NOT NULL,"
431 c_c="$c_c Table_name char(60) DEFAULT '' NOT NULL,"
432 c_c="$c_c Column_name char(60) DEFAULT '' NOT NULL,"
433 c_c="$c_c Timestamp timestamp(14),"
434 c_c="$c_c Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
435 c_c="$c_c PRIMARY KEY (Host,Db,User,Table_name,Column_name)"
437 c_c="$c_c comment='Column privileges';"
440 mkdir -p "$MYSQL_DATA_DIR" > /dev/null 2>&1
441 chown root:root "$MYSQL_CLUSTER_DIR"
442 chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
443 chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
445 if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
446 sed -e "s#datadir.*=.*#datadir = $MYSQL_DATA_DIR#g" \
447 -e "s#pid-file.*=.*#pid-file = $MYSQL_PIDFILE#g" \
448 -e "s#socket.*=.*#socket = $MYSQL_SOCKET#g" \
449 /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
450 chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
451 chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
454 if [ ! -e /var/lib/mysql/mysql.sock ]; then
455 ln -s "$MYSQL_SOCKET" /var/lib/mysql/mysql.sock
458 if /usr/sbin/mysqld --bootstrap --skip-grant-tables \
459 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER << END_OF_DATA
460 CREATE DATABASE mysql;
481 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
482 This is done (after starting database) with:
484 /usr/bin/mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
485 /usr/bin/mysqladmin -h $hostname -u mysql -S $MYSQL_SOCKET password 'password'
486 /usr/bin/mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
488 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
489 mysqladmin section. See the manual for more instructions.
491 IMPORTANT: The configuration file is mysqld.conf in MYSQ_DB_CLUSTERS directories.
497 Installation of grant tables FAILED!
499 Examine the logs in $MYSQL_DATA_DIR for more information. You can
500 also try to start the mysqld demon with:
502 /usr/sbin/mysqld --skip-grant &
504 You can use the command line tool /usr/bin/mysql to connect to the mysql
505 database and look at the grant tables:
507 shell> /usr/bin/mysql -u mysql mysql
510 Try 'mysqld --help' if you have problems with paths. Setting on
511 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
512 may be helpful. The latest information about MySQL is available on the
513 web at http://www.mysql.com/.
515 Please check PLD ftp site for newer versions of this package.
517 Please consult the MySQL manual section: 'Problems running
518 mysql_install_db', and the manual section that describes problems on
519 your OS. Another information source is the MySQL email archive.
520 Please check all of the above before mailing us! And if you do mail
521 us, you MUST use the /usr/bin/mysqlbug script!
530 # End of useful functions.
536 if [ ! -f $MYSQL_ERRLOG ]; then
539 chown mysql:mysql $MYSQL_ERRLOG
540 chmod 640 $MYSQL_ERRLOG
542 for mysqldir in $DB_CLUSTERS; do
543 mysqlstatus "$mysqldir"
544 if [ "$MYSQL_STATUS" = "running" ]; then
545 msg_already_running "MySQL $mysqldir"
547 mysqlstart "$mysqldir"
553 for mysqldir in $DB_CLUSTERS; do
554 mysqlstatus "$mysqldir"
555 if [ "$MYSQL_STATUS" = "not running" ]; then
556 msg_not_running "MySQL $mysqldir"
558 mysqlstop "$mysqldir"
564 for mysqldir in $DB_CLUSTERS; do
565 mysqlstatus "$mysqldir"
566 echo "MySQL cluster $mysqldir: $MYSQL_STATUS"
570 restart|force-reload)
576 for mysqldir in $DB_CLUSTERS; do
577 mysqlinit "$mysqldir"
582 for mysqldir in $DB_CLUSTERS; do
583 mysqlgetconfig "$mysqldir"
584 /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
588 msg_usage "$0 {start|stop|init|restart|force-reload|status}"
594 # vi: shiftwidth=4 tabstop=4