背景
今天公司物業斷電,導致機房服務器停電宕機,所有的服務都得重啟。本著mysql實例都做了服務自啟動,所以沒有太擔心影響開發的日常工作。但是今天一上班開發就找來,各種服務都沒起來有問題,數據庫連不上。馬上登陸數據庫服務器,發現有一個數據庫實例沒有起來,于是著手手動啟動。
報錯

如果只從上述的報錯,得不到有效信息,因為有多種情況會引起這種報錯,例如:
1)mysql進程已經存在;
- mysql相關目錄文件讀寫權限問題;
3)由于第二次安裝,存在之前剩余的數據影響啟動;
4)等等... ...
尋錯
查看mysql的錯誤日志找到準確的錯誤信息,下圖可以看出,是因為有進程占用的socket文件,導致新的進程無法設置新的socket lock 文件。通過ps -ef | grep pid
,發現錯誤日志中的進程不存在。所以轉而去看當前的socket lock 文件。

發現當前新起實例mysqld_3347的socket lock 文件已經存在。屬于不正常狀態(socket lock)文件應該在mysql實例關閉時正常刪除,mysql實例啟動時重新生成寫入運行實例的pid。所以果斷刪除(筆者是所在為測試環境,如果是生產環境,請進一步確認無誤后謹慎刪除)。

解決
在刪除了相應的mysql實例的socket lock 文件后,實例啟動成功。

mysql.sock.lock文件的作用
因為不同的mysql服務實例可以通過相同的mysql socket 文件啟動(在同一個服務器,只需端口不同即可)。但是這樣會出現一個問題:當時關閉一個mysql實例時,會隨機選擇這些使用相同的mysql socket文件啟動的實例中的一個,這樣就不導致關閉的mysql實例不是你所期望的那個實例。為了避免這個問題,mysql引進了socket lock文件(與socket 文件同名),當使用socket 啟動時,如果socket lock文件存在,則不會啟動新的實例。具體實例解析可以建連接:https://bugs.mysql.com/bug.php?id=37629

喜歡的朋友記得點贊、收藏、關注哦!!!