Oracle資料庫處理壞塊問題常用命令

chenoracle發表於2024-03-08

1.透過DBV 檢查檔案是否有壞塊

例如:檢查 cjc_index01.dbf 檔案

dbv file='/oradata/nc/cjc_index01.dbf'

2.檢查壞塊所屬段型別

例如:file_id=6(cjc_index01.dbf),block=459202

select tablespace_name, segment_type, owner, segment_name
  from dba_extents
 where file_id = 6
   and 459202  between block_id and block_id + blocks - 1;

3.rman恢復壞塊

恢復方式:基於資料塊的Rman 恢復

檢查datafile=6的所有壞塊

檢查壞塊位置

RMAN>backup validate datafile 6;

驗證壞塊

select FILE#,BLOCK#,BLOCKS,CORRUPTION_CHANGE#,CORRUPTION_TYPE from v$database_block_corruption where file#=6;

修復壞塊

RMAN>blockrecover datafile 6 block 459202 from backupset;

如果有多個壞塊,可以用逗號分開,例如:

RMAN>blockrecover datafile 6 block 459202,643867,1963727;

4.如果沒有RMAN備份

索引型別壞塊,可以選擇重建索引;

資料型別壞塊,可以選擇跳過壞塊匯出資料,重建表。

如果是透過exp備份不能直接備份出有壞塊的表,需要設定內部事件

ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10';

透過expdp 備份可以直接跳過壞塊;

也可以使用10231事件忽略壞塊,然後使用CTAS方式重建表最後rename table,別忘記rebuild index,例如:

alter session SET EVENTS '10231 trace name context forever,level 10';
create table tab_new as select * from tab;
rename tab to tab_bak;
rename tab_new to new;
select 'alter index '||index_name||' rebuild;' from user_ind_columns where table_name='T1';
alter session SET EVENTS '10231 trace name context off';

###chenjuchao 20240308###

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

相關文章