
症狀
4.x, 5.0.84 及以下, 5.1.37 及以下, 帶 InnoDB 插件的5.1.40及以下
使用 InnoDB 表空間且不使用 innodb_file_per_table 的所有版本
重制問題:
使用自動擴充 InnoDB 表空間包括使用 innodb_file_per_table 的所有版本
原因
4.x, 5.0.84 及以下, 5.1.37 及以下, 及帶 InnoDB 插件的5.1.40 及以下
使用 fixed size InnoDB 表空間和不使用 innodb_file_per_table的所有版本
使用自動擴充InnoDB 表空間包括使用 innodb_file_per_table的所有版本
解決方案
Versions 4.x, 5.0.84 及以下, 5.1.37 及以下, 帶 InnoDB 插件的5.1.40 及以下
使用固定大小InnoDB 表空間和不使用 innodb_file_per_table 的所有版本
使用自動擴充 InnoDB 表空間包括使用 innodb_file_per_table 的所有版本
應用于:
MySQL伺服器版本4.0 及以上
本文資訊适用于所有平台。
症狀
這個錯誤的方式有兩種可能:
4.x, 5.0.84 及以下, 5.1.37 及以下,以及帶InnoDB插件的5.1.40及以下版本
當運作以下MySQL 伺服器版本之一:
MySQL 4.0 和1的所有版本
0.84 及以下
不帶InnoDB插件的MySQL 5.1:1.37 及以下
帶InnoDB插件的MySQL 5.1:1.40 及以下
當有多于1023個動态事務且錯誤資訊”Table is Full”被傳回到用戶端。有時會發生插入錯誤。錯誤日志會包含一個更描述性的錯誤資訊:
110912 14:52:14 InnoDB: Warning: cannot find a free slot for an undo log. Do you have too
InnoDB: many active transactions running concurrently?
所有版本 使用固定大小的 InnoDB 表空間且不使用 innodb_file_per_table
當 InnoDB 表空間設為固定大小且不使用 innodb_file_per_table 選項時,嘗試将資料插入InnoDB 表時,會發生以下錯誤:
The table ‘’ is full
其中 是表名。相應的 MySQL 錯誤代碼和SQL 狀态是:
MySQL Error Code: 1114
SQLState: HY000
顯示在MySQL錯誤日志中的錯誤取決于在使用的InnoDB存儲引擎版本:
對于帶InnoDB插件的MySQL 5.1 和MySQL 5.5 及以上,錯誤日志包含如下錯誤:
InnoDB: Error: Data file(s) ran out of space.
Please add another data file or use ‘autoextend’ for the last data file.
110908 12:18:13 [ERROR] /usr/sbin/mysqld: The table ‘’ is full
對于MySQL/InnoDB 更早的版本(包括有InnoDB的buildin版本的MySQL 5.1 ),錯誤資訊是:
110908 13:25:37 [ERROR] /usr/sbin/mysqld: The table ‘t1’ is full
即使 SHOW TABLE STATUS 或 SELECT * FROM information_schema.TABLES 顯示InnoDB 表有大于0的Data_free 。
重制問題:
該問題能通過以下步驟重制:
以重新安裝的MySQL啟動
在首次啟動MySQL之前,在你的my.cnf中有這樣的設定
innodb_data_file_path = ibdata1:100M
且確定沒有啟動 innodb_file_per_table
啟動MySQL并讓InnoDB 建立資料檔案
登入到MySQL并運作:
CREATE DATABASE innodbtest;
use innodbtest
CREATE TABLE t1 (id mediumint unsigned NOT NULL auto_increment PRIMARY KEY) ENGINE=InnoDB;
不斷将行插入到表中,直到查詢傳回 The table ‘t1’ is full。
當空間即将耗盡,錯誤資訊類似于:
SQLSTATE[HY000]: General error: 1114 The table ‘t1’ is full
運作SHOW TABLE STATUS:
mysql> SHOW TABLE STATUS LIKE 't1'\G
*************************** 1. row ***************************
Name: t1
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 3918789
Avg_row_length: 23
Data_length: 90800128
Max_data_length: 0
Index_length: 0
Data_free: 4194304
Auto_increment: 3920001
Create_time: 2011-09-08 12:14:35
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
注意即使沒有更多可用的資料,Data_free 仍是4194304 。
使用自動擴充的InnoDB表空間包括使用innodb_file_per_table的所有版本
當出現Table is full error ,在MySQL錯誤日志的常見症狀為:
2014-09-15 08:33:38 7f28aeb8a700 InnoDB: Error: Write to file /mysql/data/ibdata1 failed at offset 20971520.
InnoDB: 1048576 bytes should have been written, only -1 were written.
InnoDB: Operating system error number 28.
InnoDB: Check that your OS and file system support files of this size.
InnoDB: Check also that the disk is not full or a disk quota exceeded.
InnoDB: Error number 28 means 'No space left on device'.
InnoDB: Some operating system error numbers are described at
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/operating-system-error-codes.html
2014-09-15 08:33:38 7101 [ERROR] /usr/sbin/mysqld: The table 't1' is full
2014-09-15 08:33:39 7101 [ERROR] /usr/sbin/mysqld: The table 't1' is full
在Windows中,錯誤可能像這樣:
2014-09-15 10:04:06 12AB InnoDB: Encountered a problem with file C:\ProgramData\MySQL\ibdata1
2014-09-15 10:04:06 12AB InnoDB: Disk is full. Try to clean the disk to free space.
2014-09-15 10:04:06 13D7 [ERROR] C:\Program Files\MySQL\bin\mysqld.exe: The table 't1' is full
以上是共享的表空間的錯誤。相似錯誤能在各個表空間發生。
原因
4.x, 5.0.84及以下, 5.1.37及以下,帶InnoDB插件的5.1.40及以下版本
這是由于bug If InnoDB Runs Out of Undo Slots, It Returns Misleading ‘Table is Full’。在MySQL 5.1 及以下 InnoDB 支援最多1023個動态事務。要啟動更多将會導緻錯誤或在受該bug影響的版本中可能産生聲明assertion。
使用固定大小的InnoDB表空間和不使用innodb_file_per_table的所有版本
該問題是由于InnoDB 耗盡了在共享表空間中的可用空間。在每個參考手冊中,Table is full 錯誤表示磁盤用盡或表達到最大。對于InnoDB,當InnoDB被設為有共享的表空間,InnoDB 表空間的大小 (資料檔案) 決定了表的最大空間。
InnoDB 表空間包含預設大小為16KB的資料頁。有可能一些頁沒有被完全使用,但是實際上不太可能對新的資料進行提示。是以,SHOW TABLE STATUS報告仍有空間而實際上無法再插入任何資料是有可能的。
參見MySQL參考手冊中以下頁:
The table is full
Limits on Table Size
Configuring InnoDB
InnoDB File Space Management
使用自動擴充的InnoDB表空間包括使用innodb_file_per_table的所有版本
在這個情況下,起因可能是:
儲存表空間的磁盤已滿。
已達到設定的磁盤配額。
表空間檔案達到檔案系統支援的最大尺寸。
解決方案
4.x, 5.0.84 及以下, 5.1.37 及以下,和帶InnoDB插件的5.1.40及以下版本
解決方案是更新到MySQL的更新檔版本。以下版本被打過更新檔:
MySQL 5.0: 5.0.85及以上
不帶InnoDB插件的MySQL 5.1:1.38及以上
帶InnoDB插件的MySQL 5.1:1.41及以上
MySQL 5.5 及以上:所有版本
建議更新到可用的最新GA版本。
在更新之前總是建立資料庫部分!這包括schema,資料和資料庫需要執行的程式(函數,觸發器等)。安全總是最好的政策,是以如果在更新過程中有一些問題,很容易恢複到之前的版本。
更新教程參見:
Downloading MySQL Server
更新或下載下傳MySQL。檢查表或索引是否必須重建的部分尤其重要。對下載下傳的版本使用頁: 5, 5.1, 5.0。參見 How to Upgrade your Existing MySQL Server to MySQL 5.6 Version 獲得更多更新MySQL的幫助。
總是在對生産伺服器執行更新之前開發或階段系統中進行測試。
使用固定大小的InnoDB表空間和不使用innodb_file_per_table的所有版本
解決方案使讓InnoDB表空間增長,通過執行以下步驟完成:
總是在更改應用于生産之前,在開發或階段系統中嘗試步驟。
停止MySQL
在你喜歡的編輯器中打開MySQL配置檔案。
找到配置innodb_data_file_path 選項的行
添加一個新表空間或讓最近的表空間自動擴充:
将 innodb_data_file_path 設為
innodb_data_file_path = ibdata1:100M;ibdata2:100M
或類似的
将 innodb_data_file_path 設為
innodb_data_file_path = ibdata1:100M:autoextend
儲存MySQL配置檔案
再次啟動MySQL
确認現在能夠再次将資料插入InnoDB表
将解決方法遷移到合适的其他環境。
參見MySQL參考手冊中以下頁:
Configuring InnoDB
Adding, Removing, or Resizing InnoDB Data and Log Files
使用自動擴充的InnoDB表空間包括使用innodb_file_per_table的所有版本
由于原因是無法進一步增加表空間檔案的大小,解決方法包括:
確定表空間檔案儲存的路徑有多餘的磁盤空間(參見以下建議,如何釋放磁盤空間)。
不要為了釋放空間而删除任何InnoDB檔案,包括共享的表空間。沒有它的這些檔案,InnoDB将無法啟動。
如何取回空間的教程,參見以下。
確定沒有預設的定量會阻止表空間檔案的增長。
確定檔案系統支援的最大檔案尺寸還未達到。如果這是Table is full錯誤的原因,一些解決方案如下:
通過你将所有表儲存在共享的表空間 (innodb_file_per_table = 0):
另外建立一個共享的表空間檔案。
或者,你能另外建立一個額外共享的表空間檔案啟用 innodb_file_per_table ,進而能将表移出共享的表空間。注意到這不會降低共享的表空間大小。參見MySQL Server Variable: innodb_file_per_table獲得關于innodb_file_per_table的更多資訊。
對于每個表的表空間的檔案,對表進行分區。對已分區的表,每個分區在 自己的表空間中且innodb_file_per_table = 1,是以這是你能将總大小分割到多個檔案。
釋放磁盤空間的可能操作有:
使用OPTIMIZE TABLE 取回每個表空間的空閑空間
這需要重建在表空間檔案位置的表。是以隻有當你已經釋放了空間或将表遷移到另外的位置才有作用。(參見以下)
要取回在共享表空間檔案中的檔案,參見:How to Reclaim Unused Space and Decrease InnoDB ibdata1 Data File Size.
如果錯誤日志,慢查詢日志,一般查詢日志,審計日志等儲存在與表空間相同的磁盤。考慮重定向停止并壓縮舊日志或将舊日志移動到其他磁盤。參見:
伺服器日志維護
audit_log_rotate_on_size
如果二進制日志位于與資料相同的磁盤上,考慮清楚舊的二進制日志。
確定被清楚二進制日志是不再需要的,例,用于複制或時間點恢複。如果二進制不再需要用于複制但仍要用于恢複,你能在清楚日志之前建立備份。
確定你使用PURGE BINARY LOGS 指令來删除舊的二進制日志。
在MySQL 5.6 中,你能使用 InnoDB native links将在自己tablespace的表空間移到另一個磁盤。
将日志移到另一個磁盤。參見:
What is the General Query Log and How to Control Where the Log is Stored?
What is the Slow Query Log and How to Control Where the Log is Stored and What is Logged?
–log_ error
–audit_ log_file