Бывает, что после сбоя и перестроении сбойных сегментов остаются сбойные блоки, не принадлежащие ни одному сегменту. Чаще всего blockrecovery такие блоки не берет, но при check logical вылезают раздражающие ошибки.
Для того, чтобы от них избавиться, необходимо блок переформатировать, т.е. заполнить данными. Простое allocate extent какой-нибудь таблице не помогает и autoextend всем файлам ТП надо отключить.
Для начала определяете проблемные табличные пространства:
Код:
select distinct t.name from v$database_block_corruption b, v$datafile f, v$tablespace t where b.file#=f.file# and t.ts#=f.ts#;
Берем поочередно их и делаем (например, это USERS)
Код:
create table bobo tablespace USERS nologging pctfree 99 as select * from source$;
BEGIN
FOR i IN 1..1000000000 LOOP
INSERT INTO bobo select * from source$;
END LOOP;
END;
/
надо понимать, что цикл не учитывает разрастание файлов табличного пространства, поэтому за циклом надо следить.
Код:
select sum(bytes)/1024/1024/1024 from dba_segments where segment_name='BOBO';
select tablespace_name,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name;
соответственно, после успешного переформатирования необходимо табличку грохнуть
и перейти к следующему табличному пространству.