问题描述mysql
今天对线上某个业务的大表120G进行重建表操做时遇到报错,该表有个比较显著的特征是*写入量比较大,天天写入加更新的频率在数千万级别。大体的环境sql
1 版本:Percona 5.6.24 ui
2 操做:经过alter table xx engine=innodb 重建表 spa
现象以下:日志
db [RO] 09:55:50 >alter table xx engine=innodb; ERROR 1799 (HY000): Creating index 'PRIMARY' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again. db [RO] 10:58:38 >show variables like 'innodb_online_alter_log_max_size'; +----------------------------------+-----------+ | Variable_name | Value | +----------------------------------+-----------+ | innodb_online_alter_log_max_size | 134217728 | +----------------------------------+-----------+ 1 row in set (0.00 sec)
经过官方文档介绍innodb_online_alter_log_max_size 是MySQL 5.6版本引入。code
该参数限定了online ddl操做时使用的临时日志文件的最大大小(以字节为单位,默认为128M)。在建立索引或者对表进行alter操做时,该日志文件存储了DDL操做期间对表的 insert,update,delete的数据记录。临时日志文件每次以innodb_sort_buffer_size为单位进行扩展直至达到 innodb_online_alter_log_max_size设置的最大值。若是临时日志的大小超出规定限,则online ddl操做失败,当前全部未提交的DML操做会回滚。该参数设置日志文件太大带来的负面影响是可能会致使DDL操做最后锁定表(Waiting for table metadata lock)的时间更长,由于要花费更长的时间应用日志到表上。blog
解决方法:调整该参数的大小索引
mysql> set global innodb_online_alter_log_max_size=268435456; 文档
online ddl操做完成以后 能够再将值修改成原来的值。it