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 [ -z "$BASE_TABLETYPE" ] && BASE_TABLETYPE="MyISAM"
26 if [ -n "$MYSQL_DB_CLUSTERS" ]; then
27 nls "Warning: MYSQL_DB_CLUSTERS is set. It's obsolete. Use %s instead." /etc/mysql/clusters.conf
30 if [ -f /etc/mysql/clusters.conf ]; then
31 MYSQL_DB_CLUSTERS=$(awk -F= '!/^#/{print $2}' /etc/mysql/clusters.conf)
32 if [ -z "$MYSQL_DB_CLUSTERS" ]; then
33 nls "Warning: there are no configured clusters."
37 nls "Warning: Missing clusters config file %s" /etc/mysql/clusters.conf
38 if [ -z "$MYSQL_DB_CLUSTERS" ]; then
39 nls "Warning: there are no configured clusters."
40 nls "Using default cluster /var/lib/mysql (compatibility mode)"
41 MYSQL_DB_CLUSTERS=/var/lib/mysql
46 # Check that networking is up
47 if is_yes "${NETWORKING}"; then
48 if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
49 msg_network_down MySQL
58 # any db cluster as command line argument?
61 # perform action for specified clusters only
63 # try auto resolving from /etc/mysql/clusters.conf
64 if [[ "$a" != /* ]]; then
65 m=$(awk -va="$a" -F= 'substr($0, 1, length(a)) == a {print $1}' /etc/mysql/clusters.conf)
67 echo >&2 "Cluster name '$a' did not match anything!"
70 if [ $(echo "$m" | wc -l) -gt 1 ]; then
71 echo >&2 "Cluster name '$a' ambiguous:" $m
74 a=$(awk -va="$a" -F= 'substr($0, 1, length(a)) == a {print $2}' /etc/mysql/clusters.conf)
76 DB_CLUSTERS="$DB_CLUSTERS $a"
79 DB_CLUSTERS="$MYSQL_DB_CLUSTERS"
82 MYSQL_ERRLOG=/var/log/mysql/err
83 MYSQL_START_WAIT_TIME=${MYSQL_START_WAIT_TIME:-15}
84 MYSQL_STOP_WAIT_TIME=${MYSQL_STOP_WAIT_TIME:-900}
91 # check for mysql status
98 # MYSQL_STATUS = starting | running | not running | died
99 # MYSQL_PID = pid of mysqld process
105 mysqlgetconfig "$clusterdir"
107 MYSQL_STATUS="not running"
112 if [ -f "$MYSQL_PIDFILE" ]; then
113 MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
116 if [ -n "$MYSQL_PIDFILE_PID" ]; then
117 MYSQL_PID=$MYSQL_PIDFILE_PID
118 if [ ! -d "/proc/$MYSQL_PID" ]; then
121 elif (grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null); then
122 MYSQL_STATUS="running"
127 if [ "$mode" = "start" ]; then
128 MYSQL_GREP_PID=$(grep -lE "^/usr/sbin/mysqld.*${MYSQL_PIDFILE}" /proc/[0-9]*/cmdline 2> /dev/null | awk -F "/" '{ print $3; exit; }')
129 if [ -n "$MYSQL_GREP_PID" ]; then
130 MYSQL_PID=$MYSQL_GREP_PID
131 if grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null; then
132 if [ -f "$MYSQL_PIDFILE" ]; then
133 MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
135 if [ -n "$MYSQL_PIDFILE_PID" ]; then
136 MYSQL_PID=$MYSQL_PIDFILE_PID
137 MYSQL_STATUS="running"
140 MYSQL_STATUS="starting"
147 # else default, "not running"
150 # get mysql configuration in variables
151 # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE
159 # emulate old behaviour if only one cluster specified
160 if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then
162 config_file=/etc/mysqld.conf
164 config=$(awk -F= -vclusterdir="$clusterdir" '!/^#/{ if (clusterdir == $2) print $1}' /etc/mysql/clusters.conf)
165 if [[ $config = /* ]]; then
166 config_file="$config"
167 elif [ -f "/etc/mysql/$config" ]; then
168 config_file="/etc/mysql/$config"
170 config_file="$clusterdir/mysqld.conf"
174 MYSQL_CLUSTER_DIR="$clusterdir"
176 if [ -z "$config_file" ]; then
177 nls "Error: Can't find config file for %s cluster" "$clusterdir"
180 MYSQL_CONFIG="$config_file"
183 if [ ! -f "$config_file" ]; then
184 nls "Error: config file %s not found" "$config_file"
185 nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?"
190 /^[ \t]*\[.*\][ \t]*$/ {
192 section=substr($0, RSTART + 1, RSTART + RLENGTH - 3)
194 section == "mysqld" && $2 ~ "=" {
195 if ($1 == "datadir") {
196 printf("MYSQL_DATA_DIR=%s;", $3)
197 } else if ($1 == "user") {
198 printf("MYSQL_USER=%s;", $3)
199 } else if ($1 == "pid-file") {
200 printf("MYSQL_PIDFILE=%s;", $3)
201 } else if ($1 == "socket") {
202 printf("MYSQL_SOCKET=%s;", $3)
208 if is_yes "$MYSQL_RA_COMPAT"; then
209 MYSQL_DATA_DIR_SUB=""
211 MYSQL_DATA_DIR_SUB="/mysqldb"
214 if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "${clusterdir}${MYSQL_DATA_DIR_SUB}/db" ]; then
215 nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db"
216 nls " MySQL can't be run."
220 if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" ]; then
221 nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid"
222 nls " MySQL can't be run."
226 if [ -z $MYSQL_USER ]; then
227 echo "$(nls 'MySQL user not configured properly')"'!' >&2
228 nls "Edit %s and configure it." "$config_file" >&2
236 mysqlgetconfig "$clusterdir"
237 if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
238 nls "MySQL cluster %s not initialized." "$clusterdir"
239 nls "Try \`%s init %s' before start." "$0" "$clusterdir"
243 msg_starting "MySQL $clusterdir"
245 [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
246 rm -f "$MYSQL_PIDFILE"
247 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 &
249 mysqlstatus "$clusterdir" start
250 # it takes longer for mysqld to start and create pidfile if it has to recover innodb transactions
251 if [ "$MYSQL_STATUS" = "starting" ]; then
252 for nr in $(seq 1 $(($MYSQL_START_WAIT_TIME*10))); do
253 [ -f "$MYSQL_PIDFILE" ] && break
258 mysqlstatus "$clusterdir" start
259 if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
261 elif [ "$MYSQL_STATUS" = "died" ]; then
273 mysqlstatus "$clusterdir" stop
274 msg_stopping "MySQL $clusterdir"
277 # try graceful shutdown -- send shutdown command
278 # requires mysql_logrotate user proper privs
279 /usr/bin/mysqladmin --defaults-file=$MYSQL_CONFIG ${MYSQL_SOCKET:+--socket=$MYSQL_SOCKET} shutdown >/dev/null 2>&1
280 mysqlstatus "$clusterdir" stop
282 if [ "$MYSQL_PID" != "unknown" ]; then
283 kill -TERM "$MYSQL_PID" 2> /dev/null
284 for nr in $(seq 1 $(($MYSQL_STOP_WAIT_TIME*10))); do
285 [ -d "/proc/$MYSQL_PID" ] || break
290 mysqlstatus "$clusterdir" stop
291 if [ "$MYSQL_STATUS" = "died" ]; then
293 elif [ "$MYSQL_STATUS" = "running" -o "$MYSQL_STATUS" = "starting" ]; then
301 # check for running mysql instances; if any instance is running then
302 # create subsys lock file
305 # check for every defined db cluster in sysconfig file
306 for mysqldir in $DB_CLUSTERS; do
307 mysqlstatus "$mysqldir"
308 if [ "$MYSQL_STATUS" = "running" ]; then
309 touch /var/lock/subsys/mysql
313 rm -f /var/lock/subsys/mysql
319 if [ -f /etc/mysqld.conf ]; then
320 nls "Running in \`no cluster compat' mode: can't initialize database."
321 nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)."
325 if [ -f "$clusterdir/mysqld.conf" ]; then
326 mysqlgetconfig "$clusterdir"
329 MYSQL_CLUSTER_DIR="$clusterdir"
330 MYSQL_DATA_DIR="$clusterdir/mysqldb/db"
331 MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid"
332 MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock"
334 # this $MYSQL_CONFIG will be created later
335 MYSQL_CONFIG="$MYSQL_CLUSTER_DIR/mysqld.conf"
338 nls "Initializing cluster %s" "$clusterdir"
340 # Check if not exist init database
341 if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
342 nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysql"
343 nls "before initializing database."
344 nls "For now skipping cluster %s." "$clusterdir"
348 show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
352 # Install this in the user table, too
353 hostname="`hostname --fqdn 2> /dev/null | tr -d '[:space:]'`"
354 [ -z "$hostname" ] && hostname="localhost-unknown"
356 # Check if hostname is valid
357 if [ -z "$hostname" ]; then
360 nls "Sorry, the host name is not configured."
361 nls "Please configure the 'hostname' command to return a hostname."
363 elif ! hostname -i >/dev/null 2>&1; then
366 nls "Sorry, the host '%s' could not be looked up." "$hostname"
367 nls "Please configure the 'hostname' command to return a correct hostname."
371 mkdir -p "$MYSQL_DATA_DIR"
372 # Using mysql:mysql for MYSQL_CLUSTER_DIR is creating SECURITY hole, root:root is proper
373 chown root:root "$MYSQL_CLUSTER_DIR"
374 chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
375 chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
377 if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
379 s#\(datadir.*\)=.*#\1= $MYSQL_DATA_DIR#g;
380 s#\(pid-file.*\)=.*#\1= $MYSQL_PIDFILE#g;
381 s#\(socket.*\)=.*#\1= $MYSQL_SOCKET#g;
382 s#@clusterdir@#$MYSQL_CLUSTER_DIR#g;
383 " /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
384 chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
385 chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
388 if [ ! -e /var/lib/mysql/mysql.sock ] || [ -L /var/lib/mysql/mysql.sock ] && [ -z "$(readlink /var/lib/mysql/mysql.sock)" ]; then
389 sock=${MYSQL_SOCKET#/var/lib/mysql/} # make it relative if possible
390 ln -s "$sock" /var/lib/mysql/mysql.sock
393 cat > $MYSQL_DATA_DIR/mysql-init.sql <<-EOF
394 CREATE DATABASE mysql;
396 $(sed -e "s,@ENGINE@,$BASE_TABLETYPE," /usr/share/mysql/init_db.sql)
397 $(sed -e "s,\$hostname,$hostname,g" /usr/share/mysql/init_db-data.sql)
402 /usr/sbin/mysqld --bootstrap --skip-grant-tables \
403 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER < $MYSQL_DATA_DIR/mysql-init.sql && ok=1
404 [ -f $MYSQL_DATA_DIR/mysql/user.frm ] || ok=0
405 if [ "$ok" = 1 ]; then
406 rm -f $MYSQL_DATA_DIR/mysql-init.sql
410 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
411 This is done (after starting database; press enter when asked for password) with:
413 /usr/bin/mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
414 /usr/bin/mysqladmin -h $hostname -u mysql -S $MYSQL_SOCKET password 'password'
415 /usr/bin/mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
417 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
418 mysqladmin section. See the manual for more instructions.
420 If you want to use new help tables in MySQL 4.1.x then you'll need to import the help data:
421 /usr/bin/mysql -u mysql -p -S $MYSQL_SOCKET mysql < /usr/share/mysql/fill_help_tables.sql
427 Installation of grant tables FAILED!
429 Examine the logs in /var/log/mysql for more information. You can
430 also try to start the mysqld daemon with:
432 /usr/sbin/mysqld --skip-grant &
434 You can use the command line tool /usr/bin/mysql to connect to the mysql
435 database and look at the grant tables:
437 shell> /usr/bin/mysql -u mysql mysql
440 Try 'mysqld --help' if you have problems with paths. Setting on
441 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
442 may be helpful. The latest information about MySQL is available on the
443 web at http://www.mysql.com/.
445 Please check PLD Linux ftp site for newer versions of this package.
447 Please consult the MySQL manual section: 'Problems running
448 mysql_install_db', and the manual section that describes problems on
449 your OS. Another information source is the MySQL email archive.
450 Please check all of the above before mailing us! And if you do mail
451 us, you MUST use the /usr/bin/mysqlbug script!
460 # End of useful functions.
464 if [ ! -f $MYSQL_ERRLOG ]; then
467 chown mysql:mysql $MYSQL_ERRLOG
468 chmod 640 $MYSQL_ERRLOG
470 for mysqldir in $DB_CLUSTERS; do
471 mysqlstatus "$mysqldir" start
472 if [ "$MYSQL_STATUS" = "running" ]; then
473 msg_already_running "MySQL $mysqldir"
475 mysqlstart "$mysqldir"
482 for mysqldir in $DB_CLUSTERS; do
483 mysqlstatus "$mysqldir" stop
484 if [ "$MYSQL_STATUS" = "not running" ]; then
485 msg_not_running "MySQL $mysqldir"
487 mysqlstop "$mysqldir"
502 for mysqldir in $DB_CLUSTERS; do
503 mysqlstatus "$mysqldir"
504 if [ "$MYSQL_STATUS" = "running" ]; then
505 show "MySQL cluster %s, PID %s" "$mysqldir" "$MYSQL_PID"
506 progress "$MYSQL_STATUS"
508 show "MySQL cluster %s" "$mysqldir"
509 progress "$MYSQL_STATUS" "$CFAIL"
515 restart|force-reload)
520 for mysqldir in $DB_CLUSTERS; do
521 mysqlinit "$mysqldir"
526 for mysqldir in $DB_CLUSTERS; do
527 mysqlgetconfig "$mysqldir"
528 # just if mysqld is really running
529 if /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" ping >/dev/null 2>&1; then
530 /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
535 msg_usage "$0 {start|stop|init|restart|force-reload|status}"
541 # vi: shiftwidth=4 tabstop=4