Getting this error,
RMAN-00571: ======================================================
RMAN-00569: ========= ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: =====================================================
RMAN-03009: failure of backup command on ch02 channel at 10/08/2012 18:18:35
ORA-19566: exceeded limit of 0 corrupt blocks for file /testdb/dev/oradata/test13.dbf
Get the file id of the above file using
select file_id from dba_data_files where file_name='/testdb/dev/oradata/test13.dbf';
File_id
------
16
If the backup is in tape
RMAN> RUN {
allocate channel ch01 TYPE 'SBT_TAPE';
send 'NB_ORA_CLIENT=<tapebackupserver>';
BACKUP VALIDATE CHECK LOGICAL datafile 16;
}
If the backup is in disk
RMAN> RUN {
allocate channel ch01 TYPE disk;
BACKUP VALIDATE CHECK LOGICAL datafile 16;
}
Now Check the view for block corruption
SQL> SELECT * FROM v$database_block_corruption;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
16 1719526 1 0 FRACTURED
You can also use the script located in this post which may give you object name of this corrupted block as well.
Link:-
SELECT owner, segment_name, segment_type, partition_name,
FROM dba_extents
WHERE file_id=16
AND 1719526 BETWEEN block_id AND block_id+blocks-1;no rows selected
If you get no rows, that means you have a corrupted block reported that is not part of any segment, RMAN reads blocks on the disk level, so it is not aware if they belong to an object. Thus if an object with corrupted blocks is dropped, those blocks remain FRACTURED until reused by a new object or allocated to an existing segment. At that time, Oracle will reformat the block (renew it) and thus remove the fracture.
Solution:- Use maxcorrupt to the number that is reported in above query, i.e above i have been shown only 1 block
RMAN> SET MAXCORRUPT FOR DATAFILE 16 to 1;
BACKUP DATABASE;
-Thanks
Geek DBA
Follow Me!!!