У всех (у меня так точно) администраторов появляется легкая ( или совсем даже не легкая?) паника при появлении сообщения об ошибке Oracle ORA-1578: “Oracle data block corrupted”
(Блок данных Oracle разрушен).
Об этой ошибке на блоге есть несколько статей. Суть их сводится к тому, что сначала нужно найти объект, которому принадлежит сбойный блок. Это можно сделать, выполнив следующий запрос:
SELECT owner, segment_name, segment_type FROM dba_extents WHERE file_id = FILE# AND BETWEEN block# AND block_id + blocks - 1; где, FILE# и block# получаем из сообщения об ошибке.
После того, как узнали, какому объекту принадлежит сбойный блок, определяемся с дальнейшими действиями. Они описаны в нескольких постах блога.
Но есть еще один интересный вариант.
В Oracle 9i Enterprise Edition появилась новая команда диспетчера восстановления (RMAN) – BLOCKRECOVER. С помощью этой команды можно восстановить блок в работающей базе без манипуляций с самим поврежденным объектом.
Когда мы выполняем резервное копирование RMAN-ом, обновляется представление V$DATABASE_BLOCK_CORRUPTION, содержащее перечень испорченных блоков.
Можно также использовать команду
BACKUP VALIDATE DATABASE;
По этой команде RMAN не делает бекап базы данных, но читает все блоки и проверяет их на повреждение. Если находятся поврежденные блоки, то информация о них попадает в V$DATABASE_BLOCK_CORRUPTION
Если информация о блоке находится в этом представлении, то командой BLOCKRECOVER его можно восстановить.
rman target / (или rman target sys/пароль@строка_коннекта) RMAN> BLOCKRECOVER DATAFILE хх BLOCK yy;
Чтобы восстановить все блоки, информация о которых находится в V$DATABASE_BLOCK_CORRUPTION, можно после команды BACKUP VALIDATE DATABASE использовать команду:
BLOCKRECOVER CORRUPTION LIST;
Мои рекомендации: сделайте проверку базы данных командой BACKUP VALIDATE DATABASE; регулярной. Поставьте в шедулер. Тогда RMAN обнаружит поврежденные блоки раньше, чем это сделают приложения. И гораздо раньше, чем вы удалите последнюю несбойную резервную копию. У вас будет время спокойно исправить ошибку. К тому же сбойный блок не попадет в вашу очередную резервную копию.
P.S. Если восстановления требуют много блоков, то полезнее восстанавливать поврежденный файл данных сначала командой restore (так восстанавливается последний Image Copies) и затем командой recover до момента повреждения.