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 文件

然而,在这样做之前,您需要知道什么占据了ibdata1ibdata2

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

相关内容