Switching Undo Tablespaces. Переключение пространств отмены

dbstalker, 14 сентября

Иногда у администратора возникает потребность в переключении пространств отмены. Примеры – здесь и здесь.

Достаточно часто даже после успешного переключения экземпляр взывает к старому undo. Попытаемся разобраться.

Как мы знаем, переключение базы данных на новый undo происходит по команде: ALTER SYSTEM SET UNDO_TABLESPACE = undotbs_new;

Во время процесса переключения база данных не останавливается, она открыта. Пользовательские транзакции могут быть выполнены в то время, когда происходит переключение. Если переключение успешно завершится, все транзакции, которые начнутся после переключения, будут из таблиц транзакции ссылаться на новое undo пространство. Операция переключения не ждет когда транзакции, работающие со старым undo, завершатся.

Если есть некоторые незаконченные транзакции, работающие со старым undo пространством, то это пространство переходит в режим PENDING OFFLINE. В этом режиме существующие транзакции могут продолжать работать со старым, но undo записи для новых пользовательских транзакций не будут попадать в него. Очевидно, что старое undo пространство может просуществовать в состоянии PENDING OFFLINE режима даже после успешного завершения переключения на новое undo – пространство. Undo пространства , находящиеся в таком режиме, не могут быть использованы другими экземплярами, и не могут быть удалены.

В конечном счете, когда все активные транзакции будут завершены, старое undo пространство автоматически перейдет из режима PENDING OFFLINE в режим OFFLINE.

<>Вроде бы все понятно и логично. Почему же все-таки после завершения всех транзакций оракл продолжается обращаться к старому undo?

Во всем виновата отложенная очистка блоков Delayed logging block cleanout. Следствием является то, что только в undo сегментах отражается реальное состояние транзакции. В самих блоках информация о завершении транзакции бывает неактуальной.

Читается блок таблицы или индекса с диска. И если окажется, что этот блок не был очищен по fast commit cleanout по завершению транзакции, тогда есть вероятность, того что блок ссылается на старое (с котрого мы уже переключились) undo –пространство.

Не плохо бы приучить своих пользователей сразу же после обновления больших таблиц выполнять что-то типа :

select /*+ FULL(table_) */ count(*) from ttable table_;

О том как подправлять блоки с помощью утилиты bbed.exe писать не буду. Это очень кропотливая работа и не для начинающих.

Тэги: UNDO

ОднаКнопка

 

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

Я не спамер: введите суму 5+4



 

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

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

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

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


 
 

Бизнес форум

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

Потрібна порада
25 апреля, 2 ответа
Посоветуйте адвоката
25 апреля, 1 ответа
Что скажите
25 апреля, 2 ответа