雖然 InnoDB 已成主流,但大量既有系統仍運行 MyISAM 表。其非事務、表級鎖、文件分離(.frm/.MYD/.MYI)特性導致特定故障模式。本文系統整理表損壞修復、大文件突破、磁碟空間遷移、多實例隔離四大場景解決方案。
.frm 被鎖定無法修改找不到 .MYI 索引文件Incorrect information in file / Can't find fileUnexpected end of file / Table is marked as crashedGot error nnn from storage engine# 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
-- 檢查表 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 | 無刪除塊時跳過資料列掃描 |
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 獨立遷移單表,只能整體擴展表空間。
| 資源 | 隔離方式 | 配置參數 |
|---|---|---|
| 安裝目錄 | 不同 prefix | CMAKE_INSTALL_PREFIX |
| 資料目錄 | 不同 datadir | datadir |
| 通訊埠 | 不同 port | port (預設 3306) |
| Socket 文件 | 不同 socket | socket (預設 /tmp/mysql.sock) |