PAYATHON 2026

PolarDB 多主分片表建库时报错 8803,SQL 需要修改吗?

数据小许

结论:建库语句符合文档语法,无需改写

在支持该功能的 PolarDB MySQL 多主集群中,下面的建库语句有效,官方文档中也有相同示例:

CREATE DATABASE test1 DIST_DB='Y';

DIST_DB='Y' 用于创建支持分库模式多主分片表的数据库。当前官方使用说明列出的适用条件包括:多主集群(Limitless)、内核版本为 8.0.2,以及已创建高权限账号并连接到数据库集群。

先核对实际环境是否满足这些条件。现有报错不能说明 SQL 写错了。

错误表示什么?

ERROR 8803 (HY000): Failed to get global X lock for database 'test1' on master 1

从错误文本看,建库时系统未能在 master 1 上取得数据库 test1 的全局排他锁(global X lock)。

错误信息没有给出锁获取失败的原因,无法据此判断是其他会话占锁、节点状态异常还是内部协调问题,也不能直接认定发生了死锁。以下是排查建议,根因尚未确认。

如何排查?

  1. 在控制台核对产品系列、完整内核版本、节点状态,以及当前连接地址对应的集群。不要仅凭客户端显示的 MySQL 兼容版本判断功能是否可用。
  2. 确认使用的账号符合该功能文档要求,并具备建库权限。权限是需要事先核对的事项,不能据此认定 8803 是权限错误。
  3. 检查报错时是否有针对 test1 的建库、删库或其他 DDL,以及集群是否正在执行变更任务。如果存在相关操作,等其完成后再检查状态。
  4. 先确认数据库是否存在,再决定是否重试。可以执行:
SHOW DATABASES LIKE 'test1';

查询结果受账号可见范围影响。如果库已存在,应继续核实其属性和创建状态;如果确认不存在,且集群状态正常、没有相关并发操作,可以重试原语句。

若错误持续出现,请向阿里云技术支持提供集群 ID、完整内核版本、报错时间及时区、连接地址类型、原始 SQL 和完整错误信息,请其结合服务端日志定位全局锁获取失败的原因。

修改 SQL 能绕过这个错误吗?

给数据库名加反引号或添加 IF NOT EXISTS,都不能解决全局锁获取失败。IF NOT EXISTS 只用于处理同名数据库已存在的情况。

不要为避开错误而删除 DIST_DB='Y',这样会改变建库目标。当前文档明确说明,普通库不支持转换为带 DIST_DB 属性的数据库。参见官方 CREATE DATABASE 说明。

备注:内容仅供参考。