MySQL Error: #1034 - Incorrect key file for table 'dede_arctype'; try to repair it
典型 MyISAM 索引檔 (.MYI) 損壞,常見於:非正常關機 (kill -9/斷電)、磁碟壞軌、檔案系統錯誤、複製 .MYD/.MYI 檔案時資料庫未停止、磁碟空間耗盡。
-- 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
# 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 檔案到新伺服器:
mysql:mysql、權限 660REPAIR TABLE ... USE_FRM 重建索引myisamchk -r 離線修復InnoDB 不支援 REPAIR TABLE (僅支援檢查)。損壞處理流程:
innodb_force_recovery = 1..6 分級啟動 (只讀模式) 導出資料DROP TABLE、重建表、導入資料結論:核心業務務必使用 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