Aurora MySQL v2.10.2添加列卡住,寻求排查解决方法
排查与解决Aurora MySQL v2.10.2加列时的元数据锁阻塞问题
一、定位持有元数据锁的阻塞会话
先找到抢占表元数据锁的根源会话,执行以下命令排查:
- 查看当前所有会话状态:
重点关注SHOW PROCESSLIST;State列,寻找长时间未结束、状态为Locked且针对目标表的查询/更新操作。 - 精准查询元数据锁信息:
通过这些语句可锁定持有锁的会话ID(SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE DB = '你的数据库名' AND TABLE = '目标表名'; SELECT OBJECT_NAME, LOCK_TYPE, LOCK_STATUS, PROCESSLIST_ID FROM INFORMATION_SCHEMA.METADATA_LOCKS WHERE OBJECT_TYPE = 'TABLE';PROCESSLIST_ID)及对应的操作类型(如未提交事务、慢查询)。
二、处理阻塞源会话
找到阻塞源后,根据业务情况选择处理方式:
- 若为未提交的长事务:比如客户端断开但事务未回滚,可直接终止会话(操作前确认不影响核心业务):
KILL 会话ID; - 若为持续运行的慢查询:先优化查询逻辑(如添加索引),或暂时停掉非核心查询任务,待ALTER完成后恢复。
三、调整ALTER执行策略
- 低峰期执行:选择凌晨等业务流量最小的时段操作,减少表的读写竞争,更容易获取元数据锁。
- 降低ALTER优先级:通过会话变量降低ALTER的资源抢占优先级,减少对业务的影响:
SET LOW_PRIORITY_UPDATES = 1; ALTER TABLE 目标表 ADD COLUMN `my_col` int DEFAULT 100 AFTER another_col; - 临时禁用表上的触发器/外键:如果表有触发器或外键约束,可先禁用再执行ALTER,减少锁竞争场景:
注意:禁用触发器期间需确保数据一致性。ALTER TABLE 目标表 DISABLE TRIGGER ALL; -- 执行ALTER语句 ALTER TABLE 目标表 ENABLE TRIGGER ALL;
四、排查额外负载因素
- 检查备份任务:Aurora自动快照或第三方备份工具扫描表时,会持有元数据锁导致ALTER阻塞,可暂时暂停备份任务,完成ALTER后再重启。
- 确认复制状态:若为主从架构,检查从库复制是否正常,过高的复制延迟可能间接导致主库锁等待:
确保SHOW SLAVE STATUS\G;Slave_IO_Running和Slave_SQL_Running均为Yes,延迟在合理范围。
五、确认Aurora专属限制
- 目标表若在只读实例上,必须切换至主库执行ALTER,只读实例不支持表结构修改。
- 若开启了Aurora专属的并行查询等特性,可暂时关闭后尝试ALTER,避免特性带来的锁竞争。
内容的提问来源于stack exchange,提问作者hsnsd
相关产品推荐
相关产品推荐

