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文件,但是我想尽可能less地影响在服务器上运行的其他数据库资源。

你推荐我什么?

我在CentOS 6.4上有mysql-5.1.67-1.el6_3.x86_64

提前致谢!

你可以启动另一个ibdata文件

但是,在你做之前,你需要知道什么占用了ibdata1ibdata2

  • 表数据(如果innodb_file_per_table被禁用)
  • 表索引(如果innodb_file_per_table被禁用)
  • MVCC(Multiversioning并发控制)数据
  • 表元数据
  • 回滚段
  • 撤消日志
  • 双写缓冲区

InnoDB架构

InnoDB架构

我曾经处理了过去与我的前雇主的客户之一添加ibdata3(请参阅我的DBA StackExchange文章如何解决“表…已满”与“innodb_file_per_table”? )。 这是必要的,因为ibdata2达到了2,196,875,759,616字节的ext3上限。 你没有这种情况。

你可以和你的想法一起去

 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的摆动室, 这是不够的

build议

如果要将所有数据保留在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} 

每次你运行这个,你都会知道有多less空闲空间。 您不需要知道涉及哪个表,因为任何InnoDB表都有可能在摆动空间(用于撤消信息的空间)不存在时抱怨它已满。