使用 ALTER TABLE 命令添加外键约束时在 MySQL 中锁定元数据

问题描述 投票:0回答:1

我正在运行具有 8vCPU 和 64Gigs RAM 的 MySQL RDS v8,即 db.m5.4xlarge。我有一个表 A,其主键位于列“id”上,该列是自动增量并使用 BigInt 作为数据类型。该表共有 33.5k 行,总大小为 550MB,索引大小为 16.5MB。

我正在创建一个新表 B,其中包含一列 Product_id,该列是表 A 上的外键。用于创建外键的 alter table 命令正在等待元数据锁,而其他仅属于 SELECT 类型的查询正在运行,但这些查询可能会执行不开始执行,因为所有其他查询也等待元数据锁。与表 A 或表 B 没有任何关系的查询也会一直等待元数据锁。 我不明白为什么会出现这种情况?

据我所知,SELECT 语句不会受到 Alter table 命令的影响,特别是当 alter 命令是添加外键时。

A 或 B 上没有并发的 DDL 命令运行,并且我已经在表 B 中对要索引的列进行了索引,因此我只需要创建一个外键即可。

外键检查不应起作用,因为表 B 为空。

我还尝试在隔离级别设置为 READ COMMITTED 的事务中运行 alter table 命令,但这也不起作用。

还认为表 A 上不能有任何现有锁,因为它纯粹仅用于 SELECT 语句。表 A 上有零个更新或插入或更改表命令。

mysql database amazon-rds database-administration alter
1个回答
0
投票

ALTER TABLE 确实需要独占元数据锁,即使操作很简短并且仅包含元数据。

SELECT 语句不会获取row锁,但它会获取共享元数据锁,直到事务完成。事务隔离级别是多少并不重要。

同样,由于 ALTER TABLE 正在等待独占元数据锁,因此其他查询会在其后面排队等待。即使它们是只读查询。

您的情况的解决方案是完成查询父表或子表的所有事务,即使它们是只读查询,即使它们没有检查任何行。

然后 ALTER TABLE 将获取其元数据锁,完成其更改,并释放元数据锁,以便在其后面排队的其他查询可以完成其工作。

© www.soinside.com 2019 - 2024. All rights reserved.