匿名通过本文主要向大家介绍了MySQL,时报,启动等相关知识,希望本文的分享对您有所帮助
  
  
					本文主要介绍了MySQL启动时报“The server quit without updating PID file”错误的原因,需要的朋友可以参考下,希望能帮助到大家。
 
 
 
 
 很多童鞋在启动mysql的时候,碰到过这个错误,
首先,澄清一点,出现这个错误的前提是:通过服务脚本来启动mysql。通过mysqld_safe或mysqld启动mysql实例并不会报这个错误。
那么,出现这个错误的原因具体是什么呢?
哈哈,对分析过程不care的童鞋可直接跳到文末的总结部分~
总结
下面,来分析下mysql的服务启动脚本
脚本完整内容如下:
#!/bin/sh
# Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
# This file is public domain and comes with NO WARRANTY of any kind
# MySQL daemon start/stop script.
# Usually this is put in /etc/init.d (at least on machines SYSV R4 based
# systems) and linked to /etc/rc3.d/S99mysql and /etc/rc0.d/K01mysql.
# When this is done the mysql server will be started when the machine is
# started and shut down when the systems goes down.
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 64 36
# description: A very fast and reliable SQL database engine.
# Comments to support LSB init script conventions
### BEGIN INIT INFO
# Provides: mysql
# Required-Start: $local_fs $network $remote_fs
# Should-Start: ypbind nscd ldap ntpd xntpd
# Required-Stop: $local_fs $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop MySQL
# Description: MySQL is a very fast and reliable SQL database engine.
### END INIT INFO
# If you install MySQL on some other places than /usr/local/mysql, then you
# have to do one of the following things for this script to work:
#
# - Run this script from within the MySQL installation directory
# - Create a /etc/my.cnf file with the following information:
# [mysqld]
# basedir=<path-to-mysql-installation-directory>
# - Add the above to any other configuration file (for example ~/.my.ini)
# and copy my_print_defaults to /usr/bin
# - Add the path to the mysql-installation-directory to the basedir variable
# below.
#
# If you want to affect other MySQL variables, you should make your changes
# in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files.
# If you change base dir, you must also change datadir. These may get
# overwritten by settings in the MySQL configuration files.
basedir=
datadir=
# Default value, in seconds, afterwhich the script should timeout waiting
# for server start. 
# Value here is overriden by value in my.cnf. 
# 0 means don't wait at all
# Negative numbers mean to wait indefinitely
service_startup_timeout=900
# Lock directory for RedHat / SuSE.
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/mysql"
# The following variables are only set for letting mysql.server find things.
# Set some defaults
mysqld_pid_file_path=
if test -z "$basedir"
then
 basedir=/usr/local/mysql
 bindir=/usr/local/mysql/bin
 if test -z "$datadir"
 then
 datadir=/usr/local/mysql/data
 fi
 sbindir=/usr/local/mysql/bin
 libexecdir=/usr/local/mysql/bin
else
 bindir="$basedir/bin"
 if test -z "$datadir"
 then
 datadir="$basedir/data"
 fi
 sbindir="$basedir/sbin"
 libexecdir="$basedir/libexec"
fi
# datadir_set is used to determine if datadir was set (and so should be
# *not* set inside of the --basedir= handler.)
datadir_set=
#
# Use LSB init script functions for printing messages, if possible
#
lsb_functions="/lib/lsb/init-functions"
if test -f $lsb_functions ; then
 . $lsb_functions
else
 log_success_msg()
 {
 echo " SUCCESS! $@"
 }
 log_failure_msg()
 {
 echo " ERROR! $@"
 }
fi
PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin"
export PATH
mode=$1 # start or stop
[ $# -ge 1 ] && shift
other_args="$*" # uncommon, but needed when called from an RPM upgrade action
   # Expected: "--skip-networking --skip-grant-tables"
   # They are not checked here, intentionally, as it is the resposibility
   # of the "spec" file author to give correct arguments only.
case `echo "testing\c"`,`echo -n testing` in
 *c*,-n*) echo_n= echo_c=  ;;
 *c*,*) echo_n=-n echo_c=  ;;
 *)  echo_n= echo_c='\c' ;;
esac
parse_server_arguments() {
 for arg do
 case "$arg" in
  --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'`
     bindir="$basedir/bin"
   if test -z "$datadir_set"; then
    datadir="$basedir/data"
   fi
   sbindir="$basedir/sbin"
   libexecdir="$basedir/libexec"
  ;;
  --datadir=*) datadir=`echo "$arg" | sed -e 's/^[^=]*=//'`
   datadir_set=1
 ;;
  --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
  --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
 esac
 done
}
wait_for_pid () {
 verb="$1"   # created | removed
 pid="$2"   # process ID of the program operating on the pid-file
 pid_file_path="$3" # path to the PID file.
 i=0
 avoid_race_condition="by checking again"
 while test $i -ne $service_startup_timeout ; do
 case "$verb" in
  'created')
  # wait for a PID-file to pop into existence.
  test -s "$pid_file_path" && i='' && break
  ;;
  'removed')
  # wait for this PID-file to disappear
  test ! -s "$pid_file_path" && i='' && break
  ;;
  *)
  echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
  exit 1
  ;;
 esac
 # if server isn't running, then pid-file will never be updated
 if test -n "$pid"; then
  if kill -0 "$pid" 2>/dev/null; then
  : # the server still runs
  else
  # The server may have exited between the last pid-file check and now. 
  if test -n "$avoid_race_condition"; then
   avoid_race_condition=""
   continue # Check again.
  fi
  # there's nothing that will affect the file.
  log_failure_msg "The server quit without updating PID file ($pid_file_path)."
  return 1 # not waiting any more.
  fi
 fi
 echo $echo_n ".$echo_c"
 i=`expr $i + 1`
 sleep 1
 done
 if test -z "$i" ; then
 log_success_msg
 return 0
 else
 log_failure_msg
 return 1
 fi
}
# Get arguments from the my.cnf file,
# the only group, which is read from now on is [mysqld]
if test -x ./bin/my_print_defaults
then
 print_defaults="./bin/my_print_defaults"
elif test -x $bindir/my_print_defaults
then
 print_defaults="$bindir/my_print_defaults"
elif test -x $bindir/mysql_print_defaults
then
 print_defaults="$bindir/mysql_print_defaults"
else
 # Try to find basedir in /etc/my.cnf
 conf=/etc/my.cnf
 print_defaults=
 if test -r $conf
 then
 subpat='^[^=]*basedir[^=]*=\(.*\)$'
 dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf`
 for d in $dirs
 do
  d=`echo $d | sed -e 's/[  ]//g'`
  if test -x "$d/bin/my_print_defaults"
  then
  print_defaults="$d/bin/my_print_defaults"
  break
  fi
  if test -x "$d/bin/mysql_print_defaults"
  then
  print_defaults="$d/bin/mysql_print_defaults"
  break
  fi
 done
 fi
 # Hope it's in the PATH ... but I doubt it
 test -z "$print_defaults" && print_defaults="my_print_defaults"
fi
#
# Read defaults file from 'basedir'. If there is no defaults file there
# check if it's in the old (depricated) place (datadir) and read it from there
#
extra_args=""
if test -r "$basedir/my.cnf"
then
 extra_args="-e $basedir/my.cnf"
else
 if test -r "
  
 
