Block corruption tespiti ve düzeltilmesi

Oracle veritabanlarında block corruption , korkulu bir rüya değildir. Archivelog modda olan ve düzenli rman yedeği alınan veritabanlarında çok basit bir şekilde düzeltilebilir.

Öncelikle aşağıdaki sorgu ile corruption olup olmadığını kontrol ediyoruz.

select * from v$database_block_corruption;

RAC ise

select * from gv$database_block_corruption;

Yukarıdaki listedeki bozuk bloklar üzerinde hangi nesnelerin olduğunun tespiti için aşağıdaki sorguyu kullanabilirsiniz.

SELECT segment_name, segment_type, owner
  FROM dba_extents
 WHERE file_id = <dosya_id> AND <blok_id> BETWEEN block_id AND block_id + blocks - 1;

ya da 

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#;

Bu listedeki tüm corruption’ları düzeltmek için RMAN ile aşağıdaki komutu çalıştırmak yeterli olacaktır.

RMAN> blockrecover corruption list;

Yada belirli bir bloğu düzeltmek için;

RMAN> blockrecover datafile 151 block 3454464;

Datafile ve blok numarasını v$database_block_corruption görüntüsünden bulabilirsiniz.

Son olarak düzenleme sonrasında ilgili datafile’ları kontrol etmeniz gerekmektedir. Aşağıdaki komut ile tüm datafile’ı taratıp sorun olup olmadığını görebilirsiniz.

RMAN> backup validate check logical datafile 151;

Starting backup at 31-MAR-16
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
using channel ORA_DISK_4
using channel ORA_DISK_5
using channel ORA_DISK_6
using channel ORA_DISK_7
using channel ORA_DISK_8
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00151 name=+DATA/orcl/datafile/data_ts.1491.871430401
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:35
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
151  OK     0              153363       3932160         629800241304
  File Name: +DATA/orcl/datafile/data_ts.1491.871430401
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       0              3718487         
  Index      0              3829            
  Other      0              56481           

Finished backup at 31-MAR-16

 

Yukarıdaki çıktıdaki gibi Status OK ve Blocks Failing değerleri sıfır ise sorun düzelmiştir diyebiliriz.

Ayrıca offline olarak datafile kontrolü için DB verify aracını da kullanabilirsiniz. Örnek komut aşağıdaki gibidir.

dbv file=+DATA/orcl/datafile/users.411.795847253 blocksize=8192 userid=sys/*****

 

Loading

Leave Your Comment