ora-04045和ora-16000報錯處理

賀子_DBA時代發表於2022-11-11

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部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-2922947/,如需轉載,請註明出處,否則將追究法律責任。

相關文章