生產環境 MySQL 故障五花八門,本文彙總 7 大高頻災難場景,提供「最小停機、零數據丟失」的標準化處置流程,涵蓋 MyISAM 表崩潰自動修復、多實例端口衝突、InnoDB 日誌配置不可變性、mysql 系統表丟失、自增計數器錯亂、連接數耗盡、InnoDB 核心崩潰強制恢復全流程。
MyISAM 崩潰是常態,配置 my.cnf 讓實例自愈:
[mysqld] myisam-recover-options = BACKUP,FORCE # 5.6+ 參數名 # 5.1 版本用 myisam-recover = backup,force
BACKUP:修復前自動備份 .BAK 文件。FORCE:即使丟失數據也強制修復。REPAIR TABLE tbl_name;mysqlcheck --all-databases -r -u root -p# 停止所有實例 mysqladmin -u root -p -S /tmp/mysql_3306.sock shutdown mysqladmin -u root -p -S /tmp/mysql_3307.sock shutdown # 強制殺殘留 killall mysqld killall mysqld_safe # 逐個實例按配置文件啟動 mysqld_safe --defaults-file=/etc/my_3306.cnf & mysqld_safe --defaults-file=/etc/my_3307.cnf &
以下參數首次初始化後永久固定,修改會導致實例無法啟動:
datadir = /data/mysql innodb_data_home_dir = /data/mysql innodb_data_file_path = ibdata1:10M:autoextend innodb_log_group_home_dir = /data/mysql innodb_log_files_in_group = 2 innodb_log_file_size = 5242880 # 5MB,修改需重建整個實例
若誤改,唯一解法:備份數據 → 刪除 ib_logfile*、ibdata* → 恢復原配置 → mysql_install_db → 導入數據。
mysql_install_db --user=mysql --datadir=/data/mysql
會重建 mysql.user、mysql.db 等系統表,原有業務表不受影響。
-- 1. 找最大值 SELECT MAX(id) FROM tbl_name; -- 假設返回 1000 -- 2. 重置 ALTER TABLE tbl_name AUTO_INCREMENT = 1001;
原理:MyISAM 自增計數器存儲在 .MYI 文件頭,崩潰後可能歸零或亂跳,手動校準即可。
# 1. 緊急停庫 mysqladmin -u root -p shutdown # 2. 改配置 # my.cnf [mysqld] max_connections = 2000 wait_timeout = 100 # 3. 重啟 mysqld_safe &
旁路登錄技巧:若無法登錄改配置,臨時改 port=3307 重啟,管理員連 3307 端口操作,完畢改回 3306 再重啟。
innodb_force_recovery 分級導出重建(核心重點)當 InnoDB 自動恢復失敗,實例拒絕啟動,按級別嘗試:
| 級別 | 行為 | 風險 |
|---|---|---|
| 1 (SRV_FORCE_IGNORE_CORRUPT) | 忽略損壞頁,繼續啟動 | 極低 |
| 2 (SRV_FORCE_NO_BACKGROUND) | 禁用主線程預讀/合併 | 低 |
| 3 (SRV_FORCE_NO_TRX_UNDO) | 不執行事務回滾 | 中(可能見到臟讀) |
| 4 (SRV_FORCE_NO_IBUF_MERGE) | 不合併插入緩衝 | 中 |
| 5 (SRV_FORCE_NO_UNDO_LOG_SCAN) | 不掃描 Undo Log | 高(元數據可能不一致) |
| 6 (SRV_FORCE_NO_LOG_REDO) | 不執行 Redo Log 前滾 | 極高(數據可能不一致) |