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/*****