SHUTDOWN。mysqld 寫入時被 kill -9 強制終止。myisamchk 時 mysqld 同時操作同表(未加 --skip-external-locking)。Incorrect key file for table: '...'. Try to repair itTable '...' is marked as crashed and should be repairedCan't open file: '...MYI' (errno: 145)CHECK TABLE 或 mysqlcheck -c(無需停庫)。OPTIMIZE TABLE 消除碎片。systemctl stop mysqld,禁用 kill -9。innodb_checksum_algorithm=crc32、innodb_file_per_table=ON。smartctl 巡檢。
myisamchk *.MYI # 快速
myisamchk -e *.MYI # 延伸檢查
myisamchk -s *.MYI # 靜默模式
僅修復回報錯誤的表。
# 設定緩衝加速(約可用記憶體 25%)
myisamchk --sort_buffer_size=256M --key_buffer_size=256M -r -q tbl_name
# 失敗則標準恢復
myisamchk -r tbl_name
# 再失敗則安全恢復
myisamchk --safe-recover tbl_name
.MYD 到安全處。.frm 重建空表:mysql> TRUNCATE TABLE tbl_name;.MYD 覆蓋新資料檔。myisamchk -r -q 重建索引。REPAIR TABLE tbl_name USE_FRM; 自動完成上述。.frm → 回階段 3。.frm .MYI 覆蓋 → 回階段 2。InnoDB 有崩潰恢復機制,較少需手工修復。嚴重時:
innodb_force_recovery = 1..6 分級啟動(my.cnf):1 忽略損壞頁讀取、4 禁止合併插入緩衝、6 不重做日誌。SELECT * INTO OUTFILE 導出資料。CREATE TABLE new LIKE old; INSERT INTO new SELECT * FROM old;| 等級 | 常數 | 行為 |
|---|---|---|
| 1 | SRV_FORCE_IGNORE_CORRUPT | 允許讀取損壞頁,跳過壞索引記錄 |
| 2 | SRV_FORCE_NO_BACKGROUND | 阻止主執行緒(purge、merge) |
| 3 | SRV_FORCE_NO_TRX_UNDO | 不執行事務回滾 |
| 4 | SRV_FORCE_NO_IBUF_MERGE | 禁止插入緩衝合併、不計算統計 |
| 5 | SRV_FORCE_NO_UNDO_LOG_SCAN | 視未完成事務為已提交 |
| 6 | SRV_FORCE_NO_LOG_REDO | 不執行日誌前滾 |
警告:innodb_force_recovery > 0 時禁止 INSERT/UPDATE/DELETE。