MySQL 拒絕啟動是運維高頻故障,成因涉及配置、權限、數據損壞、資源耗盡等多個維度。本文系統梳理常見故障類型、診斷思路與標準化修復方案,幫助 DBA 快速定位根因並恢復服務。
[mysqld] 區塊必須包含:basedir(安裝目錄)、datadir(數據目錄)、port、socket。my.ini 可能同時存在於安裝目錄與 C:\Windows,以 mysqld --help --verbose 輸出的實際讀取路徑為準。# Windows
mysqld --initialize-insecure --console
# 或運行 MySQL 安裝向導最後一步「Configure MySQL」
# Linux
mysqld --initialize-insecure --user=mysql
初始化會生成 data 目錄、ibdata1、ib_logfile*、mysql.sock 等核心文件。
systemctl stop mysqld
mv /var/lib/mysql /new/path/mysql
chown -R mysql:mysql /new/path/mysql
# 修改 my.cnf datadir=/new/path/mysql
systemctl start mysqld
net start mysql 或 systemctl start mysqld 報錯:System error 1067 has occurred. The process terminated unexpectedly.
REMOVE INSTANCE,檢查 datadir 是否指向舊路徑且目錄為空。chown -R mysql:mysql /var/lib/mysql(Linux);Windows 確保服務賬戶對 data 目錄有完全控制權限。my.ini 衝突:刪除 C:\Windows\my.ini,僅保留安裝目錄下配置。cp support-files/mysql.server /etc/init.d/mysqld && chkconfig --add mysqld。錯誤日誌顯示:InnoDB: Database was not shut down normally、ibdata1、ib_logfile* 損壞。
xtrabackup 或邏輯備份 mysqldump)。innodb_force_recovery=1..6 逐級嘗試導出數據,導出後重建實例。ib_logfile0、ib_logfile1、ibdata1(將丟失所有 InnoDB 表數據),僅保留 mysql 系統表空間(需極度謹慎)。Disk is full writing './mysql-bin.~rec~' (Errcode: 28).
Waiting for someone to free space...
df -h 確認磁盤滿,du -sh /var/lib/mysql 定位大文件。RESET MASTER; 清空 Binlog;或停庫後手動刪除 mysql-bin.*(保留 mysql-bin.index)。my.cnf 註釋 log-bin=mysql-bin 並重啟。expire_logs_days=7、max_binlog_size=100M,定期 PURGE BINARY LOGS。Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
| 可能原因 | 檢查命令 | 修復動作 |
|---|---|---|
| MySQL 進程未運行 | ps -ef | grep mysqld | systemctl start mysqld |
| Socket 文件路徑不匹配 | mysqld --verbose --help | grep socket 對比 my.cnf 與 php.ini mysql.default_socket | 統一 socket 參數或建立軟鏈接 |
| 數據目錄權限錯誤 | ls -ld /var/lib/mysql | chown -R mysql:mysql /var/lib/mysql |
| SELinux 阻擋 | ausearch -m avc -ts recent | setsebool -P mysql_connect_any 1 或暫時 setenforce 0 |
| 端口衝突/防火牆 | netstat -tlnp | grep 3306 | 修改 port 或放行 3306 |
# 1. 查看錯誤日誌(最關鍵)
tail -n 100 /var/log/mysqld.log # 或 my.cnf 指定的 log-error 路徑
# 2. 檢查配置語法
mysqld --validate-config
# 3. 前台調試模式(輸出控制台)
mysqld --console --user=mysql
# 4. 檢查端口與進程
netstat -tlnp | grep 3306
ss -tlnp | grep 3306
# 5. 分析核心轉儲(若有)
gdb /usr/sbin/mysqld /path/to/core
MySQL 啟動失敗 90% 以上集中在:配置文件路徑錯誤、數據目錄權限、殘留舊 Binlog/Redo Log、非正常關機導致的 InnoDB 恢復失敗、Socket 路徑不匹配。建立標準化排查清單、保留完整錯誤日誌、定期驗證備份可恢復性,是穩定運維的基石。