RDS PostgreSQL 13.13升级至15.5报错:零长度分隔标识符求助
PostgreSQL RDS 13.13升级至15.5的空权限错误解决方法
这个错误是因为你的PostgreSQL 13实例中存在无效的权限记录:用户my_user_1被授予了一个空名称的角色/权限,导致pg_upgrade生成的全局dump文件中出现了GRANT "" TO "my_user_1"这种不符合语法的SQL语句,新版本PostgreSQL对这类无效语法的校验更严格,因此升级失败。
解决步骤如下:
- 步骤1:定位无效权限记录
登录原RDS PostgreSQL 13实例,执行以下查询找出无效的权限记录:
SELECT r.rolname AS granted_role, m.rolname AS grantee, g.rolname AS grantor FROM pg_auth_members am LEFT JOIN pg_roles r ON am.roleid = r.oid LEFT JOIN pg_roles m ON am.member = m.oid LEFT JOIN pg_roles g ON am.grantor = g.oid WHERE r.rolname IS NULL;
该查询会返回所有被授予了不存在(空名称)角色的权限记录。
- 步骤2:清理无效数据
确认查询返回的记录为无效数据后,执行删除操作清理:
DELETE FROM pg_auth_members WHERE roleid NOT IN (SELECT oid FROM pg_roles);
注意:操作前请确保这些无效记录不会影响业务,必要时先备份相关数据。
- 步骤3:重新发起升级
清理完成后,再次尝试将RDS实例升级至15.5版本即可。
这类问题通常是历史操作遗留的无效数据(比如误执行的GRANT语句、角色被删除但权限记录未同步清理)导致,旧版本PostgreSQL对这类不规范记录的容忍度更高,而新版本的语法校验更严格,因此升级时触发报错。
内容的提问来源于stack exchange,提问作者Vazgen Torosyan
相关产品推荐
相关产品推荐

