首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL PID 檔案遺失導致無法重啟的排查與修復實戰

     編輯:MySQL 資料庫相關知識

事故背景

某 MySQL 5.1.32 伺服器負載飆高、查詢緩慢。同事誤用 mysqld restart 直接啟動進程(而非 service mysql restart),導致 PID 檔案遺失,後續無法正常停止/重啟服務,命令列客戶端也無法連線(ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock')。

錯誤操作複盤

# 錯誤操作 1:直接執行 mysqld 二進制檔
/var/lib/mysql/libexec/mysqld restart
# 錯誤:Fatal error: Please read "Security" section... Aborting

# 錯誤操作 2:嘗試 service 重啟
service mysql restart
# 錯誤:MySQL manager or server PID file could not be found! [FAILED]

現場排查過程

1. 確認資料庫實際狀態

# 進程仍在運行
ps aux | grep mysql

# 客戶端工具可連線,Web 應用正常但查詢慢
mysql -u root -p  # 客戶端工具正常

# 命令列客戶端失敗
mysql -u root -p
# ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

2. 定位效能瓶頸

SHOW PROCESSLIST;

發現大量 Locked 狀態查詢,阻塞源頭為一個 Sending data 的超大連接查詢(6 表 JOIN、1000 萬資料量、含 SUM(DISTINCT)/GROUP BY/ORDER BY),Process ID = 799。

3. 緊急處理

KILL 799;

後續陸續 KILL 同類慢查詢,被阻塞的正常 UPDATE/INSERT 迅速完成,Web 恢復正常,top 顯示負載回落。

根因分析:為什麼 PID 與 Socket 會遺失?

  • 操作 1:以 root 身分直接啟動 mysqld,MySQL 拒絕並退出,但過程中可能清理了 PID 檔
  • 操作 2:service mysql restart 讀取 PID 檔失敗,嘗試啟動新進程,但舊進程仍佔用 3306 端口 → 新進程啟動失敗 → Socket 檔未建立

修復步驟:重建 PID 與 Socket

1. 停止服務(雖報錯但嘗試)

service mysql stop
# MySQL is running but PID file could not be found

2. 進入資料目錄,手動建立 PID 檔

cd /var/lib/mysql/var/  # 你的 datadir,請根據實際調整

# 取得 mysql 使用者的 mysqld 進程 PID
echo `ps aux | grep mysql | grep "user=mysql" | grep -v grep | awk '{print $2}'` >> redhat.pid
# 注意:redhat.pid 對應主機名,請用 `hostname` 確認

# 修正擁有者
chown mysql:mysql redhat.pid

3. 驗證 PID 檔生效

service mysql status
# MySQL running (10949) [ OK ]

4. 正常重啟服務

service mysql restart
# Shutting down MySQL. [ OK ]
# Starting MySQL. [ OK ]

5. 確認 Socket 重建

ls /tmp | grep sock
# mysql.sock  出現!

6. 驗證命令列連線

mysql -u root -p
# 成功進入 MySQL 客戶端

腳本邏輯深度解析(選讀)

/etc/init.d/mysql 啟動腳本會:

  1. 讀取 $datadir/$(hostname).pid 確認進程是否存活
  2. 啟動 mysqld_safe,由其建立 Socket 檔(預設 /tmp/mysql.sock 或 $datadir/mysql.sock)
  3. 寫入新 PID 至 PID 檔

若 PID 檔遺失或內容錯誤,腳本會誤判服務未啟動,導致重複啟動或無法停止。

預防建議

  1. 嚴禁直接執行 mysqld,統一使用 systemctl/service 管理服務
  2. 監控 PID 檔完整性,Nagios/Zabbix 加入檢查項目
  3. 設定明確的 pid-file 與 socket 路徑於 my.cnf:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
  1. 建立操作 SOP,禁止非 DBA 人員重啟資料庫
  2. 慢查詢預警:開啟 slow_query_log,配合 pt-query-digest 定期分析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved