某 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]
# 進程仍在運行 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)
SHOW PROCESSLIST;
發現大量 Locked 狀態查詢,阻塞源頭為一個 Sending data 的超大連接查詢(6 表 JOIN、1000 萬資料量、含 SUM(DISTINCT)/GROUP BY/ORDER BY),Process ID = 799。
KILL 799;
後續陸續 KILL 同類慢查詢,被阻塞的正常 UPDATE/INSERT 迅速完成,Web 恢復正常,top 顯示負載回落。
mysqld,MySQL 拒絕並退出,但過程中可能清理了 PID 檔service mysql restart 讀取 PID 檔失敗,嘗試啟動新進程,但舊進程仍佔用 3306 端口 → 新進程啟動失敗 → Socket 檔未建立service mysql stop # MySQL is running but PID file could not be found
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
service mysql status # MySQL running (10949) [ OK ]
service mysql restart # Shutting down MySQL. [ OK ] # Starting MySQL. [ OK ]
ls /tmp | grep sock # mysql.sock 出現!
mysql -u root -p # 成功進入 MySQL 客戶端
/etc/init.d/mysql 啟動腳本會:
$datadir/$(hostname).pid 確認進程是否存活mysqld_safe,由其建立 Socket 檔(預設 /tmp/mysql.sock 或 $datadir/mysql.sock)若 PID 檔遺失或內容錯誤,腳本會誤判服務未啟動,導致重複啟動或無法停止。
systemctl/service 管理服務my.cnf:[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock
slow_query_log,配合 pt-query-digest 定期分析