【MySQL】ERROR 1799 (HY000) innodb_online_alter_log_max_size参数过小的一则case

【问题描述 】:
版本:MySQL 5.6.36 (以上的版本都可能出现)
行为:对某些访问频繁的大表做Online DDL
现象:
ERROR 1799 (HY000): Creating index 'GEN_CLUST_INDEX' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.

比如:

  1. mysql> ALTER TABLE a ENGINE=innodb;
  2. ERROR 1799 (HY000): Creating index 'GEN_CLUST_INDEX' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.

  3. mysql> ALTER TABLE a DROP idx_name;
  4. ERROR 1799 (HY000): Creating index 'idx' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.


只要是DDL相关的,就可能遇到这样的问题,比如在optimize table时:
  1. mysql> OPTIMIZE TABLE a;
  2. +--------+----------+----------+-------------------------------------------------------------------+
  3. | Table  | Op       | Msg_type | Msg_text                                                          |
  4. +--------+----------+----------+-------------------------------------------------------------------+
  5. | test.a | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
  6. | test.a | optimize | error    | Creating index 'FTS_DOC_ID_INDEX' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again. |
  7. | test.a | optimize | status   | OK                                                                |
  8. +--------+----------+----------+-------------------------------------------------------------------+
  9. 2 rows in set (18.13 sec)
虽然optimize对innodb表没什么用,但是仍然会抛出该错误


那么查看一下手册,可以得知:
innodb_online_alter_log_max_size控制在用于在Online DDL操作时的一个临时的日志文件的上限值大小。
该临时的日志文件存储了在DDL时间内,dml操作的记录。 这个临时的日志文件 依照 innodb_sort_buffer_size的值做扩展。
如果该日志超过了 innodb_online_alter_log_max_size的最大上限,DDL操作则会抛出失败,并且回滚所有未提交的DML操作。
反过来说,该值如果设置更高,则可以允许在做Online DDL时,有更多的DML操作 发生。
但因此带来的问题就是,在DDL做完之后,需要更多时间来锁表和应用这些日志。


另外对于某些DDL操作,比如
ADD INDEX/COLUMN,则可以通过调整innodb_sort_buffer_size的大小来加快操作速度。
但是实际上分配的内存为3倍的i nnodb_sort_buffer_size值。

innodb_online_alter_log_max_size i nnodb_sort_buffer_size均为5.6 Online DDL的新参数。



【解决方案】:

知道这个参数控制的是什么东西,就好解决了。
临时调大该值,此处改成了256MB:
  1. mysql> SET GLOBAL innodb_online_alter_log_max_size=256*1024*1024;
  2. Query OK, 0 rows affected (0.03 sec)

该值默认为128MB,还是建议在做完DDL之后再将其改为默认值,也就是134217728。



作者微信公众号(持续更新)


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29773961/viewspace-2140971/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29773961/viewspace-2140971/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值