阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

123次阅读
没有评论

共计 2007 个字符,预计需要花费 6 分钟才能阅读完成。

【问题描述】:
版本: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.

比如:

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

mysql> ALTER TABLE a DROP idx_name;
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 时:

mysql> OPTIMIZE TABLE a;
+——–+———-+———-+——————————————————————-+
| Table  | Op      | Msg_type | Msg_text                                                          |
+——–+———-+———-+——————————————————————-+
| test.a | optimize | note    | Table does not support optimize, doing recreate + analyze instead |
| 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. |
| test.a | optimize | status  | OK                                                                |
+——–+———-+———-+——————————————————————-+
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 倍的 innodb_sort_buffer_size 值。

innodb_online_alter_log_max_size 和 innodb_sort_buffer_size 均为 5.6 Online DDL 的新参数。

【解决方案】:

知道这个参数控制的是什么东西,就好解决了。
临时调大该值,此处改成了 256MB:

mysql> SET GLOBAL innodb_online_alter_log_max_size=256*1024*1024;
Query OK, 0 rows affected (0.03 sec)

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

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-06/145042.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计2007字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中