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

MySQL MyISAM 表損壞:原因、症狀、預防與修復全流程(myisamchk、CHECK/REPAIR TABLE、mysqlcheck 批量)

     編輯:MySQL 綜合教學

MyISAM 表因無事務、索引與數據分離,極易因斷電、殺進程、磁盤故障導致損壞。本文系統梳理損壞成因、典型報錯、預防體系,並對比三種修復路徑:SQL 層 CHECK/REPAIR TABLE、命令列 myisamchk、批量工具 mysqlcheck,助你在故障發生時快速止血。

一、損壞核心成因

  1. 非正常關閉:斷電、kill -9、服務器死機、MySQL 進程被 OOM Killer 殺掉 → 數據文件 (.MYD) 與索引文件 (.MYI) 不一致。
  2. 硬體故障:磁盤壞道、RAID 降級、控制器緩存掉電未刷盤。
  3. MySQL Bug:早期版本特定場景下索引寫入邏輯缺陷(升級修復)。

二、典型症狀與報錯

現象典型錯誤信息
查詢報錯Incorrect key file for table '...'. Try to repair it
數據缺失/不全Can't find record in '...' 或返回行數少於預期
表標記崩潰Table '...' is marked as crashed and should be repaired
無法打開Can't open file: 'xxx.MYI' (errno: 145)

三、預防體系(事前)

  1. 定期檢查:cron 跑 mysqlcheck -A -c 或 CHECK TABLE。
  2. 大批量寫入後優化:OPTIMIZE TABLE 整理碎片,降低損壞概率。
  3. 優雅關閉:systemctl stop mysqld / mysqladmin shutdown,禁用 kill -9。
  4. UPS 電源 + RAID 1/10:硬體層面杜絕斷電與單盤故障。
  5. 升級穩定版:避開已知 Bug 版本(如 5.1.x 早期、5.5.0-5.5.7)。
  6. 專機專用:DB 服務器不跑業務進程,減少 OOM/CPU 抽佔導致的意外重啟。

四、修復路徑對比

場景推薦工具前置條件優缺點
MySQL 服務正常運行CHECK/REPAIR TABLE表可訪問在線操作,加讀/寫鎖,大表耗時長
MySQL 無法啟動/服務掛掉myisamchk服務完全停止離線操作,速度最快,需手動指定 .MYI 路徑
批量巡檢/修復所有庫mysqlcheck服務運行一鍵全庫,支援並行,適合維護窗口

五、SQL 層修復實戰

-- 1. 進入庫
mysql -uroot -p -D db_name

-- 2. 檢查
CHECK TABLE tbl_name;
-- Msg_type=Error/Corrupt 需修復

-- 3. 修復
REPAIR TABLE tbl_name;           -- 單表
REPAIR TABLE tbl1, tbl2, tbl3;   -- 多表

-- 4. 複查
CHECK TABLE tbl_name;            -- 期望 Msg_text='OK'

注意:REPAIR TABLE 會重建 .MYI,若 .MYD 也損壞可能丟失數據,建議先備份 cp tbl_name.* /backup/。

六、myisamchk 離線修復(服務停止時)

# 1. 停止服務
systemctl stop mysqld

# 2. 定位數據目錄
cd /var/lib/mysql/db_name

# 3. 檢查單表
myisamchk tbl_name.MYI

# 4. 修復(-r 恢復模式,-q 快速,-f 強制)
myisamchk -r -q tbl_name.MYI        # 快速恢復(推薦首選)
myisamchk -r -f tbl_name.MYI        # 強制恢復(快速失敗時)

# 5. 批量修復整個庫
myisamchk -r -q *.MYI

啟動腳本掛載:在 /etc/rc.local 或 systemd 啟動前掛載:

[ -S /var/lib/mysql/mysql.sock ] || myisamchk -r -q /var/lib/mysql/*/*.MYI

確保 MySQL 未啟動時自動修復。

七、mysqlcheck 批量巡檢修復

# 檢查並修復所有庫所有表
mysqlcheck -A -c -r -u root -p

# 僅修復(跳過檢查)
mysqlcheck -A -r -u root -p

# 併行加速(MySQL 5.6+)
mysqlcheck -A -r --parallel=4 -u root -p

八、修復後驗證清單

  1. CHECK TABLE tbl_name 返回 OK。
  2. SELECT COUNT(*) FROM tbl_name 與業務預期一致。
  3. 關鍵業務查詢 EXPLAIN 走預期索引。
  4. 錯誤日誌無新增 crashed/corrupt 關鍵字。

MyISAM 損壞不可怕,可怕的是「無預案、無備份、無演練」。建立「日巡檢、周優化、月演練」機制,才是根治之道。

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