如果你用“重啟MySQL服務(wù)”作為關(guān)鍵詞搜索,可以找到不少匹配的文章。那么我為什么會想到又寫一篇呢?如果你在看了別處的文章后仍然有些疑問,那么,也許我的這篇能幫助你解答部分問題。
下面是正文。
我們都不希望重啟數(shù)據(jù)庫服務(wù)。但偶爾會遇到需要重啟的時候。
重啟MySQL服務(wù),可以使用操作系統(tǒng)提供的服務(wù)重啟方法。比如在linux類系統(tǒng)中使用service 或 systemctl命令來重啟。
service mysqld restart
# OR
systemctl restart mysqld
或者在windows系統(tǒng)中通過服務(wù)管理界面來重啟。
那么,操作系統(tǒng)重啟MySQL服務(wù)是怎么完成的呢?或者,如果我們在做一些實驗,安裝MySQL時沒有安裝相應(yīng)的服務(wù)腳本,這時,我們就需要自己來完成這個過程。
MySQL服務(wù)的重啟,可以分為兩個步驟。第一,關(guān)閉當(dāng)前的服務(wù)進(jìn)程。第二,啟動服務(wù)進(jìn)程。
要關(guān)閉服務(wù)進(jìn)程,有兩種方法。
第一種方法是,使用有關(guān)閉服務(wù)權(quán)限的用戶,通過客戶端建立連接,然后執(zhí)行 shutdown 命令。
第二種方法是(僅限于Linux系統(tǒng)),向服務(wù)進(jìn)程發(fā)送SIGTERM信號。命令如下:
#shell
cat /path/to/mysqld.pid | xargs kill -SIGTERM
也就是找到當(dāng)前mysql服務(wù)進(jìn)程的pid,然后向它發(fā)送SIGTERM信號。進(jìn)程在收到了信號后,開始執(zhí)行和收到了shutdown命令相同的關(guān)閉過程。它會先關(guān)閉網(wǎng)絡(luò)連接,然后把未完成的操作執(zhí)行完,回滾未完成的事務(wù)。因此,雖然發(fā)送信號的過程很快就會執(zhí)行完成,但是接收信號后執(zhí)行關(guān)閉的過程則需要花費幾秒到幾十秒或更長的時間。
網(wǎng)絡(luò)上可以看到給進(jìn)程發(fā)送的信號為9而不是SIGTERM。信號9為SIGKILL,會立即中止進(jìn)程,數(shù)據(jù)庫服務(wù)進(jìn)程會存在未完成的操作,在進(jìn)程再次啟動時,會執(zhí)行修復(fù)的過程。據(jù)說,這種做法有一定的概率可能會損壞數(shù)據(jù)文件而導(dǎo)致修復(fù)失敗。因此,若非別無選擇,不要使用SIGKILL來結(jié)束數(shù)據(jù)庫服務(wù)進(jìn)程。
啟動服務(wù)
#shell
/path/to/mysqld_safe &
至此,基本的命令部分介紹完畢。
有時候,比如我們是在做實驗,需要反復(fù)或定期重啟數(shù)據(jù)庫服務(wù),因此希望把上述過程變成一個可以自動執(zhí)行的腳本。這其中存在的困難是,如何判定數(shù)據(jù)庫服務(wù)進(jìn)程收到信號后的關(guān)閉過程已經(jīng)完成了?
有兩種方法,一種是每隔一段時間在數(shù)據(jù)庫日志文件的結(jié)尾處查找表示進(jìn)程結(jié)束的關(guān)鍵詞。
tail -5 /path/to/mysql.log | grep -v grep | grep 'mysqld: Shutdown complete'
另一種是每隔一段時間查找mysql的服務(wù)進(jìn)程,如果找不到,就說明已關(guān)閉。
ps -ef | grep -v grep | grep 'bin/mysqld'
有的朋友可能對“每隔一段時間”該怎么寫成腳本有疑問。下面這段代碼會持續(xù)檢查mysqld進(jìn)程是否存在,如果存在則睡眠5秒后再次檢查,直到找不到mysqld進(jìn)程。
while ps -ef | grep -v grep | grep 'bin/mysqld'
do
sleep 5s
done