前言
我们这里主要是看一下 service mysql start, service mysql stop 的过程中的一些常见的错误问题
这些 也是之前经常碰到, 但是 每次都是 去搜索, 尝试 1, 2, 3, 4 去解决问题
但是 从来未曾思考过 这个问题到底是 怎么造成的
The server quit without updating PID file
这个在启动的时候, 主要造成的情况一般是
“service mysql start” 启动 mysqld 服务, 然后 之后等待进程文件的创建 的过程中, mysqld 的进程挂掉了, 会输出 “The server quit without updating PID file”
这里, 我对脚本做了一定的调整, 原脚本是使用的 mysqld_save, 传入了 data_dir, 等等
“service mysql stop” 的时候, 发送 “kill $pid” 杀掉 mysqld 所在的进程, 然后 进入 wait_for_pid 的流程
在 mysqld 清理掉 mysql.pid 文件之前, mysqld 所在的进程挂了之后, 会输出 “The server quit without updating PID file”
然后 wait_for_pid 在 “service mysql start” 的过程中检测到了 mysqld 服务生成了 pid 文件, 立即跳出
在 “service mysql stop” 的过程中检测到了 pid 文件的消失, 立即跳出, 等待 service_startup_timeout 秒, 这个默认值是 900s
然后下面的检测是 “test –n $pid” 表示上面执行 “$bindir/mysqld –defaults-file=/usr/local/mysql/my.cnf –user=root” 进程创建成功
然后下面 “test kill -0 $pid” 的 else 表示 mysqld 的进程现在已经不存在了
综上所述
这个问题在 “service mysql start” 的过程中会出现的场景就是, 在 mysqld 进程创建了之后, 在 mysql.pid 文件创建之前, mysql 进程挂了
这个问题在 “service mysql stop” 的过程中会出现的场景就是, 发送了 kill $pid之后, 在 mysqld 清理 mysql.pid 文件消失之前, mysql 进程挂了
当然 可以看到的是, 这个错误提示 明显是在 “service mysql stop” 的场景中更加符合这里的提示的意义, 在 “service mysql start” 的场景, 更加倾向于是 “The server quit without creating PID file ”
复现一下问题, 我们这里主要是在 “service mysql start” 的过程中来复现这个问题
需要构造这个问题, 我们稍微调整一下 脚本中构造 mysql_pid_path 的地方, 我们调整成为一个 不存在的 pid 文件
这样, 在启动之后, wait_for_pid 的循环中会一直等待 mysql.pid 的生成, 然后 这时候 我们可以去构造问题
调整如下, 更新 mysql_pid_file_path 的默认值为一个 ubuntu1.pid, 这里我们 mysqld 进程创建好了之后, 创建的进程文件为 ubuntu.pid
在 wait_for_pid 的循环中, 每隔一秒会向 console 输出一个 “.”, 这里有几个点 就表示 wait_for_pid 已经等待了多少秒
然后之后 我 kill 掉 mysqld 的进程, 这之后 wait_for_pid 中 “test kill -0 $pid” 检测到进程已经不存在了, 输出了 “The server quit without updating PID file”
Couldn’t find MySQL server
这个主要是 mysql.server.sh 中的 指定的 mysql_safe 不存在
对应的处理是在这里, “test –x $bindir/mysqld_safe” 如果 mysqld_safe 不存在, 则直接输出 “Couldn’t find MySQL server”
MySQL server PID file could not be found
这个主要是 “service mysql stop”, 但是 并没有 mysqld 的进程
并且没有 mysql.pid 文件[比如 mysqld 执行之后, kill -9 $pid 之后, mysql.pid 依然存在]
需要确保 mysql.pid 文件不存在, 即可构造这个问题
Mysql server process is not running
这个情况是 mysql.pid 文件依然存在, 但是 mysql 进程不存在的情况
构造的情况为, 启动 mysqld 进程, 让他创建 mysql.pid 文件, 然后 kill -9 $pid, 杀掉 mysqld 服务, 然后在执行 “service mysql stop”
或者 手动创建一个 mysql.pid 文件, 然后在执行 “service mysql stop”
需要确保 mysql.pid 文件存在, 并且 mysqld 进程不存在 即可构造这个问题
Failed to stop running server, so refusing to try to start
确保 “service mysql stop” 失败, 即可复现这个问题
MySQL PID file could not be found
确保执行 “service mysql reload”, “service mysql force-reload” 的时候, mysql.pid 文件不存在即可
MySQL running/MySQL is not running/MySQL is running but PID file could not be found/MySQL is not running, but PID file exists
主要是来自于 “service mysql status” 的检查状态的输出
完