pg_dump报错pg_catalog.pg_roles不存在,求testDb2修复方案
解决PostgreSQL数据库pg_catalog.pg_roles缺失导致pg_dump失败的问题
问题场景
- 创建testDb1并添加数据,转储后恢复为testDb2;testDb2运行一段时间后执行转储命令:
pg_dump -U "postgres" --no-privileges -Fd -j 4 -f dump_20230102_db2 testDb2 - 报错提示
pg_catalog.pg_roles不存在,testDb1中执行报错的查询可正常返回结果;testDb2中执行\d *pg_roles*无匹配关系,已将testDb2所有者改为postgres,问题仍未解决。两个数据库均为14.4版本。
修复步骤
1. 明确pg_roles的本质
pg_catalog.pg_roles是PostgreSQL内置的系统视图,并非物理表,它依赖pg_authid系统表生成。testDb2中缺失该视图,大概率是恢复过程异常或后续操作误删导致。
2. 从正常数据库导出视图定义
在testDb1中执行以下命令,获取pg_roles的创建语句:
SELECT pg_get_viewdef('pg_catalog.pg_roles', true);
PostgreSQL 14版本的标准创建语句如下(以实际查询结果为准):
CREATE VIEW pg_catalog.pg_roles AS SELECT r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolreplication, r.rolconnlimit, r.rolpassword, r.rolvaliduntil, ARRAY( SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON m.roleid = b.oid WHERE m.member = r.oid) AS rolmemberof, r.rolconfig, r.oid FROM pg_catalog.pg_authid r WHERE pg_catalog.has_role(r.oid, 'USAGE'::text);
3. 在testDb2中重建视图
切换到testDb2数据库,以postgres超级用户身份执行上述创建语句:
CREATE VIEW pg_catalog.pg_roles AS SELECT r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolreplication, r.rolconnlimit, r.rolpassword, r.rolvaliduntil, ARRAY( SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON m.roleid = b.oid WHERE m.member = r.oid) AS rolmemberof, r.rolconfig, r.oid FROM pg_catalog.pg_authid r WHERE pg_catalog.has_role(r.oid, 'USAGE'::text);
4. 验证修复效果
在testDb2中执行以下命令,确认视图已恢复:
\d pg_catalog.pg_roles
之后重新执行pg_dump命令,确认报错消失。
5. 检查系统完整性
若pg_roles缺失,可能伴随其他系统对象异常,可执行以下命令依赖表状态:
-- 检查pg_authid是否存在 SELECT * FROM pg_catalog.pg_authid LIMIT 1; -- 检查pg_auth_members是否存在 SELECT * FROM pg_catalog.pg_auth_members LIMIT 1;
若这些基础表也缺失,说明数据库系统目录损坏严重,建议从最近的有效备份恢复,或导出所有业务数据后重建数据库。
内容的提问来源于stack exchange,提问作者ap14
相关产品推荐
相关产品推荐

