MySQL 報錯 The table is full 並非單一原因,而是多種儲存層限制的統稱。本文系統梳理五大觸發場景,提供診斷查詢與精準解決方案。
現象: 內部臨時表超過 tmp_table_size 位元組。
方案:
mysqld -O tmp_table_size=1073741824(1GB)SET SESSION SQL_BIG_TABLES=1; 或啟動 --big-tables現狀: MySQL 3.23+ 已自動將超限記憶體臨時表轉為磁碟 MyISAM 表,**此場景歷史性消失**。
現象: ibdata1 或獨立表空間 .ibd 達到上限。
診斷:
SHOW VARIABLES LIKE 'innodb_data_file_path';
方案:
innodb_data_file_path=ibdata1:12M:autoextend:max:100Gmy.cnf 新增路徑 → 重啟。innodb_file_per_table=1 採用獨立表空間,單表獨立管理。現象: MyISAM .MYD 或 .MYI 達 2GB 上限。
方案:
現象: 資料量未達 OS 檔案上限,但 MyISAM 內部行指標(預設 6 位元組,支援 65536TB)因建表時未指定 MAX_ROWS 導致預估不足。
診斷:
SHOW TABLE STATUS FROM `db` LIKE 'tbl_name'\G
-- 關注 Max_data_length
myisamchk -dv /path/to/table.MYI
方案:
ALTER TABLE `tbl_name` MAX_ROWS=1000000000 AVG_ROW_LENGTH=100;
AVG_ROW_LENGTH 僅對含 BLOB/TEXT 表必要,幫助 MySQL 精準預估空間。現象: Memory 表寫入失敗,錯誤訊息同樣為 The table is full。
方案:
SET SESSION max_heap_table_size = 1073741824;(重建表生效)CREATE TABLE ... MAX_ROWS=... ENGINE=MEMORY(受 max_heap_table_size 制約)。
The table is full
│
├─ InnoDB 表? → 檢查 innodb_data_file_path / 磁碟空間 → 擴充表空間
│
├─ MyISAM 表? → 檢查 OS 檔案大小限制 / Max_data_length
│ ├─ 2GB 限制 → 升級 OS/FS 或分表/轉 InnoDB
│ └─ 指標不足 → ALTER TABLE MAX_ROWS=... AVG_ROW_LENGTH=...
│
├─ MEMORY 表? → 調大 max_heap_table_size
│
└─ 臨時表? → MySQL 3.23+ 已自動轉磁碟,無需處理
MAX_ROWS、AVG_ROW_LENGTH(預估峰值 × 2)。innodb_file_per_table=1,單表獨立表空間,便於管理與回收空間。data_free、table_rows、磁碟使用率、InnoDB 表空間使用率。OPTIMIZE TABLE(MyISAM)或 ALTER TABLE ... ENGINE=InnoDB(InnoDB)回收碎片空間。「The table is full」本質是**儲存容量規劃缺失**。建立容量基線、設定告警閾值、預留擴充通道,才是徹底解決之道。