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

MySQL MyISAM 索引損壞修復實戰:myisamchk 指令詳解與預防策略

     編輯:MySQL 綜合教學

MySQL MyISAM 索引損壞修復實戰:myisamchk 指令詳解與預防策略

MyISAM 表在斷電、殺進程、磁碟故障後易發生 Table '...' is marked as crashed and should be repaired。本文詳解 myisamchk 三級修復模式、資料檔重建索引、.frm 損壞重建、以及遷移 InnoDB 徹底根治方案。

現象與原因

  • 動態頁面高頻 UPDATE/INSERT + 無事務保護 → 索引與資料不一致。
  • OS Crash / 斷電 / kill -9 → 緩衝區未刷盤,.MYI 損壞。
  • 磁碟壞軌 / 檔案系統錯誤 → 物理損壞。

myisamchk 三級修復 (由輕到重)

# 停止 MySQL 服務 (必須離線操作)
systemctl stop mysql

# 1. 快速修復 (僅修復索引樹,最快)
myisamchk --recover --quick /var/lib/mysql/db_name/table_name.MYI

# 2. 標準修復 (重建索引,修復資料列刪除標記)
myisamchk --recover /var/lib/mysql/db_name/table_name.MYI

# 3. 安全修復 (逐行讀取資料檔重建索引,最慢但最徹底)
myisamchk --safe-recover /var/lib/mysql/db_name/table_name.MYI

# 修復後檢查
myisamchk --check /var/lib/mysql/db_name/table_name.MYI

# 重啟服務
systemctl start mysql

進階:索引檔遺失/損壞無法修復 → 用 .MYD + .frm 重建

# 1. 備份資料檔
cp /var/lib/mysql/db_name/table_name.MYD /tmp/

# 2. 進入 MySQL 刪除表內容 (保留結構)
mysql -e "DELETE FROM db_name.table_name;"

# 3. 退出 MySQL,用備份覆蓋空資料檔
cp /tmp/table_name.MYD /var/lib/mysql/db_name/table_name.MYD

# 4. 標準修復 (根據 .MYD + .frm 重建 .MYI)
myisamchk --recover /var/lib/mysql/db_name/table_name.MYI

.frm 損壞/遺失 → 用 CREATE TABLE 重建結構

# 1. 備份 .MYD .MYI
cp /var/lib/mysql/db_name/table_name.{MYD,MYI} /tmp/

# 2. 刪除舊表檔案 (含 .frm)
rm /var/lib/mysql/db_name/table_name.*

# 3. 用原建表 SQL 重建 (需保存原 DDL)
mysql -e "CREATE TABLE db_name.table_name (...) ENGINE=MyISAM;"

# 4. 覆蓋資料/索引檔
cp /tmp/table_name.{MYD,MYI} /var/lib/mysql/db_name/

# 5. 標準修復
myisamchk --recover /var/lib/mysql/db_name/table_name.MYI

myisamchk 關鍵參數

參數說明
-c, --check僅檢查不修復
-r, --recover標準修復
-q, --quick快速模式 (配合 -r)
-o, --safe-recover安全模式
-f, --force覆蓋舊 .TMD 暫存檔
--parallel-recover並行修復 (多核)
--sort_buffer_size=256M排序緩衝 (大表加速)
--key_buffer_size=512M索引緩衝

線上修復替代方案 (不停機)

-- MySQL 內建 (需 MyISAM 表)
REPAIR TABLE db_name.table_name;           -- 相當於 --recover
REPAIR TABLE db_name.table_name QUICK;     -- 相當於 --recover --quick
REPAIR TABLE db_name.table_name EXTENDED;  -- 相當於 --safe-recover

-- 但 REPAIR TABLE 仍會鎖表,大表業務不可用

根治方案:遷移至 InnoDB

ALTER TABLE db_name.table_name ENGINE=InnoDB;
-- 獲得:事務、行鎖、Crash-safe、Foreign Key、線上 DDL (8.0+)
-- 代價:磁碟空間 +20~30%、主鍵查詢略慢 (聚簇索引雙層查找)

若業務無全文搜尋/空間索引需求,**強制遷移 InnoDB** 是一次性解決 MyISAM 損壞、鎖表、無事務等所有歷史包袱的最佳選擇。


結語:myisamchk 是搶險工具,不是常態手段。建立「MyISAM 零容忍」政策:新表預設 InnoDB、存量表計劃遷移、備份驗證包含 CHECK TABLE,才能從根本上消除索引損壞風險。

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