21.02.2015 18:45
OlegON
 
Смотрим табличное пространство и номера блоков
Код:
select distinct t.name, b.block# from v$database_block_corruption b, v$datafile f, v$tablespace t where b.file#=f.file# and t.ts#=f.ts#;
Смотрим свободное место в сбойном табличном пространстве (файлу надо прижать авторасширение)
Код:
select sum(s.bytes) from v$database_block_corruption b, dba_free_space s where b.file#=s.file_id;
Смотрим место в сбойном блоке
Код:
select f.name, s.bytes from v$database_block_corruption b, v$datafile f, dba_free_space s where b.file#=f.file# and s.file_id=b.file# and b.block# between s.block_id and s.block_id + s.blocks -1;
Экстент таблице на место в сбойном блоке.
Код:
select distinct 'alter table ok_test allocate extent (datafile '''||f.name||''' size '||s.bytes||');' from v$database_block_corruption b, v$datafile f, dba_free_space s where b.file#=f.file# and s.file_id=b.file# and b.block# between s.block_id and s.block_id + s.blocks -1;
Количество сбойных блоков в свободном месте
Код:
select count(*) from dba_free_space d, v$database_block_corruption b where b.file#=d.file_id and b.block# between d.block_id and d.block_id+d.blocks-1;
Расширяем табличку, пока она не нарастет на сбойные блоки
Код:
BEGIN
FOR i IN 1..10000 LOOP
execute immediate 'alter table ok_test allocate extent (datafile ''D:\DB\BASE\DATAFILE\O1_MF_USERS_7O9HSYTV_.DBF'' size 196608)';
END LOOP;
END;
/
И забиваем табличку данными
Код:
BEGIN
FOR i IN 1..100000000 LOOP
insert into ok_test select rownum id, '+' a from dual;
END LOOP;
END;
/