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

MySQL MyISAM 引擎常見故障診斷與修復:表損壞、大文件限制、磁碟空間、多實例部署

     編輯:MySQL 綜合教學

MyISAM 存儲引擎四大高發問題根因分析與標準化修復方案

雖然 InnoDB 已成主流,但大量既有系統仍運行 MyISAM 表。其非事務、表級鎖、文件分離(.frm/.MYD/.MYI)特性導致特定故障模式。本文系統整理表損壞修復、大文件突破、磁碟空間遷移、多實例隔離四大場景解決方案。

場景一:MyISAM 表損壞診斷與修復

典型錯誤現象

  • .frm 被鎖定無法修改
  • 找不到 .MYI 索引文件
  • Incorrect information in file / Can't find file
  • Unexpected end of file / Table is marked as crashed
  • Got error nnn from storage engine

修復方案 A:myisamchk 離線修復(需停機)

# 1. 停止 MySQL 服務
systemctl stop mysqld

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

# 3. 檢查損壞程度
myisamchk *.MYI
# 或指定表
myisamchk table_name.MYI

# 4. 標準修復 (-r recover)
myisamchk -r table_name

# 5. 安全修復 (-o safe-recover),速度較慢但成功率更高
myisamchk -o table_name

# 6. 強制修復 (-f force),覆寫臨時文件
myisamchk -r -f table_name

修復方案 B:SQL 線上修復(無需停機,但加鎖)

-- 檢查表
CHECK TABLE table_name;
-- 或詳細模式
CHECK TABLE table_name EXTENDED;

-- 修復表
REPAIR TABLE table_name;
-- 等效 myisamchk -r,支援 USE_FRM 選項

預防措施:自動修復配置

在 my.cnf [mysqld] 區段添加:

myisam_recover_options=FORCE,BACKUP
選項行為
DEFAULT無自動修復
BACKUP修復前備份 .MYD 為 .BAK
FORCE即使丟失資料列也強制修復
QUICK無刪除塊時跳過資料列掃描

場景二:MyISAM 表文件大小突破 2GB/4GB 限制

根因

32 位系統或舊版 MySQL 預設 MAX_ROWS / AVG_ROW_LENGTH 導致單文件上限 2GB(含索引 4GB)。

解決方案

-- 建表時指定
CREATE TABLE big_table (
    id INT PRIMARY KEY,
    data TEXT
) DATA DIRECTORY='/mnt/disk2/mysql_data' 
  INDEX DIRECTORY='/mnt/disk3/mysql_index';

符號連結方式(舊版相容):

# my.cnf
innodb_data_file_path=ibdata1:12G:autoextend:max:50G;/mnt/disk2/ibdata2:10G:autoextend

修改後必須重啟服務生效。InnoDB 無法像 MyISAM 獨立遷移單表,只能整體擴展表空間。

場景四:單機部署多個 MySQL 實例

核心隔離要素(四不同)

資源隔離方式配置參數
安裝目錄不同 prefixCMAKE_INSTALL_PREFIX
資料目錄不同 datadirdatadir
通訊埠不同 portport (預設 3306)
Socket 文件不同 socketsocket (預設 /tmp/mysql.sock)

實例配置範例

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