首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL「表已滿」錯誤完整避坑指南:臨時表、InnoDB 表空間、檔案系統與指標限制

     編輯:MySQL 資料庫相關知識

錯誤類型與根因對照

錯誤訊息核心原因適用版本/引擎
The table '...' is full記憶體臨時表超過 tmp_table_sizeMySQL < 3.23 / HEAP 引擎
The table '...' is fullInnoDB 表空間耗盡InnoDB
The table '...' is full作業系統檔案大小限制(2GB/4GB)ISAM/MyISAM on 32-bit OS
The table '...' is fullMyISAM 內部行指標達上限MyISAM (未指定 MAX_ROWS)

分場景解決方案

1. 記憶體臨時表溢出(舊版本)

  • 啟動參數:mysqld --tmp_table_size=64M 或 --big-tables
  • Session 級:SET SQL_BIG_TABLES=1;
  • MySQL 3.23+:自動轉換為磁碟 MyISAM 表,無需干預。

2. InnoDB 表空間不足

  • 擴充 ibdata1 或新增 ibdata2:
    innodb_data_file_path = ibdata1:12M:autoextend:max:2G;ibdata2:50M:autoextend
  • 啟用 innodb_file_per_table=1(預設開啟),單表單獨 .ibd 檔案,便於管理。
  • 監控:SHOW VARIABLES LIKE 'innodb_data_file_path'; / df -h 確認磁碟空間。

3. 作業系統檔案大小限制

  • 32 位元系統:單一檔案 2GB/4GB 上限。
  • 解決:升級 64 位元 OS + 64 位元 MySQL;或使用 innodb_file_per_table 分散檔案。

4. MyISAM 內部行指標上限

預設 6 位元組指標支援 65,536 TB,極少觸及。若確有需求:

-- 檢查當前上限
SHOW TABLE STATUS LIKE 'tbl_name';
myisamchk -dv /path/to/tbl_name.MYI

-- 調大指標(需預估平均行長)
ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=100;

注意:僅含 BLOB/TEXT 表需指定 AVG_ROW_LENGTH,否則無法精確計算空間需求。

預防性監控指標

  • SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables'; 過高→調大 tmp_table_size/max_heap_table_size。
  • INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES 監控表空間使用率。
  • 設定磁碟使用率告警(>80% 觸發)。

結語

「表已滿」多為資源耗盡而非邏輯錯誤。現代 MySQL (5.6+) 配合 64 位元 OS、InnoDB file-per-table、自動擴展表空間,幾乎消除此類問題。維運重點在於容量規劃與監控告警,而非事後補救。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved