如果你用“重啟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






