Традиционное (до Oracle 10g) управление undo сегментами

dbstalker, 01 июня

Как известно, Оракл, начиная с версии 10.0, использует новую запатентованную технологию(см. здесь) работы с undo сегментами. В этом посте попробую показать, как это было раньше.

Объяснение основано на вот этом рисунке.

Будем рассматривать транзакцию в четырех промежутках времени:

Время T1. Во времени T1 в буфере 142, содержится запись 136 со значением 105 в некоторой колонке.

Время T2. Во времени T2 транзакция изменяет в записи 136 значение поля с 105 на 110, что является результатом выполнения следующих трех основных операций:

  1. буфер 142 изменяется. Эта операция происходит буферном кеше, а не на диске.
  2. undo-запись должна быть записана в undo буфер 210. Это также происходит в буферном кэше, а не на диске. В ITL блока 136 нужно оставить указатель на undo буфер 210.
  3. redo–записи (в нашем случае их две) соответствующее каждому измененному блоку в буферном кеше должны быть записаны в redo log буфер.

Все эти операции выполняются в памяти, но если нужного блока нет в памяти, то он должен быть извлечен с диска, найден свободный буфер, и туда помещается. Конечно же, все, что связано с защелками, с pinning, и все, что связано с управлением памятью и операциями ввода –вывода, все это должно быть выполнено.

Время T3. Во времени T3 транзакция снова изменяет запись 136. Но на этот раз со значения 110 на 115.

  1. изменяется буфер 142
  2. undo-запись заносится в undo buffer 210. Корректируется ITL буфера 142, чтобы указывать на самую последнюю undo-запись.
  3. Изменения как для буфера 142, так и для undo буфера 210 записываются в redo log буфер.

Обратите внимание, “chain of undo” делает возможным возврат во время T1 и позволяет другим сессиям видеть запись 136 такой какой она была во время T1.

Время T4. Во времени T4, транзакция завершается (commit). ITL буфера 142 изменяется, отражая операцию commit ( это также вызывает генерацию undo, но на рисунке это не показано). Сommit-вектор заносится в redo log буфер на случай операций восстановления. Про commit-триггеру вызывается выполнение LGWR для сброса redo log буфера в текущий оперативный redo log.

Во время T4 в записи 136 находится значение 115. Любая сессия, стартовавшая после T4 и получившая доступ к блоку видит величину 115. Но даже после того, как транзакция завершена (Commit), если запрос начинался до времени T4, применение всей цепочки undo к текущему буферу 142 (с записью 136 со значением 115), Оракул восстановит старую версию буфера 142 содержащую запись 136 со значением 105.

Источник: All About Oracle’s In-Memory Undo Craig A. Shallahamer

Тэги: SGA, UNDO

ОднаКнопка

1 комментарий

Прокоментировать

Максим
15 мая 2011 г. в 17:52

Спасибо огромное!!!!!!!!!!!!
Очень наглядно и понятно.

 

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

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



 

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

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

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

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


 
 

Бизнес форум

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

Печь булерьян в дом
21 сентября, 1 ответа
Как Открыть Футбольную Школу
20 сентября, 1 ответа
IP телефония
20 сентября, 1 ответа