MyISAM 表寫入報錯:The table is full。資料檔(.MYD)接近 4GB(4,294,967,296 bytes),實際為 4,294,963,640 bytes。
MyISAM 預設使用 32 位元檔案指標(Datafile pointer = 4 bytes),最大可定址 4GB。myisamchk -dv 顯示 Max datafile length: 4294967296。
ALTER TABLE cdb_posts
MAX_ROWS=1000000000
AVG_ROW_LENGTH=15000;
設定極大值強制 MyISAM 升級為 64 位元指標(8 bytes),理論支援 256TB(實際受限於檔案系統)。
myisamchk -dv cdb_postsMax datafile length: 281474976710654 # 256 TB
Max keyfile length: 4398046510079 # 4 TB (索引仍為 4GB 指標)
資料檔限制成功突破,索引檔仍受 4GB 限制(極少觸及)。
類比:日記本目錄原用 1 字節編頁(0-9),頁數超過 10 目錄失效。ALTER 告知「本子有 10 億頁,每頁 1.5 萬字」,MyISAM 配置 8 字節目錄指標,完美定址。
| 場景 | 建議方案 |
|---|---|
| MyISAM 歷史大表,暫不遷移 | ALTER TABLE MAX_ROWS/AVG_ROW_LENGTH |
| 新專案/可遷移 | 直接用 InnoDB(支援 64TB 表空間、Crash Safe) |
| 需全文搜尋(MyISAM 優勢) | MySQL 5.6+ InnoDB Fulltext 可替代 |
| 唯讀歸檔大表 | 壓縮表 myisampack + 突破 4GB |
df -T、ulimit -f unlimited。一條 ALTER 指令,徹底解決 MyISAM 4GB 瓶頸,為歷史系統爭取遷移時間窗口。