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

myisamchk 實戰指南:MyISAM 表體檢與修復全流程

     編輯:MySQL 資料庫相關知識

MyISAM 表損壞是運維噩夢,myisamchk 是官方離線檢查修復利器。本文總結大表內存調優、磁碟空間預留、分級修復流程、備份鐵律四大實戰要點,助你從容應對表損壞。

一、大表必調內存參數,否則龜速甚至 OOM

myisamchk 內存上限由 -O 參數控制,預設僅 3MB,大表完全不夠。建議:

# 檢查/修復前評估表大小
ls -lh /var/lib/mysql/db/*.MYD

# 大表單獨處理,調大內存至 16-64MB
myisamchk -O sort_buffer_size=64M -O key_buffer_size=64M \
          -O read_buffer_size=16M -O write_buffer_size=16M \
          /var/lib/mysql/db/large_table

內存過大反而擠佔系統緩存,16MB 通常是甜點;超大表(>50GB)可分多次處理或用通配符批次。

二、修復需 2-3 倍磁碟空間,預留不足必失敗

修復過程會產生臨時數據文件、新索引文件,空間需求:

  • 數據文件修復: 需 ≥ 1× 原 .MYD 大小(重建數據文件)。
  • 索引重建(-r/-r -q): 需 ≥ 1× 原 .MYI 大小 + 排序緩衝區(約 2× 數據大小)。
  • 綜合建議: 剩餘空間 ≥ 3× 表總大小(含 .MYD + .MYI + .frm)。

空間不足時可用 --quick 僅重建索引(不動數據文件),但無法修復數據層損壞。

三、分級修復流程:從輕到重,止於成功

前置動作(鐵律): STOP MYSQL → 備份原 .MYD/.MYI/.frm 至異地。

級別命令適用場景風險
1. 快速檢查myisamchk --update-state tbl常規巡檢,標記損壞表無
2. 快速修復myisamchk -r -q tbl僅索引損壞,數據文件完整極低
3. 標準修復myisamchk -r tbl數據文件有錯誤/刪除記錄殘留低(重建索引、清理無效行)
4. 索引文件毀損重建1. mv tbl.MYI /safe
2. myisamchk -c tbl 生成新 .MYI
3. cp /safe/tbl.MYD tbl.MYD
4. myisamchk -r -q tbl
索引文件前 16KB 損壞/丟失中(需手動操作,嚴格按序)
5. 極端:.frm 也損壞放棄 myisamchk,用備份集(全量+增量)整庫恢復表定義文件損壞高(需完備備份策略)

原則: 低級別修復失敗再升級;--recover 等同 -r,能解決 99% 問題,但無法修復「唯一鍵重複」等邏輯錯誤。

四、進階技巧與避坑

  • 通配符批次: myisamchk -r /var/lib/mysql/db/*.MYI 一次修復全庫。
  • 獨立文件檢查: 可直接對 .MYD/.MYI 操作,無需庫目錄。
  • 備份文化: 任何檢查修復前必備份,myisamchk 相對安全但非絕對;养成「先備份、後操作」肌肉記憶。
  • 引擎限制: 僅適用 MyISAM;InnoDB 損壞請用 innodb_force_recovery + xtrabackup 或重建副本。

總結

myisamchk 三板斧:大表加內存、修復留空間、分級按步驟。配合「停庫→備份→檢查→分級修復→驗證→啟庫」標準化 SOP,將 MyISAM 表損壞從「生產事故」降級為「常規運維動作」。長期來看,核心業務表遷移至 InnoDB 才是根治之道。

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