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 mkdir -p "$MYSQL_DATA_DIR"
351 # Using mysql:mysql for MYSQL_CLUSTER_DIR is creating SECURITY hole, root:root is proper
352 chown root:root "$MYSQL_CLUSTER_DIR"
353 chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
354 chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
356 if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
358 s#\(datadir.*\)=.*#\1= $MYSQL_DATA_DIR#g;
359 s#\(pid-file.*\)=.*#\1= $MYSQL_PIDFILE#g;
360 s#\(socket.*\)=.*#\1= $MYSQL_SOCKET#g;
361 s#@clusterdir@#$MYSQL_CLUSTER_DIR#g;
362 " /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
363 chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
364 chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
367 if [ ! -e /var/lib/mysql/mysql.sock ] || [ -L /var/lib/mysql/mysql.sock ] && [ -z "$(readlink /var/lib/mysql/mysql.sock)" ]; then
368 sock=${MYSQL_SOCKET#/var/lib/mysql/} # make it relative if possible
369 ln -s "$sock" /var/lib/mysql/mysql.sock
372 cat > $MYSQL_DATA_DIR/mysql-init.sql <<-EOF
373 CREATE DATABASE mysql;
374 $(/usr/sbin/mysql_create_system_tables real)
378 /usr/sbin/mysqld --bootstrap --skip-grant-tables \
379 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER < $MYSQL_DATA_DIR/mysql-init.sql && ok=1
380 [ -f $MYSQL_DATA_DIR/mysql/host.frm ] || ok=0
381 if [ "$ok" = 1 ]; then
382 rm -f $MYSQL_DATA_DIR/mysql-init.sql
386 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
387 This is done (after starting database; press enter when asked for password) with:
389 /usr/bin/mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
390 /usr/bin/mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
392 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
393 mysqladmin section. See the manual for more instructions.
395 If you want to use new help tables in MySQL 4.1.x then you'll need to import the help data:
396 /usr/bin/mysql -u mysql -p -S $MYSQL_SOCKET mysql < /usr/share/mysql/fill_help_tables.sql
402 Installation of grant tables FAILED!
404 The initialization SQL script was preserved at $MYSQL_DATA_DIR/mysql-init.sql
406 Examine the logs in /var/log/mysql for more information. You can
407 also try to start the mysqld daemon with:
409 /usr/sbin/mysqld --skip-grant &
411 You can use the command line tool /usr/bin/mysql to connect to the mysql
412 database and look at the grant tables:
414 shell> /usr/bin/mysql -u mysql mysql
417 Try 'mysqld --help' if you have problems with paths. Setting on
418 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
419 may be helpful. The latest information about MySQL is available on the
420 web at http://www.mysql.com/.
422 Please check PLD Linux ftp site for newer versions of this package.
424 Please consult the MySQL manual section: 'Problems running
425 mysql_install_db', and the manual section that describes problems on
426 your OS. Another information source is the MySQL email archive.
427 Please check all of the above before mailing us! And if you do mail
428 us, you MUST use the /usr/bin/mysqlbug script!
437 # End of useful functions.
441 if [ ! -f $MYSQL_ERRLOG ]; then
444 chown mysql:mysql $MYSQL_ERRLOG
445 chmod 640 $MYSQL_ERRLOG
447 for mysqldir in $DB_CLUSTERS; do
448 mysqlstatus "$mysqldir" start
449 if [ "$MYSQL_STATUS" = "running" ]; then
450 msg_already_running "MySQL $mysqldir"
452 mysqlstart "$mysqldir"
459 for mysqldir in $DB_CLUSTERS; do
460 mysqlstatus "$mysqldir" stop
461 if [ "$MYSQL_STATUS" = "not running" ]; then
462 msg_not_running "MySQL $mysqldir"
464 mysqlstop "$mysqldir"
479 for mysqldir in $DB_CLUSTERS; do
480 mysqlstatus "$mysqldir"
481 if [ "$MYSQL_STATUS" = "running" ]; then
482 show "MySQL cluster %s, PID %s" "$mysqldir" "$MYSQL_PID"
483 progress "$MYSQL_STATUS"
485 show "MySQL cluster %s" "$mysqldir"
486 progress "$MYSQL_STATUS" "$CFAIL"
492 restart|force-reload)
497 for mysqldir in $DB_CLUSTERS; do
498 mysqlinit "$mysqldir"
503 for mysqldir in $DB_CLUSTERS; do
504 mysqlgetconfig "$mysqldir"
505 # just if mysqld is really running
506 if /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" ping >/dev/null 2>&1; then
507 /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
512 msg_usage "$0 {start|stop|init|restart|force-reload|status}"
518 # vi: shiftwidth=4 tabstop=4