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

Dedecms MySQL 表損壞修復實戰:REPAIR TABLE、myisamchk 與預防機制全解析

     編輯:MySQL 資料庫相關知識

現象識別

MySQL Error: #1034 - Incorrect key file for table 'dede_arctype'; try to repair it

典型 MyISAM 索引檔 (.MYI) 損壞,常見於:非正常關機 (kill -9/斷電)、磁碟壞軌、檔案系統錯誤、複製 .MYD/.MYI 檔案時資料庫未停止、磁碟空間耗盡。

方案一:SQL 層修復 (推薦、無需停庫、支援線上)

-- 1. 標準修復 (最常用)
REPAIR TABLE `dede_arctype`;

-- 2. 快速修復 (僅檢查索引樹,不掃描資料列)
REPAIR TABLE `dede_arctype` QUICK;

-- 3. 擴展修復 (嘗試恢復每一行,極慢,最後手段)
REPAIR TABLE `dede_arctype` EXTENDED;

-- 4. 索引檔遺失/損壞嚴重時,利用 .frm 定義重建索引
REPAIR TABLE `dede_arctype` USE_FRM;

返回結果解讀:

| Table         | Op    | Msg_type | Msg_text                    |
| dede_arctype  | repair| status   | OK                          |  <-- 成功
| dede_arctype  | repair| warning  | Number of rows changed from 0 to 123 |  <-- 資料行數修正
| dede_arctype  | repair| error    | Can't find file: 'xxx.MYI'  |  <-- 需 USE_FRM

方案二:命令列 myisamchk (需停庫、離線、更徹底)

# 1. 停止 MySQL
systemctl stop mysqld

# 2. 進入資料目錄
cd /var/lib/mysql/dedecms/

# 3. 檢查
myisamchk *.MYI

# 4. 修復 (標準)
myisamchk -r dede_arctype.MYI

# 5. 強力修復 (含資料掃描)
myisamchk -r -o dede_arctype.MYI

# 6. 索引檔遺失重建
myisamchk -r --update-state dede_arctype.MYI

# 7. 啟動 MySQL
systemctl start mysqld

參數說明:-r recover、-o safe-recover (更慢更徹底)、--update-state 更新狀態資訊、-q quick (配合 -r)。

方案三:複製檔案遷移後的修復 (本文場景)

若是直接複製 .frm/.MYD/.MYI 檔案到新伺服器:

  1. 確保 MySQL 版本相容 (主版本號一致,如 5.7→5.7)
  2. 確保檔案擁有者 mysql:mysql、權限 660
  3. 執行 REPAIR TABLE ... USE_FRM 重建索引
  4. 若仍失效,嘗試 myisamchk -r 離線修復

InnoDB 表損壞怎麼辦?

InnoDB 不支援 REPAIR TABLE (僅支援檢查)。損壞處理流程:

  1. innodb_force_recovery = 1..6 分級啟動 (只讀模式) 導出資料
  2. 導出後 DROP TABLE、重建表、導入資料
  3. 嚴重時需從備份恢復 (XtraBackup 物理備份最快)

結論:核心業務務必使用 InnoDB,避免 MyISAM 表損壞風險。

預防機制:從源頭杜絕表損壞

風險點預防措施
非正常關機系統層配置 UPS、shutdown -h now、MySQL innodb_fast_shutdown=1
磁碟故障RAID 1/10、SMART 監控、定期 badblocks 掃描、雲端磁碟自動複製
磁碟空間滿監控告警 80%/90%、Binlog 自動清理 (expire_logs_days)、定期歸檔
複製檔案遷移嚴禁運行中複製;用 mysqldump/XtraBackup/主從同步遷移
MyISAM 固有缺陷核心表全面遷移 InnoDB,僅保留唯讀日誌表用 MyISAM

自動化巡檢腳本 (每日排程)

#!/bin/bash
# 檢查所有 MyISAM 表是否標記為損壞
mysql -NBe "SELECT CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) 
  FROM information_schema.TABLES 
  WHERE ENGINE='MyISAM' AND TABLE_COMMENT LIKE '%corrupt%'" | \
while read table; do
    echo "[$(date)] 發現損壞表: $table,自動修復..."
    mysql -e "REPAIR TABLE \`${table#*.}\`;" ${table%.*}
    # 記錄日誌、發送告警
done
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved