![InnoDB架构](https://linux22.com/image/623361/InnoDB%E6%9E%B6%E6%9E%84.png)
你好,我使用 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
。
- 表格数据(如果表 1. innodb_file_per_table被禁用)
- 表索引(如果表 1. 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 表都有可能抱怨它已满。