oracle vm发现无效设置_Oracle数据库编译失效对象相关命令总结大全,值得收藏
概述
在日常數(shù)據(jù)庫維護(hù)過程中,我們會(huì)發(fā)現(xiàn)數(shù)據(jù)庫中一些對(duì)象(包Package、存儲(chǔ)過程Procedure、函數(shù)Function、視圖View、同義詞.....)會(huì)失效,呈現(xiàn)無效狀態(tài)(INVALID)。有時(shí)候需要定期檢查數(shù)據(jù)庫中存在哪些失效對(duì)象,對(duì)于存在異常的對(duì)象需要重新編譯,有些自動(dòng)失效的對(duì)象,一般會(huì)在下次調(diào)用的時(shí)候,會(huì)被重新編譯,所以這些不需要人工干預(yù)。那么為什么對(duì)象突然會(huì)失效呢?又如何快速、高效的編譯失效對(duì)象呢?哪些失效的對(duì)象不需要我們?nèi)ブ匦戮幾g呢?
一、數(shù)據(jù)庫對(duì)象失效原因
數(shù)據(jù)庫對(duì)象失效的原因很多,這里大致歸納了一些常見的原因:
1、當(dāng)被引用對(duì)象的結(jié)構(gòu)變更時(shí),都會(huì)使得相關(guān)的依賴對(duì)象轉(zhuǎn)變?yōu)镮NVALID狀態(tài)。
數(shù)據(jù)庫中的對(duì)象(存儲(chǔ)過程,函數(shù),包,視圖,觸發(fā)器),它們往往需要直接或者間接的引用其它對(duì)象,對(duì)象的依賴包括直接和間接二種,其中直接依賴是指存儲(chǔ)對(duì)象直接依賴于被引用對(duì)象,而間接依賴是指對(duì)象間接依賴于被引用對(duì)象
要查看被引用的對(duì)象,可以通過下面SQL查看
select * from dba_dependencies where name='&objectname';select * from all_dependencies where name='&objectname';select * from user_dependencies where name='&objectname';其實(shí)不管視圖,像存儲(chǔ)過程,函數(shù)、包等,如果代碼本身沒有什么錯(cuò)誤,只是引用的對(duì)象發(fā)生了變化。也會(huì)失效。但并不影響調(diào)用,因?yàn)镺RACLE在調(diào)用時(shí)會(huì)自動(dòng)重新編譯的,如果其它對(duì)象變化后導(dǎo)致編譯有錯(cuò)誤。這時(shí)調(diào)用時(shí)重新編譯后也是錯(cuò)誤并處于失效狀態(tài),所以調(diào)用會(huì)出錯(cuò)。
2、發(fā)布SQL腳本時(shí)(包、存儲(chǔ)過程、函數(shù)等),沒有充分測(cè)試,編譯時(shí)出錯(cuò),這時(shí)對(duì)象變?yōu)闊o效。
3、數(shù)據(jù)庫升級(jí)、遷移時(shí),出現(xiàn)大量無效對(duì)象。
4、 諸如此類各種情況:例如,Oracle 會(huì)自動(dòng)維護(hù)分區(qū)索引,對(duì)于全局索引,如果在對(duì)分區(qū)表操作時(shí),沒有指定update index,則會(huì)導(dǎo)致全局索引失效,需要重建。
二、查看失效對(duì)象
1、統(tǒng)計(jì)失效的對(duì)象:
select owner, object_type, status, count(*) from dba_objects where status='INVALID' group by owner, object_type, status order by owner, object_type;2、查看具體失效對(duì)象
col owner for a20;col object_name for a32;col object_type for a16col status for a8select owner, object_name, object_type, status from dba_objects where status='INVALID' order by 1, 2,3;三、解決對(duì)策
1、使用ALTER *** COMPLIE語句手工進(jìn)行編譯,這個(gè)適用于少數(shù)、個(gè)別對(duì)象失效
alter package . compile;alter package . compile body;alter view . compile;alter trigger compile;2、執(zhí)行@$ORACLE_HOME/rdbms/admin/utlrp.sql腳本編譯數(shù)據(jù)庫失效對(duì)象。
許多情況下,由于數(shù)據(jù)庫的升級(jí)或遷移,會(huì)導(dǎo)致數(shù)據(jù)庫中的對(duì)象失效。由于對(duì)象之間可能存在復(fù)雜的依賴關(guān)系,所以手工編譯通常無法順利通過。通常我們會(huì)在Oracle的升級(jí)指導(dǎo)中看到這個(gè)腳本,Oracle強(qiáng)烈推薦在遷移或者升級(jí)后,通過運(yùn)行此腳本編譯失效對(duì)象。但是此腳本需要用SQLPLUS以SYSDBA身份運(yùn)行,并且當(dāng)時(shí)數(shù)據(jù)庫中最好不要有活動(dòng)事物或DDL操作,否則極容易導(dǎo)致死鎖的出現(xiàn)。
3、自動(dòng)編譯(慎用,可以手動(dòng)就手動(dòng)吧)
ORACLE提供了自動(dòng)編譯的接口dbms_utility.compile_schema(user,false); 調(diào)用這個(gè)過程就會(huì)編譯所有失效的過程、函數(shù)、觸發(fā)器、包
exec dbms_utility.compile_schema( 'SCOTT' )后面會(huì)分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注一下~
總結(jié)
以上是生活随笔為你收集整理的oracle vm发现无效设置_Oracle数据库编译失效对象相关命令总结大全,值得收藏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iframe悬浮在html上_HTML
- 下一篇: mysql web备份软件_GitHub