微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

复制到tmp表,在自动递增时更改表

如何解决复制到tmp表,在自动递增时更改表

我们遇到了MysqL(5.5.x)的问题,希望您能为我们提供帮助。 在一天中的某个时候,我注意到状态为“复制到tmp表”的进程,并且该查询

ALTER TABLE `MyTableName` AUTO_INCREMENT=200000001

此后,所有其他查询都获得“等待表元数据锁定”,所有查询都被冻结,并且没有任何处理。

我需要终止该过程,然后从此开始所有查询

为什么?我该如何解决这个问题?

解决方法

在MySQL 5.5中,您运行的ALTER TABLE会复制整个表。表格越大,花费的时间越多。尤其是在存储速度较慢的情况下。

表的大小是多少(您可以从SHOW TABLE STATUS LIKE 'MyTableName'\G获得并查看data_length + index_length)?

我刚刚在笔记本电脑上进行了测试。我在MySQL 5.5实例中填充了一个表,直到表的大小约为175MB。运行变更表以设置自动增量值大约需要5-6秒。您的结果可能会有所不同,具体取决于服务器的功能和存储速度。

alter表正在运行时,执行该操作的线程在表上保留一个metadata lock,这会阻止所有其他查询,甚至是只读的SELECT语句。

ALTER TABLE在2013年进行了改进,作为MySQL 5.6的一项功能。某些类型的更改已优化为“就地”完成,因此,如果不需要,它们不必复制整个表。更改AUTO_INCREMENT是这些操作之一。不管表有多大,如果您更改表以更改AUTO_INCREMENT,它都会很快,因为它仅更改表的属性,而无需复制任何数据行。

请参见https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.html

在MySQL 5.5中,未实现这些优化。因此,任何更改表都需要很长时间,与表的大小成比例。

我建议您解决此问题的最佳方法是升级到新版本。 MySQL 5.5的寿命已经结束。甚至MySQL 5.6也在2021年2月寿终正寝。该升级了。

如果无法升级,则应调查什么客户端正在执行此ALTER TABLE语句。您说您在一天中的某个时候注意到了它。追踪下来。在进程列表中,它将告诉您客户端主机从何处运行该SQL语句。它还会告诉您他们登录的MySQL用户。您可能还需要搜索使用此数据库的所有应用程序或脚本的源代码。或问你的队友。

一旦发现正在执行该ALTER TABLE的客户端,请尝试将客户端运行该语句的时间更改为一天中ALTER TABLE不会阻止重要查询的时间。还是问负责的开发人员是否真的有必要如此频繁地执行此更改表?

,

问题可能是由于服务器重启引起的,因为 InnoDb将最后一个自动增量索引存储在内存中,并且在服务器重启时重新计算了 >(InnoDB AUTO_INCREMENT Counter Initialization):

如果为InnoDB表指定AUTO_INCREMENT列,则InnoDB数据字典中的表句柄将包含一个称为自动增量计数器的特殊计数器,该计数器用于为该列分配新值。该计数器仅存储在主存储器中,而不存储在磁盘上。

要在服务器重启后初始化自动递增计数器,InnoDB在包含AUTO_INCREMENT列的表中的第一个插入处执行以下语句的等效项。

从table_name中选择MAX(ai_col)进行更新;

InnoDB递增语句检索的值,并将其分配给表的列和自动递增计数器。默认情况下,该值增加1。此默认值可以被auto_increment_increment配置设置覆盖。

如果表为空,则InnoDB使用值1。此默认值可以由auto_increment_offset配置设置覆盖。

查看mysql日志,尝试找出服务器是否正在重新启动,从而导致ALTER表重置自动增量计数器。

尝试重新启动mysql服务器以查看是否获得此行为

在这种情况下,您可以尝试:

在MySQL 8.0中,此行为已更改。每次更改时,当前最大自动增量计数器值都会写入重做日志,并保存到每个检查点的引擎专用系统表中。 在正常关闭后重新启动服务器时,InnoDB使用存储在数据字典系统表中的当前最大自动增量值来初始化内存中自动增量计数器。

参考文献

How to make InnoDB table not reset autoincrement on server restart?

https://serverfault.com/questions/228690/mysql-auto-increment-fields-resets-by-itself

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。