Rev 154 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#!/bin/sh## mysqld This shell script takes care of starting and stopping# the MySQL subsystem (mysqld).## chkconfig: - 64 36# description: MySQL database server.# processname: mysqld# config: /etc/my.cnf# pidfile: /var/run/mysqld/mysqld.pid### BEGIN INIT INFO# Provides: mysqld# Required-Start: $local_fs $remote_fs $network $named $syslog $time# Required-Stop: $local_fs $remote_fs $network $named $syslog $time# Short-Description: start and stop MySQL server# Description: MySQL database server### END INIT INFO# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/networkexec="/usr/bin/mysqld_safe"prog="mysqld"# Set timeouts here so they can be overridden from /etc/sysconfig/mysqldSTARTTIMEOUT=120STOPTIMEOUT=60MYOPTIONS=[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$proglockfile=/var/lock/subsys/$prog# extract value of a MySQL option from config files# Usage: get_mysql_option SECTION VARNAME DEFAULT# result is returned in $result# We use my_print_defaults which prints all options from multiple files,# with the more specific ones later; hence take the last match.get_mysql_option(){result=`/usr/bin/my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1`if [ -z "$result" ]; then# not found, use defaultresult="$3"fi}get_mysql_option mysqld datadir "/var/lib/mysql"datadir="$result"get_mysql_option mysqld socket "$datadir/mysql.sock"socketfile="$result"get_mysql_option mysqld_safe log-error "/var/log/mysqld.log"errlogfile="$result"get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld.pid"mypidfile="$result"start(){[ -x $exec ] || exit 5# check to see if it's already runningRESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`if [ $? = 0 ]; then# already running, do nothingaction $"Starting $prog: " /bin/trueret=0elif echo "$RESPONSE" | grep -q "Access denied for user"then# already running, do nothingaction $"Starting $prog: " /bin/trueret=0else# prepare for starttouch "$errlogfile"chown mysql:mysql "$errlogfile"chmod 0640 "$errlogfile"[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"if [ ! -d "$datadir/mysql" ] ; then# First, make sure $datadir is there with correct permissionsif [ ! -e "$datadir" -a ! -h "$datadir" ]thenmkdir -p "$datadir" || exit 1fichown mysql:mysql "$datadir"chmod 0755 "$datadir"[ -x /sbin/restorecon ] && /sbin/restorecon "$datadir"# Now create the databaseaction $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysqlret=$?chown -R mysql:mysql "$datadir"if [ $ret -ne 0 ] ; thenreturn $retfifichown mysql:mysql "$datadir"chmod 0755 "$datadir"# If startsosif [ "$1" = "sos" ] ; thenMYOPTIONS="$MYOPTIONS --skip-grant-tables --skip-networking"fi# Pass all the options determined above, to ensure consistent behavior.# In many cases mysqld_safe would arrive at the same conclusions anyway# but we need to be sure. (An exception is that we don't force the# log-error setting, since this script doesn't really depend on that,# and some users might prefer to configure logging to syslog.)# Note: set --basedir to prevent probes that might trigger SELinux# alarms, per bug #547485$exec --datadir="$datadir" --socket="$socketfile" \--pid-file="$mypidfile" \$MYOPTIONS \--basedir=/usr --user=mysql >/dev/null 2>&1 &safe_pid=$!# Spin for a maximum of N seconds waiting for the server to come up;# exit the loop immediately if mysqld_safe process disappears.# Rather than assuming we know a valid username, accept an "access# denied" response as meaning the server is functioning.ret=0TIMEOUT="$STARTTIMEOUT"while [ $TIMEOUT -gt 0 ]; doRESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`mret=$?if [ $mret -eq 0 ]; thenbreakfi# exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected,# anything else suggests a configuration errorif [ $mret -ne 1 -a $mret -ne 11 ]; thenecho "$RESPONSE"echo "Cannot check for MySQL Daemon startup because of mysqladmin failure."ret=1breakfiecho "$RESPONSE" | grep -q "Access denied for user" && breakif ! /bin/kill -0 $safe_pid 2>/dev/null; thenecho "MySQL Daemon failed to start."ret=1breakfisleep 1let TIMEOUT=${TIMEOUT}-1doneif [ $TIMEOUT -eq 0 ]; thenecho "Timeout error occurred trying to start MySQL Daemon."ret=1fiif [ $ret -eq 0 ]; thenaction $"Starting $prog: " /bin/truetouch $lockfileelseaction $"Starting $prog: " /bin/falsefifireturn $ret}stop(){if [ ! -f "$mypidfile" ]; then# not running; per LSB standards this is "ok"action $"Stopping $prog: " /bin/truereturn 0fiMYSQLPID=`cat "$mypidfile"`if [ -n "$MYSQLPID" ]; then/bin/kill "$MYSQLPID" >/dev/null 2>&1ret=$?if [ $ret -eq 0 ]; thenTIMEOUT="$STOPTIMEOUT"while [ $TIMEOUT -gt 0 ]; do/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || breaksleep 1let TIMEOUT=${TIMEOUT}-1doneif [ $TIMEOUT -eq 0 ]; thenecho "Timeout error occurred trying to stop MySQL Daemon."ret=1action $"Stopping $prog: " /bin/falseelserm -f $lockfilerm -f "$socketfile"action $"Stopping $prog: " /bin/truefielseaction $"Stopping $prog: " /bin/falsefielse# failed to read pidfile, probably insufficient permissionsaction $"Stopping $prog: " /bin/falseret=4fireturn $ret}restart(){stopstart}condrestart(){[ -e $lockfile ] && restart || :}# See how we were called.case "$1" instart)start;;startsos)start sos;;stop)stop;;status)status $prog;;restart)restart;;condrestart|try-restart)condrestart;;reload)exit 3;;force-reload)restart;;*)echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|startsos}"exit 2esacexit $?