故障現象
[root@spark01 ~]# /etc/init.d/mysqld start
Starting mysqld (via systemctl): Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details. [FAILED]
systemctl / journalctl 給出的誤導性信息
systemctl status mysqld.service
# Active: failed (Result: exit-code)
# Process: 2979 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE)
# MySQL Daemon failed to start.
journalctl -xe
# Unit mysqld.service has failed.
# The result is failed.
⚠️ systemd 層面只報「啟動失敗」,不會揭示具體業務層原因。
關鍵突破口:MySQL 錯誤日誌
2016-01-20T10:00:19.935771Z 0 [ERROR] /usr/sbin/mysqld: Can't create/write to file '/var/run/mysqld/mysqld.pid' (Errcode: 2 - No such file or directory)
2016-01-20T10:00:19.935795Z 0 [ERROR] Can't start server: can't create PID file: No such file or directory
分層排查過程
- 目錄不存在:
ls -ld /var/run/mysqld/ → 無輸出
- 建目錄:
mkdir -p /var/run/mysqld/
- 再試啟動: 仍失敗,錯誤碼變為
Errcode: 13 - Permission denied
- 權限屬主錯誤:
ls -ld /var/run/mysqld/ → drwxr-xr-x 2 root root
- 修正屬主:
chown mysql:mysql /var/run/mysqld/
- 啟動成功:
/etc/init.d/mysqld start → [ OK ]
根因總結
- MySQL 啟動需在
pid-file 指定目錄建立 mysqld.pid
- 目錄缺失或屬主非
mysql 用戶 → 無寫入權限 → 啟動中止
- 常見於:手動移動 data 目錄、升級後未執行
mysql_install_db、tmpfs 掛載導致重啟後目錄消失
永久修復建議
# 1. 確保 my.cnf 中 pid-file 路徑正確
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
# 2. 建立 systemd-tmpfiles 規則,重啟自動建目錄並設權限
echo "d /var/run/mysqld 0755 mysql mysql -" > /etc/tmpfiles.d/mysql.conf
# 3. 驗證
systemd-tmpfiles --create /etc/tmpfiles.d/mysql.conf
ls -ld /var/run/mysqld/
核心心法
服務啟動失敗,先看業務日誌,再看系統日誌。
systemd/journalctl 只負責進程生命週期,業務邏輯錯誤(配置、權限、資源)只在應用自身日誌中現身。
延伸排查清單
datadir 目錄權限、屬主
log-error 指定的錯誤日誌路徑可寫
- SELinux / AppArmor 是否阻擋
- 端口 3306 佔用:
ss -tlnp | grep 3306
- 配置語法錯誤:
mysqld --validate-config