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.
9 # Source function library
10 . /etc/rc.d/init.d/functions
13 . /etc/sysconfig/network
16 if [ -f /etc/sysconfig/mysql ]; then
17 . /etc/sysconfig/mysql
19 nls "Error: %s not found" /etc/sysconfig/mysql
20 nls "%s can't be run." MySQL
24 if [ -n "$MYSQL_DB_CLUSTERS" ]; then
25 nls "Warning: MYSQL_DB_CLUSTERS is set. It's obsolete. Use %s instead." /etc/mysql/clusters.conf
28 if [ -f /etc/mysql/clusters.conf ]; then
29 MYSQL_DB_CLUSTERS=$(awk -F= '!/^#/{print $2}' /etc/mysql/clusters.conf)
30 if [ -z "$MYSQL_DB_CLUSTERS" ]; then
31 nls "Warning: there are no configured clusters."
35 nls "Warning: Missing clusters config file %s" /etc/mysql/clusters.conf
36 if [ -z "$MYSQL_DB_CLUSTERS" ]; then
37 nls "Warning: there are no configured clusters."
38 nls "Using default cluster /var/lib/mysql (compatibility mode)"
39 MYSQL_DB_CLUSTERS=/var/lib/mysql
44 # Check that networking is up
45 if is_yes "${NETWORKING}"; then
46 if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
47 msg_network_down MySQL
56 # any db cluster as command line argument?
59 # perform action for specified clusters only
61 # try auto resolving from /etc/mysql/clusters.conf
62 if [[ "$a" != /* ]]; then
63 m=$(awk -va="$a" -F= 'substr($0, 1, length(a)) == a {print $1}' /etc/mysql/clusters.conf)
65 echo >&2 "Cluster name '$a' did not match anything!"
68 if [ $(echo "$m" | wc -l) -gt 1 ]; then
69 echo >&2 "Cluster name '$a' ambiguous:" $m
72 a=$(awk -va="$a" -F= 'substr($0, 1, length(a)) == a {print $2}' /etc/mysql/clusters.conf)
74 DB_CLUSTERS="$DB_CLUSTERS $a"
77 DB_CLUSTERS="$MYSQL_DB_CLUSTERS"
80 MYSQL_ERRLOG=/var/log/mysql/err
81 MYSQL_START_WAIT_TIME=${MYSQL_START_WAIT_TIME:-15}
82 MYSQL_STOP_WAIT_TIME=${MYSQL_STOP_WAIT_TIME:-900}
89 # check for mysql status
96 # MYSQL_STATUS = starting | running | not running | died
97 # MYSQL_PID = pid of mysqld process
103 mysqlgetconfig "$clusterdir"
105 MYSQL_STATUS="not running"
110 if [ -f "$MYSQL_PIDFILE" ]; then
111 MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
114 if [ -n "$MYSQL_PIDFILE_PID" ]; then
115 MYSQL_PID=$MYSQL_PIDFILE_PID
116 if [ ! -d "/proc/$MYSQL_PID" ]; then
119 elif (grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null); then
120 MYSQL_STATUS="running"
125 if [ "$mode" = "start" ]; then
126 MYSQL_GREP_PID=$(grep -lE "^/usr/sbin/mysqld.*${MYSQL_PIDFILE}" /proc/[0-9]*/cmdline 2> /dev/null | awk -F "/" '{ print $3; exit; }')
127 if [ -n "$MYSQL_GREP_PID" ]; then
128 MYSQL_PID=$MYSQL_GREP_PID
129 if grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null; then
130 if [ -f "$MYSQL_PIDFILE" ]; then
131 MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
133 if [ -n "$MYSQL_PIDFILE_PID" ]; then
134 MYSQL_PID=$MYSQL_PIDFILE_PID
135 MYSQL_STATUS="running"
138 MYSQL_STATUS="starting"
145 # else default, "not running"
148 # get mysql configuration in variables
149 # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE
157 # emulate old behaviour if only one cluster specified
158 if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then
160 config_file=/etc/mysqld.conf
162 config=$(awk -F= -vclusterdir="$clusterdir" '!/^#/{ if (clusterdir == $2) print $1}' /etc/mysql/clusters.conf)
163 if [[ $config = /* ]]; then
164 config_file="$config"
165 elif [ -f "/etc/mysql/$config" ]; then
166 config_file="/etc/mysql/$config"
168 config_file="$clusterdir/mysqld.conf"
172 MYSQL_CLUSTER_DIR="$clusterdir"
174 if [ -z "$config_file" ]; then
175 nls "Error: Can't find config file for %s cluster" "$clusterdir"
178 MYSQL_CONFIG="$config_file"
181 if [ ! -f "$config_file" ]; then
182 nls "Error: config file %s not found" "$config_file"
183 nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?"
188 /^[ \t]*\[.*\][ \t]*$/ {
190 section=substr($0, RSTART + 1, RSTART + RLENGTH - 3)
192 section == "mysqld" && $2 ~ "=" {
193 if ($1 == "datadir") {
194 printf("MYSQL_DATA_DIR=%s;", $3)
195 } else if ($1 == "user") {
196 printf("MYSQL_USER=%s;", $3)
197 } else if ($1 == "pid-file") {
198 printf("MYSQL_PIDFILE=%s;", $3)
199 } else if ($1 == "socket") {
200 printf("MYSQL_SOCKET=%s;", $3)
206 if is_yes "$MYSQL_RA_COMPAT"; then
207 MYSQL_DATA_DIR_SUB=""
209 MYSQL_DATA_DIR_SUB="/mysqldb"
212 if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "${clusterdir}${MYSQL_DATA_DIR_SUB}/db" ]; then
213 nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db"
214 nls " MySQL can't be run."
218 if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" ]; then
219 nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid"
220 nls " MySQL can't be run."
224 if [ -z $MYSQL_USER ]; then
225 echo "$(nls 'MySQL user not configured properly')"'!' >&2
226 nls "Edit %s and configure it." "$config_file" >&2
234 mysqlgetconfig "$clusterdir"
235 if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
236 nls "MySQL cluster %s not initialized." "$clusterdir"
237 nls "Try \`%s init %s' before start." "$0" "$clusterdir"
241 msg_starting "MySQL $clusterdir"
243 [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
244 rm -f "$MYSQL_PIDFILE"
245 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_OPTIONS >> $MYSQL_ERRLOG 2>&1 &
247 mysqlstatus "$clusterdir" start
248 # it takes longer for mysqld to start and create pidfile if it has to recover innodb transactions
249 if [ "$MYSQL_STATUS" = "starting" ]; then
250 for nr in $(seq 1 $(($MYSQL_START_WAIT_TIME*10))); do
251 [ -f "$MYSQL_PIDFILE" ] && break
256 mysqlstatus "$clusterdir" start
257 if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
259 elif [ "$MYSQL_STATUS" = "died" ]; then
271 mysqlstatus "$clusterdir" stop
272 msg_stopping "MySQL $clusterdir"
275 # try graceful shutdown -- send shutdown command
276 # requires mysql_logrotate user proper privs
277 /usr/bin/mysqladmin --defaults-file=$MYSQL_CONFIG ${MYSQL_SOCKET:+--socket=$MYSQL_SOCKET} shutdown >/dev/null 2>&1
278 mysqlstatus "$clusterdir" stop
280 if [ "$MYSQL_PID" != "unknown" ]; then
281 kill -TERM "$MYSQL_PID" 2> /dev/null
282 for nr in $(seq 1 $(($MYSQL_STOP_WAIT_TIME*10))); do
283 [ -d "/proc/$MYSQL_PID" ] || break
288 mysqlstatus "$clusterdir" stop
289 if [ "$MYSQL_STATUS" = "died" ]; then
291 elif [ "$MYSQL_STATUS" = "running" -o "$MYSQL_STATUS" = "starting" ]; then
299 # check for running mysql instances; if any instance is running then
300 # create subsys lock file
303 # check for every defined db cluster in sysconfig file
304 for mysqldir in $DB_CLUSTERS; do
305 mysqlstatus "$mysqldir"
306 if [ "$MYSQL_STATUS" = "running" ]; then
307 touch /var/lock/subsys/mysql
311 rm -f /var/lock/subsys/mysql
317 if [ -f /etc/mysqld.conf ]; then
318 nls "Running in \`no cluster compat' mode: can't initialize database."
319 nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)."
323 if [ -f "$clusterdir/mysqld.conf" ]; then
324 mysqlgetconfig "$clusterdir"
327 MYSQL_CLUSTER_DIR="$clusterdir"
328 MYSQL_DATA_DIR="$clusterdir/mysqldb/db"
329 MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid"
330 MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock"
332 # this $MYSQL_CONFIG will be created later
333 MYSQL_CONFIG="$MYSQL_CLUSTER_DIR/mysqld.conf"
336 nls "Initializing cluster %s" "$clusterdir"
338 # Check if not exist init database
339 if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
340 nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysql"
341 nls "before initializing database."
342 nls "For now skipping cluster %s." "$clusterdir"
346 show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
350 # Install this in the user table, too
351 hostname="`hostname --fqdn 2> /dev/null | tr -d '[:space:]'`"
352 [ -z "$hostname" ] && hostname="localhost-unknown"
354 # Check if hostname is valid
355 if [ -z "$hostname" ]; then
358 nls "Sorry, the host name is not configured."
359 nls "Please configure the 'hostname' command to return a hostname."
361 elif ! hostname -i >/dev/null 2>&1; then
364 nls "Sorry, the host '%s' could not be looked up." "$hostname"
365 nls "Please configure the 'hostname' command to return a correct hostname."
369 mkdir -p "$MYSQL_DATA_DIR"
370 # Using mysql:mysql for MYSQL_CLUSTER_DIR is creating SECURITY hole, root:root is proper
371 chown root:root "$MYSQL_CLUSTER_DIR"
372 chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
373 chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
375 if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
377 s#\(datadir.*\)=.*#\1= $MYSQL_DATA_DIR#g;
378 s#\(pid-file.*\)=.*#\1= $MYSQL_PIDFILE#g;
379 s#\(socket.*\)=.*#\1= $MYSQL_SOCKET#g;
380 s#@clusterdir@#$MYSQL_CLUSTER_DIR#g;
381 " /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
382 chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
383 chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
386 if [ ! -e /var/lib/mysql/mysql.sock ] || [ -L /var/lib/mysql/mysql.sock ] && [ -z "$(readlink /var/lib/mysql/mysql.sock)" ]; then
387 sock=${MYSQL_SOCKET#/var/lib/mysql/} # make it relative if possible
388 ln -s "$sock" /var/lib/mysql/mysql.sock
391 cat > $MYSQL_DATA_DIR/mysql-init.sql <<-EOF
392 CREATE DATABASE mysql;
393 $(/usr/sbin/mysql_create_system_tables real $MYSQL_DATA_DIR/mysql "$hostname")
397 /usr/sbin/mysqld --bootstrap --skip-grant-tables \
398 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER < $MYSQL_DATA_DIR/mysql-init.sql && ok=1
399 [ -f $MYSQL_DATA_DIR/mysql/host.frm ] || ok=0
400 if [ "$ok" = 1 ]; then
401 rm -f $MYSQL_DATA_DIR/mysql-init.sql
405 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
406 This is done (after starting database; press enter when asked for password) with:
408 /usr/bin/mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
409 /usr/bin/mysqladmin -h $hostname -u mysql -S $MYSQL_SOCKET password 'password'
410 /usr/bin/mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
412 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
413 mysqladmin section. See the manual for more instructions.
415 If you want to use new help tables in MySQL 4.1.x then you'll need to import the help data:
416 /usr/bin/mysql -u mysql -p -S $MYSQL_SOCKET mysql < /usr/share/mysql/fill_help_tables.sql
422 Installation of grant tables FAILED!
424 The initialization SQL script was preserved at $MYSQL_DATA_DIR/mysql-init.sql
426 Examine the logs in /var/log/mysql for more information. You can
427 also try to start the mysqld daemon with:
429 /usr/sbin/mysqld --skip-grant &
431 You can use the command line tool /usr/bin/mysql to connect to the mysql
432 database and look at the grant tables:
434 shell> /usr/bin/mysql -u mysql mysql
437 Try 'mysqld --help' if you have problems with paths. Setting on
438 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
439 may be helpful. The latest information about MySQL is available on the
440 web at http://www.mysql.com/.
442 Please check PLD Linux ftp site for newer versions of this package.
444 Please consult the MySQL manual section: 'Problems running
445 mysql_install_db', and the manual section that describes problems on
446 your OS. Another information source is the MySQL email archive.
447 Please check all of the above before mailing us! And if you do mail
448 us, you MUST use the /usr/bin/mysqlbug script!
457 # End of useful functions.
461 if [ ! -f $MYSQL_ERRLOG ]; then
464 chown mysql:mysql $MYSQL_ERRLOG
465 chmod 640 $MYSQL_ERRLOG
467 for mysqldir in $DB_CLUSTERS; do
468 mysqlstatus "$mysqldir" start
469 if [ "$MYSQL_STATUS" = "running" ]; then
470 msg_already_running "MySQL $mysqldir"
472 mysqlstart "$mysqldir"
479 for mysqldir in $DB_CLUSTERS; do
480 mysqlstatus "$mysqldir" stop
481 if [ "$MYSQL_STATUS" = "not running" ]; then
482 msg_not_running "MySQL $mysqldir"
484 mysqlstop "$mysqldir"
499 for mysqldir in $DB_CLUSTERS; do
500 mysqlstatus "$mysqldir"
501 if [ "$MYSQL_STATUS" = "running" ]; then
502 show "MySQL cluster %s, PID %s" "$mysqldir" "$MYSQL_PID"
503 progress "$MYSQL_STATUS"
505 show "MySQL cluster %s" "$mysqldir"
506 progress "$MYSQL_STATUS" "$CFAIL"
512 restart|force-reload)
517 for mysqldir in $DB_CLUSTERS; do
518 mysqlinit "$mysqldir"
523 for mysqldir in $DB_CLUSTERS; do
524 mysqlgetconfig "$mysqldir"
525 # just if mysqld is really running
526 if /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" ping >/dev/null 2>&1; then
527 /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
532 msg_usage "$0 {start|stop|init|restart|force-reload|status}"
538 # vi: shiftwidth=4 tabstop=4