首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 表損壞修復完整指南:REPAIR TABLE、myisamchk 四階段法、InnoDB 強制恢復

     編輯:MySQL 資料庫相關知識

    常見錯誤訊息

    Table 'content_tags' is marked as crashed and should be repaired

    原因:非正常關機、磁碟故障、記憶體不足導致索引寫入中斷。

    快速修復 (MyISAM)

    REPAIR TABLE `content_tags`;

    或命令列:myisamchk -r -q /var/lib/mysql/db/content_tags.MYI (快速模式,僅重建索引)

    myisamchk 系統性四階段修復流程

    階段 1:檢查

    myisamchk *.MYI              # 全庫快速檢查
    myisamchk -e *.MYI           # 延伸檢查 (含資料完整性)
    myisamchk -s *.MYI           # 靜默模式
    # 僅修復回報錯誤的表

    階段 2:簡單安全修復

    # 1. 快速修復 (僅索引)
    myisamchk -r -q tbl_name
    # 2. 失敗則標準修復 (重建索引、清理刪除記錄)
    myisamchk -r tbl_name
    # 3. 仍失敗則安全模式 (較慢但處理邊緣情況)
    myisamchk --safe-recover tbl_name
    # 修復前務必備份 .MYD .MYI .frm

    階段 3:索引檔頭損壞/遺失 - 重建索引檔

    1. 移動 .MYD 至安全處
    2. mysql -e "SET AUTOCOMMIT=1; TRUNCATE TABLE tbl_name;" db_name 產生空表結構
    3. 複製舊 .MYD 覆蓋新 .MYD
    4. 回階段 2 執行 myisamchk -r -q

    或一鍵:REPAIR TABLE tbl_name USE_FRM;

    階段 4:.frm 結構檔損壞

    1. 從備份還原 .frm → 回階段 3
    2. 無備份:同結構庫建表 → 複製 .frm .MYI → 回階段 2

    InnoDB 表損壞應對

    InnoDB 具備崩潰恢復能力,但嚴重頁損壞需強制模式:

    [mysqld]
    innodb_force_recovery = 1  # 1-6 遞增激進
    # 1: 忽略損壞頁讀取
    # 2: 禁止背景執行緒
    # 3: 不執行事務回滾
    # 4: 禁止插入緩衝合併 (較常用)
    # 5: 不掃描 Undo Log
    # 6: 不做 Redo Log 前滾 (最危險)
    1. 設定參數重啟 MySQL
    2. SELECT * INTO OUTFILE ... 導出可用資料
    3. 重建表、匯入資料
    4. 移除參數正常重啟

    警告: innodb_force_recovery > 0 期間禁止 INSERT/UPDATE/DELETE。

    預防勝於治療

    • 配置 UPS、監控磁碟健康 (SMART)
    • 啟用 sync_binlog=1、innodb_flush_log_at_trx_commit=1
    • 定期 CHECK TABLE、ANALYZE TABLE
    • 備份策略:每日全備 + 每小時增量 (Binlog/xtrabackup)
    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved