Появился у меня в базе один битый (поврежденный) блок: ORA-01578: Oracle data block corrupted (file ..., block ...). По указанному номеру файла и номеру блока запросом:
SELECT owner, segment_name, segment_type FROM dba_extents WHERE file_id = <номер_файла> AND <номер_блока> BETWEEN block_id AND block_id + blocks - 1;
Был найден поврежденный сегмент – таблица. Оказалось таблицу можно удалить. Ну вот и удалили ее командой:
Drop table таблица;
Как и следовало ожидать представление v$database_block_corruption все еще содержит информацию о поврежденном блоке. Нужно чем-то переписать блок. Создаем относительно большую таблицу в надежде, что блок будет переписан. Но не тут то было. Таблица никак не хочет попадать в битый блок. В чем дело?
Предыдущий требование никакого сегмента в битом блоке не находит. Тогда взяли другой:
select ds.owner, ds.segment_name, ds.partition_name, ds.segment_type, ds.tablespace_name, e.ktfbueextno, f.file#, e.ktfbuebno, e.ktfbueblks * ds.blocksize, e.ktfbueblks, e.ktfbuefno from sys.sys_dba_segs ds, sys.x$ktfbue e, sys.file$ f where e.ktfbuesegfno = ds.relative_fno and e.ktfbuesegbno = ds.header_block and e.ktfbuesegtsn = ds.tablespace_id and e.ktfbuesegtsn = f.ts# and e.ktfbuefno = f.relfile# and f.file#=номер файла and номер блока between e.ktfbuebno and e.ktfbuebno + e.ktfbueblks - 1;
Оказалось, там продолжала находиться удаленная таблица! Мы совершенно забыли, что после удаления таблица попадает в корзину! Вернее она остается на прежнем месте и ее индексы тоже, только оракл переименовывает! Выполнили:
PURGE dba_recyclebin;
Новой таблицей переписали битый блок.
Решили, что корзина нам только портит жизнь, следовательно поменяли параметр:
ALTER SYSTEM SET "recyclebin"=OFF SCOPE = BOTH;
И зажили счастливо.