深度解析MySQL启动时报“The server quit without updating PID file”错误的原因

论坛 期权论坛 脚本     
niminba   2021-5-23 04:20   1338   0

很多童鞋在启动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
 id(}х乍4(4)4)}4(1}jB*>V4(4(4(}хх}}}4(4(4(}хх}}}4(b*'4(&gjzA53B*^*qQЁA%wRgj:n3ro疒r'&*zsr'G^"GVg?k>+^n{7jrv{瞒gjR2
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP