如果你用“重启MySQL服务”作为关键词搜索,可以找到不少匹配的文章。那么我为什么会想到又写一篇呢?如果你在看了别处的文章后仍然有些疑问,那么,也许我的这篇能帮助你解答部分问题。
下面是正文。
我们都不希望重启数据库服务。但偶尔会遇到需要重启的时候。
重启MySQL服务,可以使用操作系统提供的服务重启方法。比如在linux类系统中使用service 或 systemctl命令来重启。
service mysqld restart
# OR
systemctl restart mysqld
或者在windows系统中通过服务管理界面来重启。
那么,操作系统重启MySQL服务是怎么完成的呢?或者,如果我们在做一些实验,安装MySQL时没有安装相应的服务脚本,这时,我们就需要自己来完成这个过程。
MySQL服务的重启,可以分为两个步骤。第一,关闭当前的服务进程。第二,启动服务进程。
要关闭服务进程,有两种方法。
第一种方法是,使用有关闭服务权限的用户,通过客户端建立连接,然后执行 shutdown 命令。
第二种方法是(仅限于Linux系统),向服务进程发送SIGTERM信号。命令如下:
#shell
cat /path/to/mysqld.pid | xargs kill -SIGTERM
也就是找到当前mysql服务进程的pid,然后向它发送SIGTERM信号。进程在收到了信号后,开始执行和收到了shutdown命令相同的关闭过程。它会先关闭网络连接,然后把未完成的操作执行完,回滚未完成的事务。因此,虽然发送信号的过程很快就会执行完成,但是接收信号后执行关闭的过程则需要花费几秒到几十秒或更长的时间。
网络上可以看到给进程发送的信号为9而不是SIGTERM。信号9为SIGKILL,会立即中止进程,数据库服务进程会存在未完成的操作,在进程再次启动时,会执行修复的过程。据说,这种做法有一定的概率可能会损坏数据文件而导致修复失败。因此,若非别无选择,不要使用SIGKILL来结束数据库服务进程。
启动服务
#shell
/path/to/mysqld_safe &
至此,基本的命令部分介绍完毕。
有时候,比如我们是在做实验,需要反复或定期重启数据库服务,因此希望把上述过程变成一个可以自动执行的脚本。这其中存在的困难是,如何判定数据库服务进程收到信号后的关闭过程已经完成了?
有两种方法,一种是每隔一段时间在数据库日志文件的结尾处查找表示进程结束的关键词。
tAIl -5 /path/to/mysql.log | grep -v grep | grep 'mysqld: Shutdown complete'
另一种是每隔一段时间查找mysql的服务进程,如果找不到,就说明已关闭。
ps -ef | grep -v grep | grep 'bin/mysqld'
有的朋友可能对“每隔一段时间”该怎么写成脚本有疑问。下面这段代码会持续检查mysqld进程是否存在,如果存在则睡眠5秒后再次检查,直到找不到mysqld进程。
while ps -ef | grep -v grep | grep 'bin/mysqld'
do
sleep 5s
done