線上環境重啟後 MySQL 無法啟動、mysqldump 備份報錯「表不存在」卻能查到表,是運維高發痛點。本文結合實戰案例,系統梳理啟動失敗六大原因及備份失敗的表元數據不一致修復方案。
現象:service mysql start 報錯 MySQL server PID file could not be found!、The server quit without updating PID file。錯誤日志顯示 mysqld got signal 11,無明顯業務錯誤。
排查步驟:
df -h 發現根分區 /dev/sda1 100% 滿載,導致 MySQL 無法寫入 PID、Socket、臨時文件。/etc/my.cnf 中 datadir 指向空閒分區(如 /mnt/backup),遷移數據目錄。遷移注意:cp -a 或 tar 保留權限,大數據量必須壓縮傳輸,目標服務器 MySQL 版本需一致。其他五大常見原因及修復:
| 原因 | 現象 | 解決命令 |
|---|---|---|
| PID 文件無寫權限 | 啟動報權限錯誤 | chown -R mysql:mysql /mydata/data/ |
| 殘留 mysqld 進程 | 端口佔用/鎖衝突 | ps -ef | grep mysqld → kill -9 PID |
二次安裝殘留 mysql-bin.index |
啟動卡住/報錯 | rm -f /data/mysql-bin.index |
skip-federated 參數未註釋 |
錯誤日志 unknown option '--skip-federated' |
編輯 my.cnf 註釋該行 |
| CentOS SELinux 阻攔 | 無明顯錯誤但啟動失敗 | sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 並重啟 |
現象:mysqldump fx > fx.sql 報錯 Table 'user_suggest_report' doesn't exist when using LOCK TABLES。加 --skip-lock-tables 仍報 Couldn't read status information for table vote_results、Table 'fx.user_suggest_report' doesn't exist (1146)。但 SHOW TABLES; 明明能看到該表。
根因分析:.frm 文件存在,但 InnoDB 內部數據字典中無該表元數據(如誤刪 .ibd、DDL 中斷、崩潰恢復不全),導致 Server 層與引擎層元數據不一致,「幽靈表」阻塞備份。
修復步驟:
cd /var/lib/mysql/fx/(確認 datadir)。mv user_suggest_report.frm /data/backup/。service mysqld restart,Server 層感知表已刪除。mysqldump fx > fx.150109.sql 成功。預防建議:定期運行 pt-table-checksum 檢測主從一致性,避免 DDL 操作中斷,重要變更前做快照備份。