Discuz! 論壇回覆時出現 The table is full,資料檔(MYD)大小 4,294,963,640 Bytes,逼近 4GB(4,294,967,296 Bytes)上限。環境:Linux 2.4.20(Red Hat 9)、EXT3 檔案系統(單檔支援 2TB)、雙 Athlon + SCSI 72GB + 2GB RAM。
MyISAM 預設使用 32 位元檔案指標,最大定址 4GB。透過 myisamchk -dv 可見 Max datafile length: 4G。非檔案系統限制(EXT3 支援 2TB),亦非 OS 程序限制,純屬 MyISAM 內部指標位寬不足。
ALTER TABLE cdb_posts MAX_ROWS=1000000000 AVG_ROW_LENGTH=15000;
執行約 30 分鐘(雙 Athlon 專業伺服器)。執行後再次檢視:
Max datafile length: 281474976710654 (≈256 TB) Max keyfile length: 4398046510079 (≈4 TB)
資料檔上限躍升至 256 TB,索引檔維持 4 TB,完美突破 4GB 瓶頸。
MyISAM 依 MAX_ROWS × AVG_ROW_LENGTH 估算總資料量,決定指標位元寬度(Datafile pointer)。預設值導致 4 位元組指標(32-bit)。手動指定大數值強制 MySQL 採用 6 位元組指標(48-bit),理論上限 2⁴⁸ Bytes = 256 TB。
MAX_ROWS、AVG_ROW_LENGTHmyisamchk -dv 監控 Max datafile length 指標