[ОТВЕТИТЬ]
Опции темы
11.02.2015 12:05  
OlegON
Бывает, что после сбоя и перестроении сбойных сегментов остаются сбойные блоки, не принадлежащие ни одному сегменту. Чаще всего 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;
соответственно, после успешного переформатирования необходимо табличку грохнуть
Код:
drop table bobo;
и перейти к следующему табличному пространству.
 
21.02.2015 17:03  
OlegON
Вот более правильный вариант для забивания таблички: Как заполнить тестовыми данными БД

Цитата:
create table ok_test storage (next 8192 pctincrease 0) tablespace users nologging
as
select 1 id, RPAD('+',4000,'+') a from dual;
BEGIN
FOR i IN 1..100000000 LOOP
insert into ok_test select rownum id, RPAD('+',4000,'+') a from dual;
END LOOP;
END;
/
 
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;
/
 
21.02.2015 19:49  
OlegON
Убился. Все эти ухищрения на одной из БД не работают в принципе.

P.S. И на второй.
 
21.02.2015 23:33  
OlegON
Судя по всему, блок принадлежит какому-то сегменту на самом деле... Т.е. отображается, как непринадлежащий, но зарезервированный. Уж и не знаю, но move всем таблицам помогает.
 
16.07.2015 08:36  
HobbytFizmat
Цитата:
Сообщение от OlegON
соответственно, после успешного переформатирования необходимо табличку грохнуть
Что понимается под "переформатированием"? Восстановление с помощью blockrecover?
 
 
Опции темы



Часовой пояс GMT +3, время: 05:20.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.