How to Find and repair Corrupt block in database
Step 1: Below query will show if there is any corrupted block
SELECTΒ *Β
FROMΒ Β Β v$database_block_corruptionΒ βΒ willΒ showΒ ifΒ anyΒ corrupedΒ blockΒ
Step 2: Below query can give you Detail information about corrupted block:
setΒ headΒ ON;Β
setΒ pagesizeΒ 2000Β
setΒ linesizeΒ 250Β
SELECTΒ *Β
FROMΒ Β Β v$database_block_corruption;Β
SELECTΒ e.owner,Β
Β Β Β Β Β Β Β e.segment_type,Β
Β Β Β Β Β Β Β e.segment_name,Β
Β Β Β Β Β Β Β e.partition_name,Β
Β Β Β Β Β Β Β c.file#,Β
Β Β Β Β Β Β Β Greatest(e.block_id,Β c.block#)Β
Β Β Β Β Β Β Β corr_start_block#,Β
Β Β Β Β Β Β Β Least(e.block_idΒ +Β e.blocksΒ βΒ 1,Β c.block#Β +Β c.blocksΒ βΒ 1)Β corr_end_block#Β
Β Β Β Β Β Β Β ,Β
Β Β Β Β Β Β Β Least(e.block_idΒ +Β e.blocksΒ βΒ 1,Β c.block#Β +Β c.blocksΒ βΒ 1)Β βΒ
Β Β Β Β Β Β Β Greatest(e.block_id,Β c.block#)Β +Β 1Β
Β Β Β Β Β Β Β blocks_corrupted,Β
Β Β Β Β Β Β Β NULLΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β descriptionΒ
FROMΒ Β Β dba_extentsΒ e,Β
Β Β Β Β Β Β Β v$database_block_corruptionΒ cΒ
WHEREΒ Β e.file_idΒ =Β c.file#Β
Β Β Β Β Β Β Β ANDΒ e.block_idΒ <=Β c.block#Β +Β c.blocksΒ βΒ 1Β
Β Β Β Β Β Β Β ANDΒ e.block_idΒ +Β e.blocksΒ βΒ 1Β >=Β c.block#Β
UNIONΒ
SELECTΒ s.owner,Β
Β Β Β Β Β Β Β s.segment_type,Β
Β Β Β Β Β Β Β s.segment_name,Β
Β Β Β Β Β Β Β s.partition_name,Β
Β Β Β Β Β Β Β c.file#,Β
Β Β Β Β Β Β Β header_blockΒ Β Β Β Β corr_start_block#,Β
Β Β Β Β Β Β Β header_blockΒ Β Β Β Β corr_end_block#,Β
Β Β Β Β Β Β Β 1Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β blocks_corrupted,Β
Β Β Β Β Β Β Β βSegmentΒ HeaderβΒ descriptionΒ
FROMΒ Β Β dba_segmentsΒ s,Β
Β Β Β Β Β Β Β v$database_block_corruptionΒ cΒ
WHEREΒ Β s.header_fileΒ =Β c.file#Β
Β Β Β Β Β Β Β ANDΒ s.header_blockΒ BETWEENΒ c.block#Β ANDΒ c.block#Β +Β c.blocksΒ βΒ 1Β
UNIONΒ
SELECTΒ NULLΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β owner,Β
Β Β Β Β Β Β Β NULLΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β segment_type,Β
Β Β Β Β Β Β Β NULLΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β segment_name,Β
Β Β Β Β Β Β Β NULLΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β partition_name,Β
Β Β Β Β Β Β Β c.file#,Β
Β Β Β Β Β Β Β Greatest(f.block_id,Β c.block#)Β
Β Β Β Β Β Β Β corr_start_block#,Β
Β Β Β Β Β Β Β Least(f.block_idΒ +Β f.blocksΒ βΒ 1,Β c.block#Β +Β c.blocksΒ βΒ 1)Β corr_end_block#Β
Β Β Β Β Β Β Β ,Β
Β Β Β Β Β Β Β Least(f.block_idΒ +Β f.blocksΒ βΒ 1,Β c.block#Β +Β c.blocksΒ βΒ 1)Β βΒ
Β Β Β Β Β Β Β Greatest(f.block_id,Β c.block#)Β +Β 1Β
Β Β Β Β Β Β Β blocks_corrupted,Β
Β Β Β Β Β Β Β βFreeΒ BlockβΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β descriptionΒ
FROMΒ Β Β dba_free_spaceΒ f,Β
Β Β Β Β Β Β Β v$database_block_corruptionΒ cΒ
WHEREΒ Β f.file_idΒ =Β c.file#Β
Β Β Β Β Β Β Β ANDΒ f.block_idΒ <=Β c.block#Β +Β c.blocksΒ βΒ 1Β
Β Β Β Β Β Β Β ANDΒ f.block_idΒ +Β f.blocksΒ βΒ 1Β >=Β c.block#Β
ORDERΒ Β BYΒ file#,Β
Β Β Β Β Β Β Β Β Β Β corr_start_block#;Β
Step 4: Β Collect file ids
SELECTΒ DISTINCTΒ file_idΒ
FROMΒ Β Β dba_extents;Β
Step 5: Collect detailsΒ
SELECTΒ file_id,Β
Β Β Β Β Β Β Β segment_name,Β
Β Β Β Β Β Β Β segment_type,Β
Β Β Β Β Β Β Β owner,Β
Β Β Β Β Β Β Β tablespace_name,Β
Β Β Β Β Β Β Β block_id,Β
Β Β Β Β Β Β Β blocksΒ
FROMΒ Β Β sys.dba_extentsΒ
WHEREΒ Β (Β file_idΒ BETWEENΒ 2Β ANDΒ 19Β )Β
Β Β Β Β Β Β Β ANDΒ 468598Β BETWEENΒ block_idΒ ANDΒ block_idΒ +Β blocksΒ βΒ 1;
Step 6:Β RepairΒ
a) Collect all data to temporary table and collect all DDL script and grants.
b) drop the table and re-create it with DDL script. (Disable refence key before drop, enable after create table)
c) Insert all records to the table
Note: This entire activity should not be taken in prod databases without Oracle supportβs recommendation.
Oracle Solutions We believe in delivering tangible results for our customers in a cost-effective manner