首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 錯誤 Incorrect file format 解決實戰:表損壞修復與資料挽救

     編輯:MySQL 綜合教學

前言

「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

三、修復指令階梯 (由輕到重)

Level 1:SQL 指令修復 (資料保留)

-- 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 結構重建索引,**資料不遺失**,適用於索引檔損壞但資料檔完整。

Level 2:myisamchk 離線修復 (效能更好、功能更全)

# 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

Level 3:備份還原 (最後手段)

# 從備份還原 .MYD、.MYI、.frm
# 或從 SQL Dump 重建
mysql -u root -p mydb < backup_20240115.sql

四、實戰案例:索引檔為 0 bytes

  1. 發現 table.MYI 大小為 0
  2. 從較早備份複製 .MYI 覆蓋
  3. 執行 REPAIR TABLE table_name → 報錯 Table 'table' is marked as crashed and should be repaired
  4. 再次執行 REPAIR TABLE table_name → 修復成功,**但資料變空表**
  5. 原因:舊 .MYI 對應舊結構,表結構已變更 (ALTER TABLE),導致不匹配
  6. 正確做法:直接執行 REPAIR TABLE table_name USE_FRM,根據當前 .frm 重建索引,資料保留

五、資料檔也損壞怎麼辦?

  • .MYD 損壞:REPAIR TABLE 可能無法完全恢復
  • 嘗試 myisamchk --safe-recover
  • 最終依賴備份:定期 mysqldump + 二進制日誌 = 任意時間點恢復

六、InnoDB 表損壞處理 (不同機制)

InnoDB 有雙寫緩衝、Redo Log、Checksum,損壞機率極低:

-- 檢查
CHECK TABLE innodb_table;

-- 修復 (InnoDB 通常自動崩潰恢復)
-- 嚴重時:innodb_force_recovery = 1..6 (只讀模式導出資料)
-- my.cnf
[mysqld]
innodb_force_recovery = 3

-- 導出資料後移除參數重啟

七、預防措施清單

  1. 優先使用 InnoDB:ACID、崩潰恢復、Checksum 多重保護
  2. 定期備份:mysqldump --single-transaction --master-data=2 (InnoDB 熱備)
  3. 啟用二進制日誌:log_bin、expire_logs_days,支援 PITR
  4. 監控磁碟空間:磁碟滿是損壞主因
  5. 優雅關機:systemctl stop mysqld,避免 kill -9
  6. 定期 CHECK TABLE:納入巡檢腳本,早發現早處理
  7. RAID / 雲端磁碟:硬體層面冗余

八、自動化巡檢腳本

#!/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 靠崩潰恢復與備份**。建立完整備份策略,才是資料安全的終極保障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved