Q: 云数据库PolarDB执行DDL操作提示“获取不到MDL锁”,怎么办?
当主实例或只读实例中存在未结束的查询或未提交的事务时可能导致此问题。
问题描述
在云数据库PolarDB实例中执行DDL操作时提示获取不到MDL锁;
报错信息:ERROR HY000:Fail to get MDL replica during MDL synchronize。解决方案
检查主实例以及所有只读实例上是否存在未结束的大查询,或者长时间未提交的事务,如果存在,可以使用“commit”提交事务或者使用“kill”结束相关进程。
操作流程
了解此报错的问题根源,您需要先了解云数据库PolarDB中DDL操作的过程,详情如下:
①.在DDL操作的不同阶段,如需变更表结构,则在变更前主实例先获取MDL锁,然后写入一条redolog日志。
②.只读实例解析到此日志时,会尝试获取同一个表中的MDL锁。会有两种情况:i.获取成功,进入下一步;ii.获取失败,只读实例反馈给主实例。
③.主实例等待所有只读实例同步到新的复制位点。在一定时间内,主实例会判断所有只读实例是否都解析到此日志以及是否加锁成功。有两种情况:i.所有只读实例同步到新的复制位点,DDL成功;ii.某些只读实例未同步到新的复制位点,回滚DDL并报错。此时报错又分为等待同步超时和本文中加锁失败两种报错。某些只读实例加锁失败的主要原因是只读实例存在未结束的查询或者未提交的事务。