systemctl start mysqld 報 Job for mysqld.service failed,systemctl status 與 journalctl -xe 卻只給出通用的 exit-code。本文實戰演示「跳過 systemd、直達錯誤日誌」的定界方法論,秒級定位 PID 文件權限、目錄缺失、SELinux、配置語法等高頻啟動失敗根因。
[root@spark01 ~]# systemctl start mysqld
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.
[root@spark01 ~]# systemctl status mysqld.service
● mysqld.service - SYSV: MySQL database server.
Active: failed (Result: exit-code) since Wed 2016-01-20 18:26:57 CST
Process: 2979 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE)
Jan 20 18:26:57 spark01 mysqld[2979]: MySQL Daemon failed to start.
Jan 20 18:26:57 spark01 mysqld[2979]: Starting mysqld: [FAILED]
痛點: systemd 只知道「啟動腳本返回非 0」,完全看不見 MySQL 內核為什麼起不來。
# 1. 找日誌路徑(默認 datadir 下 *.err)
[root@spark01 ~]# cat /var/lib/mysql/spark01.err
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
| 錯誤碼 | 現象 | 根因 | 修復命令 | 驗證 |
|---|---|---|---|---|
| Errcode: 2 | No such file or directory | PID 目錄 /var/run/mysqld/ 不存在 | mkdir -p /var/run/mysqld/ | ls -ld /var/run/mysqld/ |
| Errcode: 13 | Permission denied | 目錄屬主為 root,mysqld 用戶無寫權限 | chown mysql:mysql /var/run/mysqld/ | ls -ld /var/run/mysqld/ |
| Errcode: 13 | datadir 權限 | /var/lib/mysql 屬主非 mysql | chown -R mysql:mysql /var/lib/mysql | ls -ld /var/lib/mysql |
| SELinux | 啟動無報錯但端口不聽 | 策略阻止 mysqld 寫入/綁定 | setsebool -P mysql_connect_any=1 或 semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?" + restorecon -Rv /data/mysql | ausearch -m avc -ts recent |
| 配置語法 | [ERROR] unknown variable | my.cnf 參數拼寫錯/版本不支持 | mysqld --help --verbose 2>&1 | grep -i unknown 定位 | mysqld --validate-config (8.0+) |
| 端口衝突 | [ERROR] Do you already have another mysqld server running? | 3306 被佔用/殘留進程 | lsof -i:3306 / pkill -9 mysqld | netstat -antp | grep 3306 |
tail -50 $(grep 'log-error' /etc/my.cnf | cut -d= -f2) —— 永遠第一步datadir、pid-file、socket、log-error 目錄屬主均為 mysql:mysqlgetenforce → Enforcing 時必查 ausearch -m avc -c mysqldmysqld --help --verbose 2>&1 | head -20 檢查參數識別mysqld --user=mysql --console 前台運行,直接看標準錯誤輸出/etc/init.d/mysqld 只是薄封裝,真正干活的是 mysqld_safe → mysqld掌握「直達錯誤日誌」定界思維,CentOS 7/MySQL 8.0/任何 systemd 管理的服務,啟動故障排查都將從「盲人摸象」變為「順藤摸瓜」。