暂无图片
connot open relation with oid xxx
我来答
分享
手机用户5593
2023-12-18
connot open relation with oid xxx

现象描述:发现navicat 的某个schema下视图全没了,查询了pg_class 发现视图还在,但是页面没有显示。查看navicat后台日志,当页面点击【视图】列表的时候,后台会报error:could not open relation with oid xxx,这个xxx在pg_class查不到记录,在文件系统data目录上能找到对应的xxx和xxx.fsm文件。

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
手机用户5593

问题已找到。有人误删除了pg_class的相关记录,导致对应的relation无法访问报错error:could not open relation with oid xxx。navicat的【视图】需要用到pg_get_viewdef函数获取视图的定义,当pg_get_viewdef访问到的视图涉及到在pg_class中被误删除的表就会报count not open relation with oid xxx,进而导致navicat的【视图】列表为空。应涉及到的视图和基表都无法访问,最后的解决方法:通过shell脚本遍历库中的所有视图找出异常视图并drop掉,根据遍历得到的报错的oid在pg_type中找到对应的记录,再到pg_depend删除依赖记录并执行drop type/table,最后重建基表和视图后navicat和业务都恢复正常。

暂无图片 评论
暂无图片 有用 2
暂无图片
Mjwlan
2023-12-19
你们用的版本是正版的嘛?
手机用户5593
题主
2023-12-19
是的,我们生产用的阿里云,开发是自己的服务器加阿里云提供的polardb包,与生产环境同版本。
Mjwlan

根据描述,可能存在一些问题导致Navicat无法正确显示视图列表和访问相关视图对象。以下是一些可能的解决方法:

  1. 数据库元数据同步:尝试在Navicat中执行"刷新"或"同步"操作,以确保数据库元数据与实际数据库状态保持一致。这将帮助Navicat重新获取和更新数据库对象的信息。

  2. 检查连接权限:确保Navicat所使用的数据库连接具有足够的权限来访问和查询相关视图对象。验证连接参数,并确保对该schema下的视图具有适当的权限。

  3. 重启Navicat:尝试退出Navicat并重新启动程序,以确保任何潜在的缓存或临时状态得到清除,从而重新加载数据库对象。

  4. 检查文件系统权限:检查Navicat所连接到的数据库的数据目录是否具有正确的文件系统权限。确保Navicat可以读取和访问相关的数据文件。

  5. 检查数据库完整性:如果数据库中存在损坏或不一致的文件(如xxx和xxx.fsm),可能会导致错误。可以考虑使用PostgreSQL提供的工具(如pg_resetxlog)来修复数据库文件的完整性问题。

暂无图片 评论
暂无图片 有用 5
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏