InnoDB架構

InnoDB架構

您好,我使用 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架構

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迴旋餘地這對他們來說還不夠

建議

如果您想將所有資料保留在 和 中ibdata1ibdata2並將設定變更為

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 表都有可能抱怨它已滿。

相關內容