怎么解决MySQL中的ERROR 1799报错问题

网友投稿 448 2023-12-24

怎么解决MySQL中的ERROR 1799报错问题

这篇文章主要介绍“怎么解决MySQL中的ERROR 1799报错问题”,在日常操作中,相信很多人在怎么解决MySQL中的ERROR 1799报错问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决MySQL中的ERROR 1799报错问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

怎么解决MySQL中的ERROR 1799报错问题

【问题描述】:

版本: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。

到此,关于“怎么解决MySQL中的ERROR 1799报错问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mysql innodb的行锁举例分析
下一篇:oracle日期如何转换成星期
相关文章

 发表评论

暂时没有评论,来抢沙发吧~