4 # mysql A very fast and reliable SQL database engine
6 # chkconfig: 2345 84 25
8 # 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 "%s can't be run." MySQL
25 if [ -n "$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=$(awk -F= '!/^#/{print $2}' /etc/mysql/clusters.conf)
31 if [ -z "$MYSQL_DB_CLUSTERS" ]; then
32 nls "Warning: there are no configured clusters."
36 nls "Warning: Missing clusters config file %s" /etc/mysql/clusters.conf
37 if [ -z "$MYSQL_DB_CLUSTERS" ]; then
38 nls "Warning: there are no configured clusters."
39 nls "Using default cluster /var/lib/mysql (compatibility mode)"
40 MYSQL_DB_CLUSTERS=/var/lib/mysql
45 # Check that networking is up
46 if is_yes "${NETWORKING}"; then
47 if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
48 msg_network_down MySQL
57 # any db cluster as command line argument?
60 # perform action for specified clusters only
62 # try auto resolving from /etc/mysql/clusters.conf
63 if [[ "$a" != /* ]]; then
64 m=$(awk -va="$a" -F= 'substr($0, 1, length(a)) == a {print $1}' /etc/mysql/clusters.conf)
66 echo >&2 "Cluster name '$a' did not match anything!"
69 if [ $(echo "$m" | wc -l) -gt 1 ]; then
70 echo >&2 "Cluster name '$a' ambiguous:" $m
73 a=$(awk -va="$a" -F= 'substr($0, 1, length(a)) == a {print $2}' /etc/mysql/clusters.conf)
75 DB_CLUSTERS="$DB_CLUSTERS $a"
78 DB_CLUSTERS="$MYSQL_DB_CLUSTERS"
81 MYSQL_ERRLOG=/var/log/mysql/err
82 MYSQL_START_WAIT_TIME=${MYSQL_START_WAIT_TIME:-15}
83 MYSQL_STOP_WAIT_TIME=${MYSQL_STOP_WAIT_TIME:-900}
90 # check for mysql status
97 # MYSQL_STATUS = starting | running | not running | died
98 # MYSQL_PID = pid of mysqld process
104 mysqlgetconfig "$clusterdir"
106 MYSQL_STATUS="not running"
111 if [ -f "$MYSQL_PIDFILE" ]; then
112 MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
115 if [ -n "$MYSQL_PIDFILE_PID" ]; then
116 MYSQL_PID=$MYSQL_PIDFILE_PID
117 if [ ! -d "/proc/$MYSQL_PID" ]; then
120 elif (grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null); then
121 MYSQL_STATUS="running"
126 if [ "$mode" = "start" ]; then
127 MYSQL_GREP_PID=$(grep -lE "^/usr/sbin/mysqld.*${MYSQL_PIDFILE}" /proc/[0-9]*/cmdline 2> /dev/null | awk -F "/" '{ print $3; exit; }')
128 if [ -n "$MYSQL_GREP_PID" ]; then
129 MYSQL_PID=$MYSQL_GREP_PID
130 if grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null; then
131 if [ -f "$MYSQL_PIDFILE" ]; then
132 MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
134 if [ -n "$MYSQL_PIDFILE_PID" ]; then
135 MYSQL_PID=$MYSQL_PIDFILE_PID
136 MYSQL_STATUS="running"
139 MYSQL_STATUS="starting"
146 # else default, "not running"
149 # get mysql configuration in variables
150 # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE
158 # emulate old behaviour if only one cluster specified
159 if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then
161 config_file=/etc/mysqld.conf
163 config=$(awk -F= -vclusterdir="$clusterdir" '!/^#/{ if (clusterdir == $2) print $1}' /etc/mysql/clusters.conf)
164 if [[ $config = /* ]]; then
165 config_file="$config"
166 elif [ -f "/etc/mysql/$config" ]; then
167 config_file="/etc/mysql/$config"
169 config_file="$clusterdir/mysqld.conf"
173 MYSQL_CLUSTER_DIR="$clusterdir"
175 if [ -z "$config_file" ]; then
176 nls "Error: Can't find config file for %s cluster" "$clusterdir"
179 MYSQL_CONFIG="$config_file"
182 if [ ! -f "$config_file" ]; then
183 nls "Error: config file %s not found" "$config_file"
184 nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?"
189 /^[ \t]*\[.*\][ \t]*$/ {
191 section=substr($0, RSTART + 1, RSTART + RLENGTH - 3)
193 section == "mysqld" && $2 ~ "=" {
194 if ($1 == "datadir") {
195 printf("MYSQL_DATA_DIR=%s;", $3)
196 } else if ($1 == "user") {
197 printf("MYSQL_USER=%s;", $3)
198 } else if ($1 == "pid-file") {
199 printf("MYSQL_PIDFILE=%s;", $3)
200 } else if ($1 == "socket") {
201 printf("MYSQL_SOCKET=%s;", $3)
207 if is_yes "$MYSQL_RA_COMPAT"; then
208 MYSQL_DATA_DIR_SUB=""
210 MYSQL_DATA_DIR_SUB="/mysqldb"
213 if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "${clusterdir}${MYSQL_DATA_DIR_SUB}/db" ]; then
214 nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db"
215 nls " MySQL can't be run."
219 if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" ]; then
220 nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid"
221 nls " MySQL can't be run."
225 if [ -z $MYSQL_USER ]; then
226 echo "$(nls 'MySQL user not configured properly')"'!' >&2
227 nls "Edit %s and configure it." "$config_file" >&2
235 mysqlgetconfig "$clusterdir"
236 if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
237 nls "MySQL cluster %s not initialized." "$clusterdir"
238 nls "Try \`%s init %s' before start." "$0" "$clusterdir"
242 msg_starting "MySQL $clusterdir"
244 [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
245 rm -f "$MYSQL_PIDFILE"
247 TMPDIR=/tmp nice -n ${SERVICE_RUN_NICE_LEVEL:-$DEFAULT_SERVICE_RUN_NICE_LEVEL} \
248 /usr/bin/setsid /usr/sbin/mysqld \
249 --defaults-file=$MYSQL_CONFIG \
250 --datadir=$MYSQL_DATA_DIR \
251 --pid-file=$MYSQL_PIDFILE $MYSQL_OPTIONS \
252 >> $MYSQL_ERRLOG 2>&1 &
256 mysqlstatus "$clusterdir" start
257 # it takes longer for mysqld to start and create pidfile if it has to recover innodb transactions
258 if [ "$MYSQL_STATUS" = "starting" ]; then
260 show "Waiting for MySQL to start"
263 # while the pid is running, mysql is starting up
264 # if the pidfile was created, it started up successfully
265 # if either case fails we break and report status
267 [ -d /proc/$pid ] || break
268 [ -f "$MYSQL_PIDFILE" ] && break
273 mysqlstatus "$clusterdir" start
274 if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
276 elif [ "$MYSQL_STATUS" = "died" ]; then
288 mysqlstatus "$clusterdir" stop
289 msg_stopping "MySQL $clusterdir"
292 # try graceful shutdown -- send shutdown command
293 # requires mysql_logrotate user proper privs
294 /usr/bin/mysqladmin --defaults-file=$MYSQL_CONFIG ${MYSQL_SOCKET:+--socket=$MYSQL_SOCKET} shutdown >/dev/null 2>&1
295 mysqlstatus "$clusterdir" stop
297 if [ "$MYSQL_PID" != "unknown" ]; then
298 kill -TERM "$MYSQL_PID" 2> /dev/null
299 for nr in $(seq 1 $(($MYSQL_STOP_WAIT_TIME*10))); do
300 [ -d "/proc/$MYSQL_PID" ] || break
305 mysqlstatus "$clusterdir" stop
306 if [ "$MYSQL_STATUS" = "died" ]; then
308 elif [ "$MYSQL_STATUS" = "running" -o "$MYSQL_STATUS" = "starting" ]; then
316 # check for running mysql instances; if any instance is running then
317 # create subsys lock file
320 # check for every defined db cluster in sysconfig file
321 for mysqldir in $DB_CLUSTERS; do
322 mysqlstatus "$mysqldir"
323 if [ "$MYSQL_STATUS" = "running" ]; then
324 touch /var/lock/subsys/mysql
328 rm -f /var/lock/subsys/mysql
334 if [ -f /etc/mysqld.conf ]; then
335 nls "Running in \`no cluster compat' mode: can't initialize database."
336 nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)."
340 if [ -f "$clusterdir/mysqld.conf" ]; then
341 mysqlgetconfig "$clusterdir"
344 MYSQL_CLUSTER_DIR="$clusterdir"
345 MYSQL_DATA_DIR="$clusterdir/mysqldb/db"
346 MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid"
347 MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock"
349 # this $MYSQL_CONFIG will be created later
350 MYSQL_CONFIG="$MYSQL_CLUSTER_DIR/mysqld.conf"
353 show "Initializing cluster %s" "$clusterdir"; echo
355 # Check if not exist init database
356 if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
357 nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysql"
358 nls "before initializing database."
359 nls "For now skipping cluster %s." "$clusterdir"
363 show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
367 # Install this in the user table, too
368 hostname="`hostname --fqdn 2> /dev/null | tr -d '[:space:]'`"
369 [ -z "$hostname" ] && hostname="localhost-unknown"
371 # Check if hostname is valid
372 if [ -z "$hostname" ]; then
375 nls "Sorry, the host name is not configured."
376 nls "Please configure the 'hostname' command to return a hostname."
378 elif ! hostname -i >/dev/null 2>&1; then
381 nls "Sorry, the host '%s' could not be looked up." "$hostname"
382 nls "Please configure the 'hostname' command to return a correct hostname."
386 mkdir -p "$MYSQL_DATA_DIR" > /dev/null 2>&1
387 # Using mysql:mysql for MYSQL_CLUSTER_DIR is creating SECURITY hole, root:root is proper
388 chown root:root "$MYSQL_CLUSTER_DIR"
389 chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
390 chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
392 if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
394 s#\(datadir.*\)=.*#\1= $MYSQL_DATA_DIR#g;
395 s#\(pid-file.*\)=.*#\1= $MYSQL_PIDFILE#g;
396 s#\(socket.*\)=.*#\1= $MYSQL_SOCKET#g;
397 s#@clusterdir@#$MYSQL_CLUSTER_DIR#g;
398 " /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
399 chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
400 chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
403 if [ ! -e /var/lib/mysql/mysql.sock ] || [ -L /var/lib/mysql/mysql.sock ] && [ -z "$(readlink /var/lib/mysql/mysql.sock)" ]; then
404 sock=${MYSQL_SOCKET#/var/lib/mysql/} # make it relative if possible
405 ln -s "$sock" /var/lib/mysql/mysql.sock
408 cat > $MYSQL_DATA_DIR/mysql-init.sql <<-EOF
409 CREATE DATABASE mysql;
411 $(cat /usr/share/mysql/mysql_system_tables.sql)
412 $(sed -e "s,@@hostname,'$hostname',g;s,'root','mysql',g" /usr/share/mysql/mysql_system_tables_data.sql)
416 /usr/sbin/mysqld --bootstrap --skip-grant-tables \
417 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER \
418 --slave-load-tmpdir=$MYSQL_DATA_DIR --tmpdir=$MYSQL_DATA_DIR < \
419 $MYSQL_DATA_DIR/mysql-init.sql 2>> /var/log/mysql/err && ok=1
420 [ -f $MYSQL_DATA_DIR/mysql/host.frm ] || ok=0
422 if [ "$ok" = 1 ]; then
423 rm -f $MYSQL_DATA_DIR/mysql-init.sql
427 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
428 This is done (after starting database; press enter when asked for password) with:
430 mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
431 mysqladmin -h $hostname -u mysql -S $MYSQL_SOCKET password 'password'
432 mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
434 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
435 mysqladmin section. See the manual for more instructions.
437 If you want to use new help tables in MySQL 4.1.x then you'll need to import the help data:
438 mysql -u mysql -p -S $MYSQL_SOCKET mysql < /usr/share/mysql/fill_help_tables.sql
444 Installation of grant tables FAILED!
446 The initialization SQL script was preserved at $MYSQL_DATA_DIR/mysql-init.sql
448 Examine the logs in /var/log/mysql for more information. You can
449 also try to start the mysqld daemon with:
451 /usr/sbin/mysqld --skip-grant &
453 You can use the command line tool mysql to connect to the mysql
454 database and look at the grant tables:
456 shell> mysql -u mysql mysql
459 Try 'mysqld --help' if you have problems with paths. Setting on
460 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
461 may be helpful. The latest information about MySQL is available on the
462 web at http://www.mysql.com/.
464 Please check PLD Linux ftp site for newer versions of this package.
466 Please consult the MySQL manual section: 'Problems running
467 mysql_install_db', and the manual section that describes problems on
468 your OS. Another information source is the MySQL email archive.
469 Please check all of the above before mailing us! And if you do mail
470 us, you MUST use the mysqlbug script!
479 # End of useful functions.
483 if [ ! -f $MYSQL_ERRLOG ]; then
486 chown mysql:mysql $MYSQL_ERRLOG
487 chmod 640 $MYSQL_ERRLOG
489 for mysqldir in $DB_CLUSTERS; do
490 mysqlstatus "$mysqldir" start
491 if [ "$MYSQL_STATUS" = "running" ]; then
492 msg_already_running "MySQL $mysqldir"
494 mysqlstart "$mysqldir"
501 for mysqldir in $DB_CLUSTERS; do
502 mysqlstatus "$mysqldir" stop
503 if [ "$MYSQL_STATUS" = "not running" ]; then
504 msg_not_running "MySQL $mysqldir"
506 mysqlstop "$mysqldir"
521 for mysqldir in $DB_CLUSTERS; do
522 mysqlstatus "$mysqldir"
523 if [ "$MYSQL_STATUS" = "running" ]; then
524 show "MySQL cluster %s, PID %s" "$mysqldir" "$MYSQL_PID"
525 progress "$MYSQL_STATUS"
527 show "MySQL cluster %s" "$mysqldir"
528 progress "$MYSQL_STATUS" "$CFAIL"
534 restart|force-reload)
539 for mysqldir in $DB_CLUSTERS; do
540 mysqlinit "$mysqldir"
545 for mysqldir in $DB_CLUSTERS; do
546 mysqlgetconfig "$mysqldir"
547 # just if mysqld is really running
548 if /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" ping >/dev/null 2>&1; then
549 /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
554 msg_usage "$0 {start|stop|init|restart|force-reload|status}"
560 # vi: shiftwidth=4 tabstop=4