ORA-00604, ORA-16000: 開啟資料庫以進行只讀訪問

tolywang發表於2011-06-02

同事近期碰到的一個問題, 關於同義詞invalid狀態 在database read only 模式下不能被select 的問題。 發現是因為修改某些結構導致同義詞處於invalid 狀態,  但是資料庫又被開啟為read only 了,  9i及以後的版本雖然在呼叫或執行invalid object 的時候可以自動compile 為 invalid ,   但是由於庫是read only 的 , 將同義詞之類的object 編譯為invalid 需要更新資料字典表 ,  read only 不能更新 。 導致報錯。 

 

以下是過程:

---------------------------------------------- 

 

開啟為read only狀態,查詢普通表R_FEEDER_ID_T時報錯(不管下什麼條件都報錯,甚至select 1 from R_FEEDER_ID_T也不行 )  

ORA-00604: 遞迴SQL級別1出現錯誤 

ORA-16000: 開啟資料庫以進行只讀訪問 

使用trace 跟蹤:   
alter session set events '10046 trace name context forever, level 8';
alter session set events '10046 trace name context off';

開啟trace file 發現有兩條update 及 alter table xxxx compile 語句:

=====================
PARSING IN CURSOR #8 len=78 dep=2 uid=0 ct=6 lid=0 tim=1276370678014051 hv=1963305302 ad='656a14b8'
update dependency$ set p_timestamp=:1, p_obj#=:2 where d_obj#=:3 and p_obj#=:4
END OF STMT
PARSE #8:c=0,e=15,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=4,tim=1276370678014046
EXEC #7:c=0,e=2811,p=0,cr=0,cu=0,mis=1,r=0,dep=2,og=4,tim=1276370678016944
FETCH #7:c=0,e=53,p=0,cr=3,cu=0,mis=0,r=0,dep=2,og=4,tim=1276370678017055
EXEC #11:c=0,e=4561,p=0,cr=3,cu=0,mis=0,r=0,dep=1,og=1,tim=1276370678017163
=====================
PARSING IN CURSOR #1 len=54 dep=1 uid=0 ct=6 lid=0 tim=1276370678017644 hv=3946387688 ad='656886f8'
update syn$ set node=:2,owner=:3,name=:4 where obj#=:1
END OF STMT
PARSE #1:c=0,e=398,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=1276370678017639
EXEC #1:c=0,e=851,p=0,cr=2,cu=2,mis=1,r=0,dep=1,og=4,tim=1276370678018595
ERROR #1:err=16000 tim=1741938016
=====================

看起來dependency$ ,syn$應該是和依賴性、同義詞有關

查詢同義詞發現是invalid 狀態, 將資料庫重啟,開成read write模式,查詢一下這幾個同義詞失效的表,再看同義詞的狀態已經變成valid了 。 再次將資料庫關掉,開啟成read only模式,這時再查之前有問題的表,已經正常了 。

 

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-697000/,如需轉載,請註明出處,否則將追究法律責任。

相關文章