ITPub博客

首页 > 数据库 > Oracle > ora-04045和ora-16000报错处理

ora-04045和ora-16000报错处理

原创 Oracle 作者:贺子_DBA时代 时间:2022-11-11 15:10:26 0 删除 编辑

oracle 19c dg库查询视图报错,具体如下所示

SQL> select count() from sysadm.DFW_SCHED;

select count() from sysadm.DFW_SCHED

*

ERROR at line 1:

ORA-04045: errors during recompilation/revalidation of SYSADM.DFW_SCHED

ORA-16000: database or pluggable database open for read-only access

原因分析:

该视图在主节点是可以查询的,后来经过分析了解到,dba对视图基表的字段进行了修改,进而引起备节点出现这个报错。原因是在备节点时,内存里信息没有更新,后来进行查询时,发现与基表有差异,需要进行重新编译,但是dg库是read only的,所以编译报错;

解决办法:

方法1:在主库执行手动compile,这个动作会同步到从库执行;

SQL> alter view sysadm.HTCF_ORG_PSNDOC_F_VIEW compile;

View altered.

方法2:直接在主库查询下这个视图就可以自动触发视图的自动编译,进而同步到从库执行;

SQL>select * from sysadm.HTCF_ORG_PSNDOC_F_VIEW where rownum<2;

拓展:可以通过如下存储过程,批量编译无效的视图,---摘自网络

create or replace procedure compile_invalid_views(

p_owner varchar2 -- 所有者名称,即 SCHEMA

) as

--编译某个用户下的无效视图

str_sql varchar2(200);

begin

for invalid_views in (select object_name from all_objects

where status = 'INVALID' and object_type = 'VIEW' and owner=upper(p_owner))

loop

str_sql := 'alter view '||p_owner||'.' ||invalid_views.object_name || ' compile';

begin

execute immediate str_sql;

exception

--When Others Then Null;

when OTHERS Then

dbms_output.put_line(sqlerrm);

end;

end loop;

end;

执行方式:

例如执行编译试图的存储过程,如下所示编译sysadm下面的所有无效的试图

SQL> exec compile_invalid_views('sysadm');

PL/SQL procedure successfully completed.

综上所述:Oracle dg做读写分离的时候,使用试图需要注意,当基表发生变化的时候,需要重新编译下对应的试图,或者定时从新编译主库的试图来避免这个问题,如果没有使用dg库读取,那么不会有这个问题

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29654823/viewspace-2922947/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
10年数据库管理员从业经历,熟悉Oracle、mysql、tidb、oceanbase、redis、 mongodb 、python等技术栈,持有11g ocm 、mysql 5.7 ocp 、tidb 5.0 ptcp、tidb 6.0 ptca、oceanbase obcp等

注册时间:2014-05-12

  • 博文量
    327
  • 访问量
    2148967