您好,我使用 bacula,其中一張桌子已滿:
JobId 8946: Fatal error: sql_create.c:860 Fill File table Query failed: INSERT INTO File (FileIndex, JobId, PathId, FilenameId, LStat, MD5, DeltaSeq) SELECT batch.FileIndex, batch.JobId, Path.PathId, Filename.FilenameId,batch.LStat, batch.MD5, batch.DeltaSeq FROM batch JOIN Path ON (batch.Path = Path.Path) JOIN Filename ON (batch.Name = Filename.Name): ERR=The table 'File' is full
然後我運行:
mysql> show table status from current_bacula like 'File';
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| File | InnoDB | 10 | Compact | 52153488 | 142 | 7419723776 | 0 | 2593128448 | 2605711360 | 569929045 | 2013-04-15 21:03:59 | NULL | NULL | latin1_swedish_ci | NULL | | |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
1 row in set (0.31 sec)
my.cnf 檔案具有:
innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:12800M
據我了解該命令:
ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;
是否僅適用於 MyISAM 引擎? (如果我說錯了請指正)
所以我的問題是:我可以修改嗎僅有的例如 las autotextend:max ,如下所示:
innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M
除了重新啟動服務之外,我還應該執行其他操作嗎?安全嗎?我知道我可以定義另一個 ibdataN 文件,但我希望盡可能少地影響伺服器上目前運行的其他資料庫。
你推薦我什麼?
我在 CentOS 6.4 上有 mysql-5.1.67-1.el6_3.x86_64
先致謝!
答案1
您可以啟動另一個 ibdata 文件
但是,在此之前,您需要知道ibdata1
和佔據了什麼ibdata2
。
- 表數據(如果innodb_file_per_table被禁用)
- 表索引(如果innodb_file_per_table被禁用)
- MVCC(多版本並發控制)數據
- 表元資料
- 復原段
- 撤銷日誌
- 雙寫緩衝器
InnoDB架構
我過去曾與我的前雇主的客戶之一一起添加 ibdata3(請參閱我的 DBA StackExchange 帖子如何用“innodb_file_per_table”解決“表格...已滿”?)。這是必要的,因為 ibdata2 達到了 ext3 的位元組上限2,196,875,759,616
。你不存在這種情況。
你可以按照你的想法去做
innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M
但你最好完全刪除最大值
innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend
警告
空間不足的原因是撤銷日誌。 ibdata 檔案保存 1023 個撤銷日誌。這些日誌需要迴旋空間才能操作。如果沒有內部迴旋空間,MVCC 資訊就無法在回溯時保存資料快照。你的內部迴旋餘地是2605711360
或大約2.5G
,這顯然是不夠的。對於我以前雇主的客戶,他們有106G
迴旋餘地這對他們來說還不夠。
建議
如果您想將所有資料保留在 和 中ibdata1
,ibdata2
並將設定變更為
innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M
您需要監控迴旋空間。
你可以這樣監控它
IBDATA_FILESIZE=8187281408
#
# 8187281408 is 7680M + 128M
#
SQL="SELECT SUM(data_length+index_length)"
SQL="${SQL} FROM information_schema.tables WHERE ENGINE='InnoDB'"
IBDATA_DATAINDEX=`mysql -uroot -p... -ANe"${SQL}"`
(( WIGGLE_ROOM = IBDATA_FILESIZE - IBDATA_DATAINDEX )))
echo ${WIGGLE_ROOM}
每次執行此程式時,您都會知道有多少可用空間。您不需要知道涉及哪個表,因為當不存在迴旋空間(用於撤消訊息的空間)時,任何 InnoDB 表都有可能抱怨它已滿。