我正在 MySQL 5.6 数据库上的一个包含 6000 万行的大表上运行以下 ALTER
命令:
ALTER TABLE `large_table` ADD COLUMN `note` longtext NULL,
ALGORITHM=INPLACE, LOCK=NONE;
尽管同时指定了 ALGORITHM=INPLACE
Và LOCK=NONE
,但表会被锁定并实质上关闭应用程序,直到迁移完成。
我通过检查 SHOW OPEN TABLES
命令输出中 In_use
列的值验证了该表确实被锁定。它被设置为 1
.
根据我在 MySQL 文档中收集到的信息,此操作不应锁定表。并且,如果 MySQL 在没有锁的情况下无法继续执行,则该命令应该失败。我将数据库升级到 MySQL 5.7 看它是否更好,但我在 5.7 上也面临同样的问题。
这是预期的行为吗?我如何找出这里出了什么问题?
我假设您几乎同时没有在该表上执行其他 DDL?
对于 future :
8.0.12 为 ADD COLUMN
提供了 ALTER TABLE .. ALGORITHM=INSTANT
。参见 DiscussionVà ALTER ReferenceVà Online DDL Reference
当使用 INSTANT 算法添加列时,以下限制适用:
- 添加列不能与不支持 ALGORITHM=INSTANT 的其他 ALTER TABLE 操作合并在同一语句中。
- 一列只能添加为表格的最后一列。不支持将一列添加到其他列中的任何其他位置。
- 无法将列添加到使用 ROW_FORMAT=COMPRESSED 的表中。
- 不能将列添加到包含 FULLTEXT 索引的表中。
- 不能将列添加到临时表中。临时表仅支持 ALGORITHM=COPY。
- 无法将列添加到驻留在数据字典表空间中的表。
- 添加列时不评估行大小限制。但是,在向表中插入和更新行的 DML 操作期间会检查行大小限制。
可以在同一个 ALTER TABLE 语句中添加多个列。
如果您无法升级,请考虑 Percona 的 pt-online-schema-change
或一个新的竞争产品 gh-ost
(使用 binlog)。
Tôi là một lập trình viên xuất sắc, rất giỏi!