AWS RDS PostgreSQL 10 public schema消失无法访问的排查与恢复咨询
PostgreSQL RDS 42P01报错问题解答
报错信息:PostgreSQL ERROR: 42P01: relation "public.{tableName}" does not exist
运行环境:PostgreSQL 10.17 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit,部署在AWS RDS服务
1. public schema非主动删除的丢失/不可用场景
- 自动化运维脚本误执行:批量清理测试资源的脚本存在逻辑漏洞,匹配到public schema后执行了
DROP SCHEMA public CASCADE类语句 - RDS运维操作异常:跨版本升级、时点恢复、只读实例升主等操作过程中出现元数据同步失败,导致public schema的元数据损坏被标记为无效
- schema被重命名:误执行
ALTER SCHEMA public RENAME TO <自定义名称>语句,导致默认路径下找不到public schema - search_path配置被篡改:数据库级或会话级的
search_path参数被修改,移除了public的默认配置,即使schema实际存在也会出现访问找不到的情况,容易被误判为schema丢失 - 逻辑复制冲突:配置逻辑订阅的场景下,发布端的schema删除操作同步到订阅端,或者复制槽异常导致元数据同步混乱,也会触发schema不可用问题
- 底层存储损坏:虽然概率极低,但若AWS RDS的存储块出现静默损坏,会导致系统表中public schema的元数据丢失,表现为schema不可用
2. 管理员账号无法查看存在的public schema的可能性
存在该可能,触发场景如下:
- public schema的权限被显式回收:即使是管理员账号,如果没有被授予public schema的
USAGE权限,访问对应对象时也会提示不存在。可执行\dn+ public查看schema的当前权限配置,若曾执行过REVOKE ALL ON SCHEMA public FROM <管理员角色>类语句,就会出现权限不足的情况 - 角色继承属性被关闭:如果管理员账号的权限继承自其他拥有public访问权限的角色,当前账号的
NOINHERIT属性被开启时,无法继承上级角色的schema权限,导致无法访问 - RDS内置权限限制:AWS RDS的默认管理员账号并非真正的PostgreSQL超级用户,部分系统级权限被RDS平台管控,若RDS侧的权限配置出现异常,也可能导致无法访问public schema
3. public schema彻底丢失后的恢复步骤
- 优先使用RDS时点恢复:AWS RDS默认开启自动备份,可选择schema丢失前最近的健康时点,恢复出一个新的RDS实例,验证数据完整性后切换业务流量即可,是效率最高、完整性最有保障的恢复方案
- 手动快照恢复:如果存在schema丢失前创建的手动快照,可直接从快照恢复实例,验证数据后即可使用
- 逻辑备份恢复:如果有最近的
pg_dump逻辑备份文件,可先手动创建public schema并配置对应权限,再执行psql -d <目标数据库名> -f <备份文件路径>导入数据即可 - 灾备实例同步恢复:如果存在同实例只读副本、跨区域灾备实例且灾备侧public schema完好,可先停止灾备实例的同步,将数据导出后导入故障实例,也可直接切换业务流量到灾备实例
- 无备份场景:如果没有任何可用备份,RDS本身不提供底层数据找回能力,丢失的数据无法恢复
内容的提问来源于stack exchange,提问作者EndlessSpace
相关产品推荐
相关产品推荐

