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

MyISAM 單表突破 4GB 限制實戰:ALTER TABLE 調整指標指標長度

     編輯:關於SqlServer

問題背景

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 內部指標位寬不足。

解決方案:調整 MAX_ROWS 與 AVG_ROW_LENGTH

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。

副作用與成本

  • 索引檔(MYI)體積微增(本案約 +1MB),極低代價
  • 無需變更檔案系統、OS 或 MySQL 版本
  • 適用所有 MyISAM 版本

操作建議

  • 預估未來資料量,給予足夠餘裕的 MAX_ROWS、AVG_ROW_LENGTH
  • 大表 ALTER 耗時極長,安排維護時段執行
  • 定期 myisamchk -dv 監控 Max datafile length 指標
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved