Ошибка ORA-01578 и как с ней бороться

dbstalker, 25 ноября

Все знают насколько приятно получать эту ошибку. О ней уже упоминалось на нашем блоге здесь, здесь, здесь.

Но вчера ситуация была несколько иная. Сначала прибежал пользователь :

ORA-01578: ORACLE data block corrupted (file # 8, block # 760651) ORA-01110: data file 8: '/mnt/raid5/oracle/oradata/my_db/tbs1.dbf' ORA-26040: Data block was loaded using the NOLOGGING option 

Запросом :

select owner,segment_name,segment_type, EXTENT_ID, BLOCK_ID from dba_extents where file_id=8 and 760651 between  block_id and block_id+blocks-1;

или

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;

нашли, что индекс пострадал. Удалили его, создали заново. Не прошло и получаса, следующий пользователь также жалуется на жизнь. Но на этот раз все значительно хуже – пострадала большая таблица. Копии RMANом на этом сервере не делаются, холодный бэкап поднимать не было особого желания. Решили попробовать перенести таблицу и её индексы в другое табличное пространство.

ALTER TABLE MY_TABLE MOVE TABLESPACE NEW_ADMIN;
ALTER INDEX IND1_ MY_TABLE REBUILD TABLESPACE NEW_ADMIN;

Таблица и индексы перенеслись без проблем, приложение работает нормально. Можно заняться верификацией файлов данных. Об этом здесь.

Вывод: Перед тем как восстанавливать базу, можно попробовать перенести данные в другое табличное пространство.

Есть еще вот такие рекомендации:

Если пострадала таблица, то есть вариант спасти часть данных, или установив параметр сессии или указав конкретную таблицу:

ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';
execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS ('schema','tablename'.'partition');

Эти рекомендации взяты вот от сюда.

 

Новый комментарий

Я не спамер: введите суму 8+7



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Нужен поставщик Дропшиппинг
10 декабря, 1 ответа
КИНО КАФЕ!!!!!!!!!!!!!!!!
10 декабря, 1 ответа