首页 > 数据库 > Oracle > ora-04045和ora-16000报错处理
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/ ,如需转载,请注明出处,否则将追究法律责任。