「Incorrect file format」通常意味著 MyISAM 表的索引檔 (.MYI) 損壞,常見於非正常關機、磁碟故障、磁碟滿、殺進程後。本文記錄實戰修復流程、資料挽救技巧與預防措施。
-- 錯誤訊息
ERROR 130 (HY000): Incorrect file format 'table_name'
-- phpMyAdmin 狀態顯示 "在使用中" (in use)
-- 無法執行 REPAIR TABLE、CHECK TABLE
MyISAM 表由三個檔案組成:
table.frm:表結構定義table.MYD:資料檔table.MYI:索引檔# 進入資料目錄
cd /var/lib/mysql/mydb/
# 檢查檔案大小
ls -lh table_name.*
# 典型損壞徵兆:.MYI 檔案大小為 0 bytes
-- 1. 檢查表
CHECK TABLE table_name;
-- 2. 分析表 (更新統計資訊)
ANALYZE TABLE table_name;
-- 3. 修復表 (預設 QUICK 模式,只修索引樹)
REPAIR TABLE table_name;
-- 4. 強制修復 (重建索引,保留資料)
REPAIR TABLE table_name USE_FRM;
USE_FRM:根據 .frm 結構重建索引,**資料不遺失**,適用於索引檔損壞但資料檔完整。
# 1. 停止 MySQL 服務 (必要,避免檔案衝突)
systemctl stop mysqld
# 2. 進入資料目錄
cd /var/lib/mysql/mydb/
# 3. 檢查
myisamchk table_name
# 4. 修復 (自動模式)
myisamchk -r table_name
# 5. 強制修復 (重建索引)
myisamchk -r -q table_name # 快速
myisamchk --safe-recover table_name # 安全模式,處理嚴重損壞
# 6. 啟動服務
systemctl start mysqld
# 從備份還原 .MYD、.MYI、.frm
# 或從 SQL Dump 重建
mysql -u root -p mydb < backup_20240115.sql
table.MYI 大小為 0.MYI 覆蓋REPAIR TABLE table_name → 報錯 Table 'table' is marked as crashed and should be repairedREPAIR TABLE table_name → 修復成功,**但資料變空表**.MYI 對應舊結構,表結構已變更 (ALTER TABLE),導致不匹配REPAIR TABLE table_name USE_FRM,根據當前 .frm 重建索引,資料保留.MYD 損壞:REPAIR TABLE 可能無法完全恢復myisamchk --safe-recoverInnoDB 有雙寫緩衝、Redo Log、Checksum,損壞機率極低:
-- 檢查
CHECK TABLE innodb_table;
-- 修復 (InnoDB 通常自動崩潰恢復)
-- 嚴重時:innodb_force_recovery = 1..6 (只讀模式導出資料)
-- my.cnf
[mysqld]
innodb_force_recovery = 3
-- 導出資料後移除參數重啟
mysqldump --single-transaction --master-data=2 (InnoDB 熱備)log_bin、expire_logs_days,支援 PITRsystemctl stop mysqld,避免 kill -9#!/bin/bash
# check_table_corruption.sh
DB=$1
mysql -N -e "SHOW TABLES FROM $DB" | while read table; do
result=$(mysql -e "CHECK TABLE $DB.$table" | grep -v "status\|OK\|Table")
if [ -n "$result" ]; then
echo "⚠️ $DB.$table: $result"
# 可選:自動修復
# mysql -e "REPAIR TABLE $DB.$table USE_FRM"
fi
done
表損壞不可怕,可怕的是「無備份、無監控、不懂修復」。記住:**MyISAM 用 REPAIR TABLE USE_FRM 保資料,InnoDB 靠崩潰恢復與備份**。建立完整備份策略,才是資料安全的終極保障。