16 июня 2012

SEG$


Мой некоторый опыт по этой таблице

Хронология такова:

Событие 1.

Пытаюсь дропнуть tablespace, получаю ORA-01561: failed to remove all objects in the tablespace specified
Хотя там точно ничего нет. DBA_SEGMENTS и DBA_EXTENTS пусты для этого тэйблспейса и его датафайлов.
Данная проблема решена и описана в http://www.sql.ru/forum/actualthread.aspx?tid=243553
Именно так её и решил -- удалил 2 записи из SEG$, тэйблспейс дропнулся
Но, отметил для себя, что такая проблема может быть не одна -- надо будет как-то поискать подобные проблемы. При этом DBV говорит, что все ок, backup validate check logical -- тоже ок

Событие 2.


Восстанавливался из бэкапа, сделал RESTORE, RECOVERY until SCN, прошло нормально.
Но в итоге получил более 100 corrupted блоков. Тип повреждения--NOLOGGING, поэтому, не страшно, но исправлять надо.

Часть блоков была занята данными -- поправил путем move на другое табличное пространство и обратно. Починилось.

Но некоторая часть битых блоков, согласно DBA_EXTENTS, была распределена под такой сегмент, для которого _не_ существовало таблицы.
А дело было в чем.
Это была IOT-таблица.
Я их именую определенным образом, если таблица называется QDEMANDS, то её первичный ключ -- QDEMANDS_PKIOT.
Я вижу экстент сегмента QDEMANDS_PKIOT, пробую подвинуть таблицу
alter table move QDEMANDS tablespace <другое TS>
вижу, что такой таблицы нет. Я предположил, что опять столкнулся с ситуацией, которую описал в "событии 1". Ну и решил её таким же способом. Я жестоко ошибался.
Таблица от этого сегмента называлась QDEMAND, я её переименовывал.

При обычном экспорте на этой таблице получил EXP-00003: no storage definition found for segment(number, number).
Интернет рекомендует решать эту проблему вот так
http://www.dbacorner.com/2007/02/exp-00003-no-storage-definition-found.html

Я посчитал данный метод опасным.
Восстановил удалённую строку из SEG$ путём flashback

select * from SEG$ as of timestamp systimestamp - numtodsinterval (1, 'HOUR')
minus
select * from SEG$

Там оказалось 6 строк, свою удалённую я узнал, и сделал её insert обратно в SEG$
Проблему экспорта решил, таблицу помувал туда-сюда и её блоки перестали быть CORRUPTED NOLOGGING

Мощная вещь -- flashback

Не лишне будет напомнить, что самостоятеьно редактировать SEG$ -- последнее дело. Надо в саппорт обращаться

Комментариев нет:

Отправить комментарий