執行 service mysqld start 時遇到 Another MySQL daemon already running with the same unix socket. 是經典啟動失敗場景。本文提供標準化排查流程、兩種修復方案、根因深度解析與預防機制。
[root@localhost ~]# service mysqld start
Another MySQL daemon already running with the same unix socket. [FAILED]
直接原因:檢測到已有 MySQL 進程佔用同一個 Unix Socket 檔案(/var/lib/mysql/mysql.sock),新啟動進程為避免衝突而拒絕啟動。
ps -ef | grep mysqld
# 或
netstat -tlnp | grep 3306
# 或
ss -tlnp | grep 3306
ls -la /var/lib/mysql/mysql.sock
# 查看擁有者、權限、修改時間
cat /var/run/mysqld/mysqld.pid
# 對應進程是否存活
# 1. 嘗試正常關閉
mysqladmin -uroot -p shutdown
# 2. 若無法連線,發送 TERM 信號
kill -TERM $(cat /var/run/mysqld/mysqld.pid)
# 3. 等待 10-30 秒讓 InnoDB 完成 checkpoint/刷盤
# 4. 確認進程已退出
ps -ef | grep mysqld
# 5. 再次啟動
service mysqld start
優點:資料零風險,InnoDB 正常關閉。
缺點:若進程卡死無響應,需強制手段。
# 1. 確認無正常 MySQL 進程運行(ps -ef 確認)
# 2. 備份 Socket 檔案(而非直接刪除)
mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.bak.$(date +%s)
# 3. 啟動服務
service mysqld start
# 服務啟動時會自動重建 mysql.sock
適用場景:確認進程已死、PID 檔殘留、Socket 檔孤兒。
風險:若進程實際存活但 Socket 被移除,會導致「雙 Master」資料分裂嚴重事故。
鐵律:動 Socket 前必須雙重確認進程不存在。
| 屬性 | 說明 |
|---|---|
| 本質 | Unix Domain Socket 專用檔案,用於本機進程間通訊 |
| 觸發條件 | 客戶端連線參數 host=localhost 或 host=127.0.0.1 但協議為 socket |
| 優勢 | 比 TCP/IP 回環快 10-20%(無網絡棧開銷) |
| 生命週期 | MySQL 啟動時建立,正常關閉時自動刪除 |
| 殘留原因 | 進程被 kill -9 強殺、系統崩潰、OOM Killer、磁碟滿導致寫入 PID 失敗 |
| 方式 | 參數 | Socket 依賴 | 排查啟示 |
|---|---|---|---|
| Unix Socket | -S /var/lib/mysql/mysql.sock 或 host=localhost | 是 | 報錯時嘗試 mysql -h 127.0.0.1 -P 3306 繞過 Socket |
| TCP/IP | -h 127.0.0.1 -P 3306 | 否 | 若 TCP 可連、Socket 失效,確定是 Socket 殘留問題 |
| Named Pipe (Windows) | --protocol=pipe | N/A | Windows 專用替代方案 |
systemctl start mysqld,Systemd 會追蹤主進程 PID,自動處理殘留 Socket/PID,極大降低此類問題。/etc/init.d/mysqld 或 mysqld_safe 內建檢查邏輯,但可能被繞過。mysqld 進程數、Socket 檔案存在性、PID 檔一致性,異常即時告警。kill -9 MySQL,必須用 mysqladmin shutdown 或 systemctl stop。#!/bin/bash
# 每小時執行一次
if ! pgrep -x mysqld >/dev/null; then
[ -S /var/lib/mysql/mysql.sock ] && mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.$(date +%s)
[ -f /var/run/mysqld/mysqld.pid ] && rm /var/run/mysqld/mysqld.pid
fi
Windows 無 Unix Socket,但會遇到 Can't start server: Bind on TCP/IP port: Address already in use。排查:
netstat -ano | findstr 3306
taskkill /PID /F
net start mysql
啟動報錯
↓
ps -ef | grep mysqld → 有進程? → 是 → 正常關閉 → 啟動成功
↓ 否
檢查 Socket/PID 殘留 → 確認進程確實不存在 → mv socket.bak → 啟動成功
↓
若仍失敗 → 查看 error log → 修復配置/權限/磁碟 → 啟動成功
MySQL 啟動報錯看似簡單,背後涉及進程管理、IPC 機制、儲存引擎關閉流程等核心知識。建立「先查進程、再動檔案、後查日誌」的肌肉記憶,配合 Systemd 托管與監控兜底,才能在生產環境從容應對各類啟動異常,守住資料庫服務可用性底線。