識別和修復無效物件
一、無效物件的識別和編譯
1、識別無效物件
col object_name for a30
select object_name, object_type from dba_objects where owner = 'CMES' and status='INVALID';
2、編譯單個無效物件
語法:alter 物件型別 物件名稱 compile;
如重新編譯某個儲存過程,編譯不能透過時,可用SQL*Plus命令show errors檢視原因,但是檢視不支援show errors:
alter procedure cmes.m085i_chk_lot compile;
警告: 更改的過程帶有編譯錯誤。
show errors;
PROCEDURE CMES.M085I_CHK_LOT 出現錯誤:
LINE/COL ERROR
-------- -----------------------------------------------------------------
27/7 PLS-00103: 出現符號 "="在需要下列之一時:
:= . ( @ % ;
符號 ":=在 "=" 繼續之前已插入。
可以使用檢視dba_dependencies檢視物件間的依賴關係,便於分析編譯錯誤的原因,如:
col owner for a10
col name for a20
col referenced_owner for a20
col referenced_name for a20
col referenced_link_name for a20
select * from dba_dependencies where owner = 'CMES' and name='FS_GET_CHANNEL' and referenced_owner != 'SYS';
OWNER NAME TYPE REFERENCED_OWNER REFERENCED_NAME REFERENCED_TYPE REFERENCED_LINK_NAME DEPENDENCY_TYPE
---------- -------------------- ------------------ -------------------- -------------------- ------------------ -------------------- ---------------
CMES FS_GET_CHANNEL PROCEDURE CMES FS_CHANNEL_T TABLE HARD
CMES FS_GET_CHANNEL PROCEDURE CMES FS_CHK_CONDITION PROCEDURE HARD
CMES FS_GET_CHANNEL PROCEDURE CMES FS_CONDITION_T TABLE HARD
CMES FS_GET_CHANNEL PROCEDURE CMES C_SILO_T TABLE HARD
CMES FS_GET_CHANNEL PROCEDURE RMES R_BOLT_RECORD_T TABLE HARD
CMES FS_GET_CHANNEL PROCEDURE RMES R_WIP_BOL_T TABLE HARD
CMES FS_GET_CHANNEL PROCEDURE CMES C_BOLT_T TABLE HARD
3、透過Oracle自帶的指令碼可以編譯全部無效物件
用系統自帶的指令碼可以執行對全部無效物件的編譯,注意該指令碼必須以SYSDBA身份執行:
@?\rdbms\admin\utlrp
4、透過構建SQL編譯無效物件
批次編譯無效物件的一種方法就是利用以下SQL查詢批次生成編譯語句,然後提取執行。該方法的好處是可以比較靈活的選擇物件來執行,並且無需以SYSDBA身份登入:
select 'alter procedure ' || object_name || ' compile;' from dba_objects where owner = 'CMES' and status='INVALID';
5、透過以下儲存過程編譯無效物件
如果提取utlrp的指令碼,可以重新組織成一個用於編譯所有無效物件的儲存過程
create or replace procedure recompile as
-- 編譯無效物件
type tab_char is table of varchar2(32767) index by binary_integer;
commands tab_char;
table_exists number;
begin
utl_recomp.recomp_parallel(0);
select count(*)
into table_exists
from dba_objects
where owner = 'SYS'
and object_name = 'UTLIRP_ENABLED_FUNC_INDEXES'
and object_type = 'TABLE';
if (table_exists > 0) then
execute immediate q'+
select 'alter index "' || u.name || '"."' || o.name || '" enable'
from utlirp_enabled_func_indexes e, ind$ i, obj$ o, user$ u
where e.obj# = i.obj# and i.obj# = o.obj# and o.owner# = u.user#
and bitand(i.flags, 1024) != 0+' bulk
collect
into commands;
if (commands.count() > 0) then
for i in 1 .. commands.count() loop
execute immediate commands(i);
end loop;
end if;
execute immediate 'drop table utlirp_enabled_func_indexes';
end if;
dbms_registry_sys.validate_components;
end;
二、不可用索引及其修復
如果某個儲存過程物件變為無效,DBA可以不執行任何操作,首次訪問該物件時,Oracle會嘗試進行重新編譯。但如果索引變得不可用,則必須顯示的修復它。
在10g以前的版本中,如果會話試圖使用不可用的索引,那麼會立即返回一條錯誤訊息,同時語句執行失敗。但10g開始更改了這種方式,如果索引不可用,那麼語句會重走不需要該索引的執行計劃,執行總會成功,雖然效能可能會顯著下降。
有一個例項引數控制該行為:skip_unusable_indexes,預設為true,表示即便索引不可用,也可以執行語句。這是一個動態引數,如想實現舊版本中不可用索引導致返回錯誤訊息的功能,則可將其修改為false。
即便skip_unusable_indexes為true,對於透過索引實施約束的情況是一個例外,如主鍵約束,需要建立索引,如果主鍵上的索引變得不可用,那麼會對DML命令鎖定表,此時無法進行DML操作。
1、查詢不可用索引
select table_name, index_name, index_type, tablespace_name, uniqueness from dba_indexes where owner = 'CMES' and status = 'UNUSABLE';
2、修復不可用索引
如果rowid指標不再正確,則索引將標記為不可用。為了修復不可用索引,可以使用以下命令重建索引:
alter index 索引名 rebuild [tablespace 表空間名] [online] [nologging];
tablespace:預設索引在當前表空間內重建,也可以指定重建在其它表空間上。
online:預設重建索引過程會對DML命令鎖定表,若使用該引數則不會影響DML的操作。
nologging:指示Oracle不為索引重建操作生成重做,這樣重建速度將加快,但也意味著應當對包含指定索引的表空間進行備份。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28974745/viewspace-2138333/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CSS之樣式無效BUG的修復CSS
- 如何修復“包 ‘%@’ 丟失或無效”macOS Monterey 升級錯誤Mac
- 安裝win10時無法識別ssd怎麼解決_win10安裝無法識別固態如何修復Win10
- 電腦識別不了硬碟修復步驟 硬碟識別不出來了咋辦硬碟
- 51微控制器win10無法識別怎麼解決_51微控制器win10無法識別如何修復Win10
- win10 bios無法識別u盤怎麼解決_win10系統bios識別不了u盤如何修復Win10iOS
- Unraid 使用 Docker Compose 安裝 Immich 套件無法啟用人臉識別的原因及修復方法AIDocker套件
- [Error Code: 904, SQL State: 42000] ORA-00904 : 識別符號無效ErrorSQL符號
- Android熱修復原理(一)熱修復框架對比和程式碼修復Android框架
- 大腦是如何識別和分類物件? - mpg物件
- win10自動修復無法修復你的電腦 華碩win10自動修復無法開機Win10
- win10快捷鍵無效怎麼辦_win10快捷鍵沒反應修復方法Win10
- 伺服器RAID5無法識別資料恢復伺服器AI資料恢復
- ghost win10無法啟動修復失敗怎麼修復_ghost win10無法啟動修復失敗如何解決Win10
- Tower-web0.3.1/2釋出,型別完善和修復更新Web型別
- 實用知識】如何避免投標無效
- 認識類和物件物件
- 修復Arch Linux和Manjaro Linux無法顯示emoji的問題LinuxJAR
- 教你如何解決SQL server中提示物件名無效SQLServer物件
- 臺電固態硬碟插入電腦識別不到維修資料恢復硬碟資料恢復
- Win10系統自動修復無法修復電腦如何解決Win10
- 熱修復和外掛化
- Win10無法開機提示“自動修復無法修復你的電腦”的解決方法Win10
- 隨身碟此卷不包含可識別的檔案系統修復方法?
- 【伺服器資料恢復】RAID5無法識別的資料恢復案例伺服器資料恢復AI
- 『無為則無心』Python物件導向 — 46、類和物件Python物件
- 初識Java類和物件Java物件
- MySQL無法識別中文MySql
- 電腦系統壞了怎麼修復 電腦無法正常啟動修復教程
- win10無法自動修復怎麼開機 win10自動修復無法開機的方法Win10
- 無效字元字元
- win10 ppt一開啟就提示修復怎麼辦_win10開啟ppt提示修復無法讀取修復方法Win10
- win10執行快捷鍵沒反應怎麼辦 win10執行快捷鍵無效修復方法Win10
- win10無法開啟bootbcd修復怎麼辦_win10無法開啟bootbcd修復的解決方法Win10boot
- PrestaShop網站漏洞修復如何修復REST網站
- JetBrains Kubernets 外掛識別 Istio CRD 物件AI物件
- 【Oracle】sys下缺失和無效物件導致exp、expdp和RMAN等備份功能全部報錯Oracle物件
- u盤電腦不識別瞭如何修復 u盤不能讀取的解決方法
- 例項物件和函式物件的區別物件函式