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 [ -z "$MYSQL_DB_CLUSTERS" ]; then
26 nls "Warning: MYSQL_DB_CLUSTERS not found or is empty"
27 nls "defaulting to /var/lib/mysql (compatiblity mode)"
28 MYSQL_DB_CLUSTERS="/var/lib/mysql"
31 # Check that networking is up
32 if is_yes "${NETWORKING}"; then
33 if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
34 msg_network_down MySQL
43 # any db cluster as command line argument?
46 # perform action for specified clusters only
49 DB_CLUSTERS="$MYSQL_DB_CLUSTERS"
52 MYSQL_ERRLOG=/var/log/mysql/err
59 # check for mysql status
65 # MYSQL_STATUS = running | not running
66 # MYSQL_PID = pid of mysqld process
70 mysqlgetconfig "$clusterdir"
71 MYSQL_STATUS="not running"
74 [ -f "$MYSQL_PIDFILE" ] && MYSQL_PID=$(cat "$MYSQL_PIDFILE")
76 if [ ! -d "/proc/$MYSQL_PID" -a "$MYSQL_PID" != "unknown" ]; then
78 elif [ -d "/proc/$MYSQL_PID" ]; then
79 grep -q "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline && MYSQL_STATUS="running" || MYSQL_STATUS="not running"
83 # get mysql configuration in variables
84 # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE
91 config_file="$clusterdir/mysqld.conf"
93 # emulate old behaviour if only one cluster specified
94 if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then
95 MYSQL_NO_CLUSTER_COMPAT=yes; export MYSQL_NO_CLUSTER_COMPAT
96 config_file=/etc/mysqld.conf
99 MYSQL_CLUSTER_DIR="$clusterdir"; export MYSQL_CLUSTER_DIR
100 MYSQL_CONFIG="$config_file"; export MYSQL_CONFIG
102 if [ ! -f "$config_file" ]; then
103 nls "Error: config file %s not found" "$config_file"
104 nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?"
109 /^[ \t]*\[.*\][ \t]*$/ {
111 section=substr($0,RSTART+1,RSTART+RLENGTH-3)
113 section=="mysqld" && $2~"=" {
115 printf("MYSQL_DATA_DIR=%s;", $3)
116 } else if ($1=="user") {
117 printf("MYSQL_USER=%s;", $3)
118 } else if ($1=="pid-file") {
119 printf("MYSQL_PIDFILE=%s;", $3)
120 } else if ($1=="socket") {
121 printf("MYSQL_SOCKET=%s;", $3)
125 print "export MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE MYSQL_SOCKET"
130 if is_yes "$MYSQL_NO_CLUSTER_COMPAT"; then
131 MYSQL_DATA_DIR_SUB=""
133 MYSQL_DATA_DIR_SUB="/mysqldb"
136 if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "${clusterdir}${MYSQL_DATA_DIR_SUB}/db" ]; then
137 nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db"
138 nls " MySQL can't be run."
142 if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" ]; then
143 nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid"
144 nls " MySQL can't be run."
148 if [ -z $MYSQL_USER ]; then
149 echo "$(nls 'MySQL user not configured properly')"'!' >&2
150 nls "Edit %s and configure it." "$config_file" >&2
158 mysqlgetconfig "$clusterdir"
159 if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
160 nls "MySQL cluster %s not initialized." "$clusterdir"
161 nls "Try \`%s init %s' before start." "$0" "$clusterdir"
165 msg_starting "MySQL $clusterdir"
167 [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
168 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 &
170 mysqlstatus "$clusterdir"
171 if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
173 elif [ "$MYSQL_STATUS" = "died" ]; then
185 mysqlstatus "$clusterdir"
186 msg_stopping "MySQL $clusterdir"
188 [ "$MYSQL_PID" != "unknown" ] && kill -TERM "$MYSQL_PID" 2> /dev/null
191 [ -d "/proc/$MYSQL_PID" ] && sleep 1
193 mysqlstatus "$clusterdir"
194 if [ "$MYSQL_STATUS" = "died" ]; then
196 elif [ "$MYSQL_STATUS" = "running" ]; then
201 rm -f "$MYSQL_PIDFILE"
205 # check for running mysql instances; if any instance is running then
206 # create subsys lock file
209 # check for every defined db cluster in sysconfig file
210 for mysqldir in $DB_CLUSTERS; do
211 mysqlstatus "$mysqldir"
212 if [ "$MYSQL_STATUS" = "running" ]; then
213 touch /var/lock/subsys/mysql
217 rm -f /var/lock/subsys/mysql
223 if [ -f /etc/mysqld.conf ]; then
224 nls "Running in \`no cluster compat' mode: can't initialize database."
225 nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)."
229 if [ -f "$clusterdir/mysqld.conf" ]; then
230 mysqlgetconfig "$clusterdir"
233 MYSQL_CLUSTER_DIR="$clusterdir"
234 MYSQL_DATA_DIR="$clusterdir/mysqldb/db"
235 MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid"
236 MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock"
239 nls "Initializing cluster %s" "$clusterdir"
241 # Check if not exist init database
242 if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
243 nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysqldb/mysql"
244 nls "before initializing database."
245 nls "For now skipping cluster %s." "$clusterdir"
249 show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
254 # Install this in the user table, too
255 hostname="`hostname --fqdn 2> /dev/null | tr -d '[:space:]'`"
256 [ -z "$hostname" ] && hostname="localhost-unknown"
258 # Check if hostname is valid
259 if [ -z "$hostname" ]; then
262 nls "Sorry, the host name is not configured."
263 nls "Please configure the 'hostname' command to return a hostname."
265 elif ! hostname -i >/dev/null 2>&1; then
268 nls "Sorry, the host '%s' could not be looked up." "$hostname"
269 nls "Please configure the 'hostname' command to return a correct hostname."
273 # Initialize variables
280 # Check for old tables
281 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/db.frm
283 # mysqld --bootstrap wants one command/line
284 c_d="$c_d CREATE TABLE db ("
285 c_d="$c_d Host char(60) DEFAULT '' NOT NULL,"
286 c_d="$c_d Db char(64) DEFAULT '' NOT NULL,"
287 c_d="$c_d User char(16) DEFAULT '' NOT NULL,"
288 c_d="$c_d Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
289 c_d="$c_d Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
290 c_d="$c_d Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
291 c_d="$c_d Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
292 c_d="$c_d Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
293 c_d="$c_d Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
294 c_d="$c_d Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
295 c_d="$c_d References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
296 c_d="$c_d Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
297 c_d="$c_d Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
298 c_d="$c_d Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
299 c_d="$c_d Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
300 c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
301 c_d="$c_d KEY User (User)"
303 c_d="$c_d comment='Database privileges';"
305 i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
306 INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');"
310 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/host.frm
312 c_h="$c_h CREATE TABLE host ("
313 c_h="$c_h Host char(60) DEFAULT '' NOT NULL,"
314 c_h="$c_h Db char(64) DEFAULT '' NOT NULL,"
315 c_h="$c_h Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
316 c_h="$c_h Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
317 c_h="$c_h Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
318 c_h="$c_h Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
319 c_h="$c_h Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
320 c_h="$c_h Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
321 c_h="$c_h Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
322 c_h="$c_h References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
323 c_h="$c_h Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
324 c_h="$c_h Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
325 c_h="$c_h Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
326 c_h="$c_h Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
327 c_h="$c_h PRIMARY KEY Host (Host,Db)"
329 c_h="$c_h comment='Host privileges; Merged with database privileges';"
332 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/user.frm
334 c_u="$c_u CREATE TABLE user ("
335 c_u="$c_u Host char(60) DEFAULT '' NOT NULL,"
336 c_u="$c_u User char(16) DEFAULT '' NOT NULL,"
337 c_u="$c_u Password char(16) DEFAULT '' NOT NULL,"
338 c_u="$c_u Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
339 c_u="$c_u Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
340 c_u="$c_u Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
341 c_u="$c_u Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
342 c_u="$c_u Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
343 c_u="$c_u Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
344 c_u="$c_u Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
345 c_u="$c_u Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
346 c_u="$c_u Process_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
347 c_u="$c_u File_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
348 c_u="$c_u Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
349 c_u="$c_u References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
350 c_u="$c_u Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
351 c_u="$c_u Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
352 c_u="$c_u Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
353 c_u="$c_u Super_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
354 c_u="$c_u Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
355 c_u="$c_u Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
356 c_u="$c_u Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
357 c_u="$c_u Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
358 c_u="$c_u Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
359 c_u="$c_u ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL,"
360 c_u="$c_u ssl_cipher BLOB NOT NULL,"
361 c_u="$c_u x509_issuer BLOB NOT NULL,"
362 c_u="$c_u x509_subject BLOB NOT NULL,"
363 c_u="$c_u max_questions int(11) unsigned DEFAULT 0 NOT NULL,"
364 c_u="$c_u max_updates int(11) unsigned DEFAULT 0 NOT NULL,"
365 c_u="$c_u max_connections int(11) unsigned DEFAULT 0 NOT NULL,"
366 c_u="$c_u PRIMARY KEY Host (Host,User)"
368 c_u="$c_u comment='Users and global privileges';"
370 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);
371 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);
373 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);
374 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);
376 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);"
379 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/func.frm
381 c_f="$c_f CREATE TABLE func ("
382 c_f="$c_f name char(64) DEFAULT '' NOT NULL,"
383 c_f="$c_f ret tinyint(1) DEFAULT '0' NOT NULL,"
384 c_f="$c_f dl char(128) DEFAULT '' NOT NULL,"
385 c_f="$c_f type enum ('function','aggregate') NOT NULL,"
386 c_f="$c_f PRIMARY KEY (name)"
388 c_f="$c_f comment='User defined functions';"
391 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/tables_priv.frm
393 c_t="$c_t CREATE TABLE tables_priv ("
394 c_t="$c_t Host char(60) DEFAULT '' NOT NULL,"
395 c_t="$c_t Db char(64) DEFAULT '' NOT NULL,"
396 c_t="$c_t User char(16) DEFAULT '' NOT NULL,"
397 c_t="$c_t Table_name char(60) DEFAULT '' NOT NULL,"
398 c_t="$c_t Grantor char(77) DEFAULT '' NOT NULL,"
399 c_t="$c_t Timestamp timestamp(14),"
400 c_t="$c_t Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL,"
401 c_t="$c_t Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
402 c_t="$c_t PRIMARY KEY (Host,Db,User,Table_name),"
403 c_t="$c_t KEY Grantor (Grantor)"
405 c_t="$c_t comment='Table privileges';"
408 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/columns_priv.frm
410 c_c="$c_c CREATE TABLE columns_priv ("
411 c_c="$c_c Host char(60) DEFAULT '' NOT NULL,"
412 c_c="$c_c Db char(60) DEFAULT '' NOT NULL,"
413 c_c="$c_c User char(16) DEFAULT '' NOT NULL,"
414 c_c="$c_c Table_name char(60) DEFAULT '' NOT NULL,"
415 c_c="$c_c Column_name char(60) DEFAULT '' NOT NULL,"
416 c_c="$c_c Timestamp timestamp(14),"
417 c_c="$c_c Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
418 c_c="$c_c PRIMARY KEY (Host,Db,User,Table_name,Column_name)"
420 c_c="$c_c comment='Column privileges';"
423 mkdir -p "$MYSQL_DATA_DIR" > /dev/null 2>&1
424 chown root:root "$MYSQL_CLUSTER_DIR"
425 chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
426 chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
428 if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
429 sed -e "s#datadir.*=.*#datadir = $MYSQL_DATA_DIR#g" \
430 -e "s#pid-file.*=.*#pid-file = $MYSQL_PIDFILE#g" \
431 -e "s#socket.*=.*#socket = $MYSQL_SOCKET#g" \
432 /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
433 chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
434 chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
437 if [ ! -e /var/lib/mysql/mysql.sock ]; then
438 ln -s "$MYSQL_SOCKET" /var/lib/mysql/mysql.sock
441 if /usr/sbin/mysqld --bootstrap --skip-grant-tables \
442 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER << END_OF_DATA
443 CREATE DATABASE mysql;
464 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
465 This is done (after starting database) with:
467 /usr/bin/mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
468 /usr/bin/mysqladmin -h $hostname -u mysql -S $MYSQL_SOCKET password 'password'
469 /usr/bin/mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
471 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
472 mysqladmin section. See the manual for more instructions.
474 IMPORTANT: The configuration file is mysqld.conf in MYSQ_DB_CLUSTERS directories.
480 Installation of grant tables FAILED!
482 Examine the logs in $MYSQL_DATA_DIR for more information. You can
483 also try to start the mysqld demon with:
485 /usr/sbin/mysqld --skip-grant &
487 You can use the command line tool /usr/bin/mysql to connect to the mysql
488 database and look at the grant tables:
490 shell> /usr/bin/mysql -u mysql mysql
493 Try 'mysqld --help' if you have problems with paths. Setting on
494 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
495 may be helpful. The latest information about MySQL is available on the
496 web at http://www.mysql.com/.
498 Please check PLD ftp site for newer versions of this package.
500 Please consult the MySQL manual section: 'Problems running
501 mysql_install_db', and the manual section that describes problems on
502 your OS. Another information source is the MySQL email archive.
503 Please check all of the above before mailing us! And if you do mail
504 us, you MUST use the /usr/bin/mysqlbug script!
513 # End of useful functions.
519 if [ ! -f $MYSQL_ERRLOG ]; then
522 chown mysql:mysql $MYSQL_ERRLOG
523 chmod 640 $MYSQL_ERRLOG
525 for mysqldir in $DB_CLUSTERS; do
526 mysqlstatus "$mysqldir"
527 if [ "$MYSQL_STATUS" = "running" ]; then
528 msg_already_running "MySQL $mysqldir"
530 mysqlstart "$mysqldir"
536 for mysqldir in $DB_CLUSTERS; do
537 mysqlstatus "$mysqldir"
538 if [ "$MYSQL_STATUS" = "not running" ]; then
539 msg_not_running "MySQL $mysqldir"
541 mysqlstop "$mysqldir"
547 for mysqldir in $DB_CLUSTERS; do
548 mysqlstatus "$mysqldir"
549 echo "MySQL cluster $mysqldir: $MYSQL_STATUS"
553 restart|force-reload)
559 for mysqldir in $DB_CLUSTERS; do
560 mysqlinit "$mysqldir"
564 for mysqldir in $DB_CLUSTERS; do
565 mysqlgetconfig "$mysqldir"
566 /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
571 msg_usage "$0 {start|stop|init|restart|force-reload|status}"