在使用 MySQL 時,「表已滿」錯誤可能由多種原因引發。了解各種情境下的成因與對策,能幫助您快速排除問題、保障資料庫穩定運作。
若您使用的是 MySQL 3.23 之前的版本,「記憶體中」的臨時表大小超過 tmp_table_size 設定值時,就會拋出此錯誤。解決方式有三種:
-O tmp_table_size=val 增加臨時表大小上限SET SQL_BIG_TABLES=1--big-tables 參數(等同於對所有查詢啟用 SQL_BIG_TABLES)注意: 自 MySQL 3.23 起,當記憶體臨時表超過 tmp_table_size,伺服器會自動轉換為磁碟基礎的 MyISAM 表,此問題不再發生。
使用 InnoDB 表時,若超出表空間大小,需透過擴充 InnoDB 表空間來解決(如新增資料檔案或調整 innodb_data_file_path)。
在僅支援 2GB 檔案的舊版作業系統上使用 ISAM 或 MyISAM 表,資料檔或索引檔達到此限制會導致錯誤。建議升級作業系統或遷移至支援大檔案的檔案系統。
MyISAM 表若未指定 MAX_ROWS,預設使用 myisam_data_pointer_size(預設 6 字節,可支援 65,536 TB)。若指標過小,可用 ALTER TABLE 調整:
ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;
AVG_ROW_LENGTH 僅需對含有 BLOB/TEXT 欄位的表指定,因 MySQL 無法單靠行數估算所需空間。
可使用以下指令檢視:
SHOW TABLE STATUS FROM database LIKE 'tbl_name';
# 或
myisamchk -dv /path/to/table-index-file