ERROR 1799 (HY000): Creating index 'PRIMARY' innodb_online_alter_log_max_size

来源:互联网 发布:武松的武功怎么样知乎 编辑:程序博客网 时间:2024/05/09 10:43

 线上字段修改表机构,遇到新问题。

mysql> alter table productinfo.pd_info add is_batch tinyint(1) unsigned not null default 1,add index idx_is_batch (is_batch);


ERROR 1799 (HY000): Creating index 'PRIMARY' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.

报错分析:该表是线上的核心表,每秒钟至少要有4条数据插入。所以在修改表结构期间默认的innodb_online_alter_log_max_size=128M 远远不够。

而且该表大概有25G的数量,所以要想修改成功必须增大该值,但是该值也不易过大。需调试到一个合适的值。

mysql> 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)


set global innodb_online_alter_log_max_size=268435456;

mysql> alter table productinfo.pd_info add is_batch tinyint(1) unsigned not null default 1,add index idx_is_batch (is_batch);
^[[AQuery OK, 0 rows affected (3 hours 32 min 2.33 sec)
Records: 0  Duplicates: 0  Warnings: 0

修改成功。


总结如下:

根据错误信息中的内容在MySQL手册中找到了innodb_online_alter_log_max_size这一参数。该参数是MySQL5.6.6新加入的一个参数,用以指定对InnoDB表做在线DDL操作时所使用的临时日志文件的最大大小(以字节为单位,默认128M)。在创建索引或者ALTER表时会使用该临时文件。该文件记录了DDL操作期间插入、更新、删除的数据。在必要的时候该日志文件的大小会根据innodb_sort_buffer_size的值增加容量直至达到innodb_online_alter_log_max_size指定的最大值。若临时表的大小超出此上限则ALTER表的操作会失败,当前所有未提交的DML操作会回滚。因此,一个较大的值允许在线DDL操作期间有更多的DML被执行,但是过大的值会使DDL操作结束后表被锁定起来以应用日志中的数据时花很长的时间。


0 0