剛剛,客戶的繳費系統突然報錯,應用程序在后台提示執行某個存儲過程時出錯,手動在PLSQL DEVELOPER工具上執行那段報錯的代碼,錯誤顯示如下:
可以看出,這段代碼提示ORA-04063,在訪問某個view時報錯。
最開始,懷疑這個視圖是否正常,讓客戶執行SQL語句檢查這個視圖的狀態。
可以看出,這個視圖沒有任何問題。我讓客戶把整個存儲過程發過來,發現報錯的地方是通過DBLINK訪問遠程數據庫上的一個視圖。
此時,客戶也在積極地做着各種測試。發現只要在通過PL/SQL代碼塊就報ORA-04063錯誤,單獨通過DBLINK訪問都沒有任何問題,測試過程如圖:
這些測試可以說明,這個問題與視圖沒有任何關系,因為在PL/SQL塊里通過DBLINK訪問原表都報錯。
通過關鍵字“ora-04063 dblink”進行搜索,發現MOS上有一篇文章:
Accessing TABLE From READ ONLY DATABASE Using DATABASE LINK Within PL/SQL Fails With ORA-06550 ORA-04063 or PLS-00905(Doc ID 358697.1)
這篇文章提到,當在PL/SQL中通過DBLINK訪問READ ONLY數據庫時,有可能會出現ORA-04063錯誤。
錯誤原因:
CAUSE
This is expected behavior.
Compiling the PL/SQL block we require internal structures of the table, which is not yet generated in the read only database.
This has been identified in:
Bug 2798026 ORA-6550 / PLS-905 WHEN RUNNING PL/SQL OVER DBLINK TO READ ONLY STANDBY DATABASE
詢問客戶當前數據庫是個怎樣的架構,客戶反饋:源端是19C的RAC,生產庫是11.2.0.2 RAC,在生產庫上建立了DBLINK訪問19C上的數據,並且源端的19C是一個Dataguard環境的備端。
看起來,這個問題與這篇MOS文章的匹配度蠻高的,趕緊讓客戶看看這個文章。但客戶覺得這個系統已經使用很久了,這個PL/SQL代碼塊也運行了很久,怎么突然就不行了?如果是這個問題,理論上應該系統剛上線就出錯才對呀。我一時無以反駁。。。
報着試試的想法,客戶根據MOS文章中的workaread進行了修改。發現執行了workaread后,問題竟然解決了。那說明剛剛遭遇的故障真是這篇MOS提到的情況。
對於這個問題,ORACLE官方就不認為是一BUG,所以也沒有相應的補丁。