今天在做mysql sniff測試的時候,中間重啟MySQL實例的過程中,出現了"The server quit without updating PID file"這個經典的錯誤。因為把mysql sniff的日誌文件放在了mysql實例的目錄中,因此刪除mysql sniff日誌的時候無意中刪除 ...
今天在做mysql sniff測試的時候,中間重啟MySQL實例的過程中,出現了"The server quit without updating PID file"這個經典的錯誤。
因為把mysql sniff的日誌文件放在了mysql實例的目錄中,因此刪除mysql sniff日誌的時候無意中刪除了mysql的errorlog文件。
所以一開始懷疑這裡出現的錯誤是mysql sniff進程在MySQL實例的datadir下寫數據導致的,各種嘗試重現都無法重現。
最後仔細回憶了一下錯誤最開始的一些操作,好似乎跟mysql的errorlog有關,嘗試後發現是刪除MySQL的errorlog之後重啟,也可以造成上述錯誤
重現方式如下:
1,對於正常運行的MySQL實例,直接刪除MySQL配置的errorlog文件
2,重啟MySQL實例,發現:The server quit without updating PID FILE
解決辦法1:
step 1,手動生成mysql errorlog文件,errorlog文件名稱需要與配置文件中的配置名稱保持不一致
step 2,修改MySQL相關文件的許可權,chown -R mysql:mysql
解決辦法2:
1,簡單粗暴,直接修改MySQL配置文件中的用戶,以root用戶啟動
2,待MySQL實例啟動後,因為部分文件屬主是root,比如每次重啟都會重新生成的ibtmp1文件,修改MySQL相關文件的許可權,chown -R mysql:mysql
3,修改配置文件中的user為mysql,重啟實例
最後,為什麼刪除mysql的errorlog可以導致mysql重啟的時候出現"The server quit without updating PID file"?
查閱了很多資料,瞭解了一下MySQL的啟動過程,個人推測大概如下
1,mysql實例啟動的過程中需要往errorlog中寫入啟動信息,如果errorlog不存在,則啟動失敗
2,以root用戶啟動的時候,root用戶的許可權更高,應該可以創建errorlog
3,不管怎麼解決這個錯誤,最後一定要修改MySQL basedir的屬主。
參考:
https://www.cnblogs.com/ivictor/p/6846017.html
https://blog.csdn.net/wzl505/article/details/53322845
https://codar.club/blogs/5c2d75cca8b3b.html(太奇葩了,應該是翻譯軟體翻譯上面第一個的鏈接的內容的,看到這句話震驚了:Many children's shoes encountered this mistake when they started mysql.)
另:
MySQL 5.7版本下,mysql sniff死活抓不到當前實例請求的包數據,經過各種重啟,各種折騰還是不行,最後發現mysql sniff已經對5.7不支持了
開源是把雙刃劍,別人的東西,沒問的時候,用起來爽歪歪,有了問題,又沒有源碼修改能力,就只能幹瞪眼了。
https://github.com/Qihoo360/mysql-sniffer/issues/32