MySQL 5.6-即使使用ALGORITHM=inplace,表也会锁定

MySQL 5.6-即使使用ALGORITHM=inplace,表也会锁定,mysql,table-locking,Mysql,Table Locking,我正在一个包含6000万行的大型表上的MySQL 5.6数据库上运行以下ALTER命令: ALTER TABLE `large_table` ADD COLUMN `note` longtext NULL, ALGORITHM=INPLACE, LOCK=NONE; 尽管同时指定了ALGORITHM=INPLACE和LOCK=NONE,该表仍会被锁定,并基本上关闭应用程序,直到迁移完成 我通过检查SHOW OPEN TABLES命令输出中的In_use列的值来验证表是否确实被锁定。它被设置为

我正在一个包含6000万行的大型表上的MySQL 5.6数据库上运行以下
ALTER
命令:

ALTER TABLE `large_table` ADD COLUMN `note` longtext NULL, 
ALGORITHM=INPLACE, LOCK=NONE;
尽管同时指定了
ALGORITHM=INPLACE
LOCK=NONE
,该表仍会被锁定,并基本上关闭应用程序,直到迁移完成

我通过检查
SHOW OPEN TABLES
命令输出中的
In_use
列的值来验证表是否确实被锁定。它被设置为
1

根据我在MySQL文档中收集的信息,此操作不应该锁定表。而且,如果MySQL无法在没有锁的情况下继续运行,则该命令将失败。我将数据库升级到MySQL 5.7,看看是否更好,但在5.7上我也面临同样的问题


这是预期的行为吗?我如何找出这里出了什么问题?

我想您大概没有在同一时间在该表上执行其他DDL

未来:

8.0.12有
ALTER TABLE。。算法=即时
用于
添加列
。查看和

当使用即时算法添加列时,以下限制适用:

  • 添加列不能与不支持ALGORITHM=INSTANT的其他ALTER TABLE操作组合在同一语句中
  • 列只能作为表的最后一列添加。不支持将列添加到其他列中的任何其他位置
  • 无法将列添加到使用行\格式=压缩的表中
  • 无法将列添加到包含全文索引的表中
  • 无法将列添加到临时表中。临时表仅支持算法=复制
  • 无法将列添加到驻留在数据字典表空间中的表中
  • 添加列时不计算行大小限制。但是,在插入和更新表中的行的DML操作期间,会检查行大小限制
可以在同一ALTER TABLE语句中添加多列


如果您不能升级,那么考虑PelCONA的代码> PT在线模式更改< /代码>或一个新的、竞争的、产品<代码> GHOST (使用BILCONG)。

< P>我也遇到过MySQL 5.6锁定问题,即使在<代码>算法= InPoT、ROCK= NONE、<代码>被使用。我首先要检查以下几点:


检查表上的约束

如果表上存在ON…CASCADE或ON…SET NULL约束,则不允许ALTER TABLE子句LOCK=NONE

资料来源:


表是否具有外键关系?

外键关系中的表上的联机DDL操作不会等待在外键关系中的另一个表上执行的事务提交或回滚。事务在其正在更新的表上持有独占元数据锁,在与外键相关的表上持有共享元数据锁(外键检查所需)。共享元数据锁允许联机DDL操作继续进行,但在更新表定义需要独占元数据锁时,会在操作的最后阶段阻止该操作。当其他事务等待联机DDL操作完成时,此场景可能会导致死锁

资料来源:

并在此处阅读有关元数据锁定的内容:


首先从旧时间格式更改表格

如果您在MySQL 5.6之前创建了表,其中包含DATETIME或TIMESTAMP字段,则需要将它们升级到MySQL的5.6新格式

MySQL 5.6之前创建的InnoDB表不支持ALTER TABLE。。。ALGORITHM=用于包含时态列(日期、日期时间或时间戳)且未使用ALTER TABLE重建的表的位置。。。算法=复制。在本例中,一个ALTER表。。。算法=就地操作返回以下错误:

错误1846(0A000):不支持算法=就地。 原因:无法就地更改列类型。Try算法=复制

资料来源:


检查表是否有分区

分区改变了alter表规则的应用方式。 检查表的分区状态

显示表格状态

寻找不等于InnoDB的“引擎”

资料来源:



最后,正如Rick James在回答中提到的,从5.6升级到8.0可能是一种选择,因为它提供了其他改进。

这不是InnoDB?你可能想看看。我支持使用pt osc或gh ost的建议。我刚刚数了一下我们的日志,发现我的雇主已经使用pt-osc完成了70000多个模式迁移。谢谢,这非常有用。你知道MySQL 8中提到的一些缺点(比如外键关系)是否已经解决了吗?@jeffreyveon我对MySQL 8没有任何个人经验。但是,从以下链接到他们关于8.0限制的文档,有一些是共享的,一些是删除的,还有一些是不同的限制。