mysql - 复制到自动增量更改表的 tmp 表

标签 mysql sql alter-table

我们在使用 MySql (5.5.x) 时遇到问题,希望您能帮助我们。
在一天中的某个时候,我注意到一个状态为“复制到 tmp 表”的进程,以及这个查询:

ALTER TABLE `MyTableName` AUTO_INCREMENT=200000001
在此之后,所有其他查询都会获得“等待表元数据锁定”,并且所有查询都被卡住,并且没有任何处理。
我需要终止该进程,然后所有查询都重新启动。
为什么?我该如何解决这个问题?

最佳答案

在 MySQL 5.5 中,您运行的 ALTER TABLE 会复制整个表。 table 越大,这花费的时间就越多。特别是如果你的存储速度很慢。
您的表的大小是多少(您可以从 SHOW TABLE STATUS LIKE 'MyTableName'\G 获取并查看 data_length + index_length )?
我刚刚在我的笔记本电脑上做了一个测试。我在 MySQL 5.5 实例中填充了一个表,直到该表的大小约为 175MB。运行alter table 来设置自动增量值大约需要5-6 秒。您的结果可能会有所不同,具体取决于服务器的功能和存储速度。
当更改表运行时,执行该操作的线程持有 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 中,没有实现这些优化。所以任何alter table都需要很长时间,与表的大小成正比。
我建议在您的情况下解决此问题的最佳方法是升级到更新版本。 MySQL 5.5 已经过时了。甚至 MySQL 5.6 也将在 2021 年 2 月结束生命周期。是时候升级了。
如果您无法升级,那么您应该调查执行此 ALTER TABLE 语句的客户端。你说你在白天的某个时候注意到了它。追踪那个。在进程列表中,它会告诉您运行该 SQL 语句的客户端主机。它还会告诉您他们登录的 MySQL 用户。您可能还需要搜索使用此数据库的任何应用程序或脚本的源代码。或者问问你的队友。
一旦找到正在执行该 ALTER TABLE 的客户端,请尝试将客户端运行此语句的时间更改为一天中 ALTER TABLE 不会阻止重要查询的时间。或者询问负责的开发人员是否真的有必要如此频繁地执行此更改表?

关于mysql - 复制到自动增量更改表的 tmp 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63958182/

相关文章:

MySQL 触发器问题

sql-server - 如果名称遵循 SQL Server 中的特定模式,则删除表中的所有列

mysql - 更改MySQL中一行中的所有数据

mysql - 计算 2 个不同表中 2 列之间的百分比

mysql - SQL,一个id在一列中具有不同的值

sql - 选择 null 作为 testdate 进入 #temp_table

mysql - 如果它不存在,则将列添加到 mysql 表

mysql - 在一个巨大的 MySQL 生产表上创建一个没有表锁定的索引

php - 如何在mysql中对选定结果使用where条件

sql - 在sql函数中声明变量