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?
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_RA_COMPAT=yes; export MYSQL_RA_COMPAT
102 config_file=/etc/mysqld.conf
104 # TODO: convert this piece of crap to awk
105 config=`grep -v \"^#\" /etc/mysql/clusters.conf | grep "${clusterdir}$" | cut -s -f 1 -d '='`
106 if [ -f "$config" ]; then
107 config_file="$config"
108 elif [ -f /etc/mysql/$config ]; then
109 config_file=/etc/mysql/$config
111 config_file="$clusterdir/mysqld.conf"
115 MYSQL_CLUSTER_DIR="$clusterdir"; export MYSQL_CLUSTER_DIR
117 if [ -z "$config_file" ]; then
118 nls "Error: Can't find config file for %s cluster" "$clusterdir"
121 MYSQL_CONFIG="$config_file"; export MYSQL_CONFIG
124 if [ ! -f "$config_file" ]; then
125 nls "Error: config file %s not found" "$config_file"
126 nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?"
131 /^[ \t]*\[.*\][ \t]*$/ {
133 section=substr($0,RSTART+1,RSTART+RLENGTH-3)
135 section=="mysqld" && $2~"=" {
137 printf("MYSQL_DATA_DIR=%s;", $3)
138 } else if ($1=="user") {
139 printf("MYSQL_USER=%s;", $3)
140 } else if ($1=="pid-file") {
141 printf("MYSQL_PIDFILE=%s;", $3)
142 } else if ($1=="socket") {
143 printf("MYSQL_SOCKET=%s;", $3)
147 print "export MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE MYSQL_SOCKET"
152 if is_yes "$MYSQL_RA_COMPAT"; then
153 MYSQL_DATA_DIR_SUB=""
155 MYSQL_DATA_DIR_SUB="/mysqldb"
158 if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "${clusterdir}${MYSQL_DATA_DIR_SUB}/db" ]; then
159 nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db"
160 nls " MySQL can't be run."
164 if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" ]; then
165 nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid"
166 nls " MySQL can't be run."
170 if [ -z $MYSQL_USER ]; then
171 echo "$(nls 'MySQL user not configured properly')"'!' >&2
172 nls "Edit %s and configure it." "$config_file" >&2
180 mysqlgetconfig "$clusterdir"
181 if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
182 nls "MySQL cluster %s not initialized." "$clusterdir"
183 nls "Try \`%s init %s' before start." "$0" "$clusterdir"
187 msg_starting "MySQL $clusterdir"
189 [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
190 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 &
192 mysqlstatus "$clusterdir"
193 if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
195 elif [ "$MYSQL_STATUS" = "died" ]; then
207 mysqlstatus "$clusterdir"
208 msg_stopping "MySQL $clusterdir"
210 [ "$MYSQL_PID" != "unknown" ] && kill -TERM "$MYSQL_PID" 2> /dev/null
213 [ -d "/proc/$MYSQL_PID" ] && sleep 1
215 mysqlstatus "$clusterdir"
216 if [ "$MYSQL_STATUS" = "died" ]; then
218 elif [ "$MYSQL_STATUS" = "running" ]; then
223 rm -f "$MYSQL_PIDFILE"
227 # check for running mysql instances; if any instance is running then
228 # create subsys lock file
231 # check for every defined db cluster in sysconfig file
232 for mysqldir in $DB_CLUSTERS; do
233 mysqlstatus "$mysqldir"
234 if [ "$MYSQL_STATUS" = "running" ]; then
235 touch /var/lock/subsys/mysql
239 rm -f /var/lock/subsys/mysql
245 if [ -f /etc/mysqld.conf ]; then
246 nls "Running in \`no cluster compat' mode: can't initialize database."
247 nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)."
251 if [ -f "$clusterdir/mysqld.conf" ]; then
252 mysqlgetconfig "$clusterdir"
255 MYSQL_CLUSTER_DIR="$clusterdir"
256 MYSQL_DATA_DIR="$clusterdir/mysqldb/db"
257 MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid"
258 MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock"
261 nls "Initializing cluster %s" "$clusterdir"
263 # Check if not exist init database
264 if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
265 nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysqldb/mysql"
266 nls "before initializing database."
267 nls "For now skipping cluster %s." "$clusterdir"
271 show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
276 # Install this in the user table, too
277 hostname="`hostname --fqdn 2> /dev/null | tr -d '[:space:]'`"
278 [ -z "$hostname" ] && hostname="localhost-unknown"
280 # Check if hostname is valid
281 if [ -z "$hostname" ]; then
284 nls "Sorry, the host name is not configured."
285 nls "Please configure the 'hostname' command to return a hostname."
287 elif ! hostname -i >/dev/null 2>&1; then
290 nls "Sorry, the host '%s' could not be looked up." "$hostname"
291 nls "Please configure the 'hostname' command to return a correct hostname."
295 # Initialize variables
302 # Check for old tables
303 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/db.frm
305 # mysqld --bootstrap wants one command/line
306 c_d="$c_d CREATE TABLE db ("
307 c_d="$c_d Host char(60) DEFAULT '' NOT NULL,"
308 c_d="$c_d Db char(64) DEFAULT '' NOT NULL,"
309 c_d="$c_d User char(16) DEFAULT '' NOT NULL,"
310 c_d="$c_d Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
311 c_d="$c_d Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
312 c_d="$c_d Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
313 c_d="$c_d Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
314 c_d="$c_d Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
315 c_d="$c_d Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
316 c_d="$c_d Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
317 c_d="$c_d References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
318 c_d="$c_d Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
319 c_d="$c_d Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
320 c_d="$c_d Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
321 c_d="$c_d Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
322 c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
323 c_d="$c_d KEY User (User)"
325 c_d="$c_d comment='Database privileges';"
327 i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
328 INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');"
332 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/host.frm
334 c_h="$c_h CREATE TABLE host ("
335 c_h="$c_h Host char(60) DEFAULT '' NOT NULL,"
336 c_h="$c_h Db char(64) DEFAULT '' NOT NULL,"
337 c_h="$c_h Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
338 c_h="$c_h Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
339 c_h="$c_h Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
340 c_h="$c_h Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
341 c_h="$c_h Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
342 c_h="$c_h Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
343 c_h="$c_h Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
344 c_h="$c_h References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
345 c_h="$c_h Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
346 c_h="$c_h Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
347 c_h="$c_h Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
348 c_h="$c_h Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
349 c_h="$c_h PRIMARY KEY Host (Host,Db)"
351 c_h="$c_h comment='Host privileges; Merged with database privileges';"
354 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/user.frm
356 c_u="$c_u CREATE TABLE user ("
357 c_u="$c_u Host char(60) DEFAULT '' NOT NULL,"
358 c_u="$c_u User char(16) DEFAULT '' NOT NULL,"
359 c_u="$c_u Password char(16) DEFAULT '' NOT NULL,"
360 c_u="$c_u Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
361 c_u="$c_u Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
362 c_u="$c_u Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
363 c_u="$c_u Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
364 c_u="$c_u Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
365 c_u="$c_u Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
366 c_u="$c_u Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
367 c_u="$c_u Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
368 c_u="$c_u Process_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
369 c_u="$c_u File_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
370 c_u="$c_u Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
371 c_u="$c_u References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
372 c_u="$c_u Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
373 c_u="$c_u Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
374 c_u="$c_u Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
375 c_u="$c_u Super_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
376 c_u="$c_u Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
377 c_u="$c_u Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
378 c_u="$c_u Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
379 c_u="$c_u Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
380 c_u="$c_u Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
381 c_u="$c_u ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL,"
382 c_u="$c_u ssl_cipher BLOB NOT NULL,"
383 c_u="$c_u x509_issuer BLOB NOT NULL,"
384 c_u="$c_u x509_subject BLOB NOT NULL,"
385 c_u="$c_u max_questions int(11) unsigned DEFAULT 0 NOT NULL,"
386 c_u="$c_u max_updates int(11) unsigned DEFAULT 0 NOT NULL,"
387 c_u="$c_u max_connections int(11) unsigned DEFAULT 0 NOT NULL,"
388 c_u="$c_u PRIMARY KEY Host (Host,User)"
390 c_u="$c_u comment='Users and global privileges';"
392 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);
393 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);
395 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);
396 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);
398 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);"
401 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/func.frm
403 c_f="$c_f CREATE TABLE func ("
404 c_f="$c_f name char(64) DEFAULT '' NOT NULL,"
405 c_f="$c_f ret tinyint(1) DEFAULT '0' NOT NULL,"
406 c_f="$c_f dl char(128) DEFAULT '' NOT NULL,"
407 c_f="$c_f type enum ('function','aggregate') NOT NULL,"
408 c_f="$c_f PRIMARY KEY (name)"
410 c_f="$c_f comment='User defined functions';"
413 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/tables_priv.frm
415 c_t="$c_t CREATE TABLE tables_priv ("
416 c_t="$c_t Host char(60) DEFAULT '' NOT NULL,"
417 c_t="$c_t Db char(64) DEFAULT '' NOT NULL,"
418 c_t="$c_t User char(16) DEFAULT '' NOT NULL,"
419 c_t="$c_t Table_name char(60) DEFAULT '' NOT NULL,"
420 c_t="$c_t Grantor char(77) DEFAULT '' NOT NULL,"
421 c_t="$c_t Timestamp timestamp(14),"
422 c_t="$c_t Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL,"
423 c_t="$c_t Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
424 c_t="$c_t PRIMARY KEY (Host,Db,User,Table_name),"
425 c_t="$c_t KEY Grantor (Grantor)"
427 c_t="$c_t comment='Table privileges';"
430 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/columns_priv.frm
432 c_c="$c_c CREATE TABLE columns_priv ("
433 c_c="$c_c Host char(60) DEFAULT '' NOT NULL,"
434 c_c="$c_c Db char(60) DEFAULT '' NOT NULL,"
435 c_c="$c_c User char(16) DEFAULT '' NOT NULL,"
436 c_c="$c_c Table_name char(60) DEFAULT '' NOT NULL,"
437 c_c="$c_c Column_name char(60) DEFAULT '' NOT NULL,"
438 c_c="$c_c Timestamp timestamp(14),"
439 c_c="$c_c Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
440 c_c="$c_c PRIMARY KEY (Host,Db,User,Table_name,Column_name)"
442 c_c="$c_c comment='Column privileges';"
445 mkdir -p "$MYSQL_DATA_DIR" > /dev/null 2>&1
446 # Using mysql:mysql for MYSQL_CLUSTER_DIR is creating SECURITY hole, root:root is proper
447 chown root:root "$MYSQL_CLUSTER_DIR"
448 chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
449 chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
451 if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
452 sed -e "s#datadir.*=.*#datadir = $MYSQL_DATA_DIR#g" \
453 -e "s#pid-file.*=.*#pid-file = $MYSQL_PIDFILE#g" \
454 -e "s#socket.*=.*#socket = $MYSQL_SOCKET#g" \
455 /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
456 chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
457 chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
460 if [ ! -e /var/lib/mysql/mysql.sock ]; then
461 ln -s "$MYSQL_SOCKET" /var/lib/mysql/mysql.sock
464 if /usr/sbin/mysqld --bootstrap --skip-grant-tables \
465 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER << END_OF_DATA
466 CREATE DATABASE mysql;
487 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
488 This is done (after starting database) with:
490 /usr/bin/mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
491 /usr/bin/mysqladmin -h $hostname -u mysql -S $MYSQL_SOCKET password 'password'
492 /usr/bin/mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
494 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
495 mysqladmin section. See the manual for more instructions.
497 IMPORTANT: The configuration file is mysqld.conf in MYSQ_DB_CLUSTERS directories.
503 Installation of grant tables FAILED!
505 Examine the logs in $MYSQL_DATA_DIR for more information. You can
506 also try to start the mysqld demon with:
508 /usr/sbin/mysqld --skip-grant &
510 You can use the command line tool /usr/bin/mysql to connect to the mysql
511 database and look at the grant tables:
513 shell> /usr/bin/mysql -u mysql mysql
516 Try 'mysqld --help' if you have problems with paths. Setting on
517 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
518 may be helpful. The latest information about MySQL is available on the
519 web at http://www.mysql.com/.
521 Please check PLD ftp site for newer versions of this package.
523 Please consult the MySQL manual section: 'Problems running
524 mysql_install_db', and the manual section that describes problems on
525 your OS. Another information source is the MySQL email archive.
526 Please check all of the above before mailing us! And if you do mail
527 us, you MUST use the /usr/bin/mysqlbug script!
536 # End of useful functions.
542 if [ ! -f $MYSQL_ERRLOG ]; then
545 chown mysql:mysql $MYSQL_ERRLOG
546 chmod 640 $MYSQL_ERRLOG
548 for mysqldir in $DB_CLUSTERS; do
549 mysqlstatus "$mysqldir"
550 if [ "$MYSQL_STATUS" = "running" ]; then
551 msg_already_running "MySQL $mysqldir"
553 mysqlstart "$mysqldir"
559 for mysqldir in $DB_CLUSTERS; do
560 mysqlstatus "$mysqldir"
561 if [ "$MYSQL_STATUS" = "not running" ]; then
562 msg_not_running "MySQL $mysqldir"
564 mysqlstop "$mysqldir"
570 for mysqldir in $DB_CLUSTERS; do
571 mysqlstatus "$mysqldir"
572 echo "MySQL cluster $mysqldir: $MYSQL_STATUS"
576 restart|force-reload)
582 for mysqldir in $DB_CLUSTERS; do
583 mysqlinit "$mysqldir"
588 for mysqldir in $DB_CLUSTERS; do
589 mysqlgetconfig "$mysqldir"
590 /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
594 msg_usage "$0 {start|stop|init|restart|force-reload|status}"
600 # vi: shiftwidth=4 tabstop=4