ora-04045和ora-16000报错处理

来源:这里教程网 时间:2026-03-03 18:05:06 作者:

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_SCHEDORA-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);beginfor invalid_views in (select object_name from all_objectswhere status = 'INVALID' and object_type = 'VIEW' and owner=upper(p_owner))loopstr_sql := 'alter view '||p_owner||'.' ||invalid_views.object_name || ' compile';beginexecute immediate str_sql;exception--When Others Then Null;when OTHERS Thendbms_output.put_line(sqlerrm);end;end loop;end;执行方式:例如执行编译试图的存储过程,如下所示编译sysadm下面的所有无效的试图SQL> exec compile_invalid_views('sysadm');PL/SQL procedure successfully completed. 综上所述:Oracle dg做读写分离的时候,使用试图需要注意,当基表发生变化的时候,需要重新编译下对应的试图,或者定时从新编译主库的试图来避免这个问题,如果没有使用dg库读取,那么不会有这个问题

相关推荐