云数据库PolarDB执行DDL操作提示“获取不到MDL锁”

云数据库PolarDB执行DDL操作提示“获取不到MDL锁”

更新时间:2020-05-22 14:14:55

问题描述

在云数据库PolarDB实例中执行DDL操作时提示获取不到MDL锁,报错信息如下。

ERROR HY000: Fail to get MDL on replica during DDL synchronize

问题原因

当主实例或只读实例中存在下列情况时可能导致此报错:

  • 存在未结束的查询
  • 存在未提交的事务

如果您需要了解更多详细信息,请参见更多信息

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

需要检查主实例以及所有只读实例上是否存在未结束的大查询,或者长时间未提交的事务,如果存在,可以使用commit提交事务或者使用kill结束相关进程。

更多信息

如果您需要了解引发本文中报错的问题根源,您需要先了解云数据库PolarDB中DDL操作的过程,详情如下:

  1. 在DDL操作的不同阶段,如果需要变更表结构,则在变更前,主实例先获取MDL锁,然后写入一条redolog日志。
  2. 只读实例解析到此日志时,会尝试获取同一个表中的MDL锁。然后有下列两种情况。
    • 获取成功,进入下一步。
    • 获取失败,只读实例反馈给主实例。
  3. 主实例等待所有只读实例同步到最新的复制位点。在一定时间内,主实例会判断所有只读实例是否都解析到此日志以及是否加锁成功。然后有下列两种情况:
    • 所有只读实例同步到最新的复制位点,DDL成功。
    • 某些只读实例未同步到最新的复制位点,回滚DDL并报错。此时报错又分为两种情况,一种是等待同步超时的报错,一种是本文中加锁失败的报错。

而某些只读实例加锁失败的主要原因是只读实例存在未结束的查询或者未提交的事务,因此加锁失败。更多详情,请参见POLARDB不得不知道的秘密DDL与大事务问题章节。

适用于

  • 云数据库PolarDB

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。