暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

快速解决视图查询错误:ORA-04045 和 ORA-16000 的完美应对策略

原创 伟鹏 2024-11-05
812

背景:

环境

   生产库是oracle 19c(windows) +ADG 的容灾环境 (备库Linux)

业务逻辑

  主库在深圳,业务分析库在北京。为避免对主库带宽的影响,业务分析库doris通过调用/抽取备库环境的数据,来完成数据的整合/处理

故障问题

开发同事执行查询视图命令
select * from NCC20.V_PAYMENT_NCC;
ORA-04045: 在重新编译/重新验证 NCC20.V_PAYMENT_NCC 时出错 ORA-16000: 数据库或插接式数据库是以只读访问方式打开的 04045. 00000 - "errors during recompilation/revalidation of %s.%s" *Cause: This message indicates the object to which the following errors apply. The errors occurred during implicit recompilation/revalidation of the object. *Action: Check the following errors for more information, and make the necessary corrections to the object. 行 1424 出错

问题分析:

ORA-04045: 表示在重新编译或重新验证对象时发生了错误。这通常意味着视图的定义或依赖的对象存在某些问题,需要进一步检查;
ORA-16000: 表示数据库或插接式数据库是以只读访问方式打开的。这意味着当前数据库实例不允许进行写操作,包括重新编译或重新验证视图。这可能是由于数据库处于备份、维护或其他只读模式;
这个应该是因为调用的时候出现重新编译/验证连接数据库的时候,提示数据库未打开或者是只读状态。 业务调用的就是备库,备库是read only的,如果报这个错那就是正常的。业务反馈不止这个视图,还有其他视图也出现类似的报错,并且视图好多是N年前创建的,一直在使用。

 先不管这个问题是如何产生的,先解决问题。

1、检查主从备库的同步状态,结果是ok的,基本无延迟;
2、备库肯定是无法编译的,就连接主库,然后决定重新编译一下该视图看是否有报错,执行如下语句

ALTER VIEW NCC20.V_PAYMENT_NCC COMPILE;

这条命令的作用是强制 Oracle 数据库重新编译视图 NCC20.V_PAYMENT_NCC,确保其定义是最新的并且没有语法错误。

执行完成,无任何报错,再次执行查看
再次查询时,没有出现任何异常报错,查询结果正常显示。这表明通过手动重新编译视图,成功解决了由于数据库以只读方式打开导致的重新编译/重新验证失败的问题。
image.png

从上面的操作过程可以看出,重新编译这些视图是可以解决报错的问题。将该业务用户下的所有视图都重新编译,之后业务同事通过doris可以正常调用备库,无任何异常。但是为啥视图需要重新编译,还没找到原因。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论