Очистка блока в ORACLE. Быстрая очистка блока Commit Cleanout, отложенная очистка блока Delayed Block Cleanout

dbstalker, 20 октября

В Oracle не существует такого понятия как «менеджер блокировок». Для того, чтобы узнать заблокирована ли запись, нужно попасть в блок, где эта запись находится, и только там можно получить информацию о блокировании нужной записи (см здесь и здесь и здесь.). В этом посте попробуем разобраться, как очищается информация о блокировании записи транзакцией.

Алгоритм фиксации транзакции состоит в последовательном выполнении следующих шагов:

  1. Выполняется генерация SCN для транзакции.
  2. Обновляется таблица транзакций заголовка сегмента отката
  3. Снимается exclusive pin с заголовка сегмента отмены, undo блок попадает в пул свободных блоков
  4. Создается маркер фиксации транзакции в redo log буфере
  5. Процессом LGWR сбрасывается redo log буфер на диск
  6. Освобождаются блокировки на записях и таблицах.

Иными словами, для того, чтобы зафиксировать транзакцию, обязательно и в первую очередь нужно обновить соответствующий слот в таблице транзакций в заголовке сегмента отката (прописывается SCN и изменяется статус транзакции). Затем - сбросить redo log буфер на диск. Именно после этих действий все сессии будут знать, что транзакция завершена, и изменения в блоках выполнены и действительны.

Очевидно, что совсем необязательно в момент фиксации делать изменения в самих блоках данных (см. пункт 6). Любая сессия, прочитав блок данных, в его ITL-слоте если и увидит, что нет отметки о завершении транзакции, то она все равно по ссылке из ITL-слота обратиться к заголовку сегмента отката и там, в таблице транзакций уже есть отметка о том, что транзакция была завершена. Таким образом, сессии по содержимому слота в таблице транзакций заголовка сегмента отмены определяют, является ли данная транзакция завершенной. А вот для того, чтобы не было необходимости обращаться к сегментам отмены, а достаточно было бы прочитать только сам блок данных и определиться с блокировками записей и таблиц, необходима так называемая «очистка блоков».

Очистка блоков может выполняться как непосредственно во время фиксации транзакции (Commit Cleanout), так и значительно позже во время обращения к блоку уже после завершения транзакции (Delayed Block Cleanout).

Commit Cleanout

Когда Вы модифицируете данные, то вы делаете буферизованные блоки грязными (dirty). Вполне возможно, что DBWR скопирует некоторые блоки на диск еще до того, как вы выполните commit.

Когда вы выполняете commit, ваша сессия обновит соответствующий слот таблицы транзакций в заголовке сегмента отката, то есть пометит транзакцию как завершенную (state=9 - зафиксирована). В ходе этой процедуры генерируется немного redo, описывающих эту операцию. Затем вызывает lgwr для записи redo на диск.

Дополнительно, ваша сессия может также повторно посетить несколько блоков данных, которые были изменены (10% от всего buffer cache) и обновит соответствующий ITL слот транзакции в этих блоках: проставит commit SCN ( хотя будет обзываться как fsc ) и выставит флаг U. Обратите внимание, что и при отложенной очистке также возможен флаг U. Но эти две ситуации отличаются наличием (при Commit Cleanout ) и отсутствием (при Delayed Block Cleanout) значения в индикаторе Lck блокировок на уровне записи.

Сommit cleanout не делает полную очистку в блоке (например, при commit cleanout не очищаются lock byte измененных записей ), но зато такая очистка блока гарантирует, что следующие процессы посмотревшие блок сразу же будут знать, что ваша транзакция завершена. И обращаться к сегменту отмены не будет необходимости.

Особо важно отметить, что выполнение commit cleanout хотя и производит некоторые изменения в блоке, но не вызывает генерацию redo описывающее это изменение, а так же не изменяет статистику «db block gets» для блока , который был изменен.

Вывод: В процессе транзакции формируются редо записи, которые постепенно сбрасываются на диск. По этой причине в момент фиксации остается сбросить на диск незначительное число редо. Далее, в процессе фиксации транзакции изменяется сегмент отмены (см пункт 2 алгоритма). Это действие вызывает незначительную генерацию редо. А действия в блоках данных в процессе сommit сleanout вообще не вызывают генерацию редо. В итоге фиксации транзакции формируется мало редо, а значит, что дорогостоящих операций ввода-вывода будет не так уж и много. Это важно для ускорения процесса фиксации, так как пользователи не будут долго ждать его завершения.

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

Block Cleanout / Delayed Block Cleanout

Возможно, что некоторые блоки, измененные вашей транзакцией, в процессе выполнения транзакции были записаны на диск процессом dbwr , то есть были сброшены из буферного кеша раньше, чем транзакция завершилась. Ваш сеанс, фиксирующий транзакцию, не будет перечитывать эти блоки вновь, для того чтобы их очистить. К тому же, если ваша транзакция была очень продолжительной и модифицировала много блоков, то весьма вероятно, что ваш сеанс не будет очищать и все блоки, которые еще находятся в памяти (обычно очищается около 10% от размера буферного кеша).

Впоследствии другой сеанс прочитает один из этих измененных блоков. С помощью перекрестной проверки ITL слота ( там есть ссылка на сегмент отмены) с соответствующим слотом таблицы транзакций заголовка сегмента отмены определит, что ITL включает транзакцию, которая уже завершена. Но, тем не менее, ITL не был очищен и байты блокировок записей так же не были очищены.

Тогда этот сеанс очистит все неактуальные lock байты в заголовках строк и в ITL-слотах, освобождаются все fsc (freespace credit), ITL слот помечается соответствующим флагом (flag С), устанавливается scn.

Кроме того, корректируется row directory - из него удаляются записи об удаленных строках, и соответствующие его слоты могут быть использованы вновь. Однако место в блоке, на которое ссылается этот слот, будет доступно только после дефрагментации блока.

Все эти процедуры будут сделаны для всех завершенных транзакций, обнаруженных в прочитанном блоке.

Так как механизм полной очистки никогда не происходит во время commit , то он обычно называется как delayed block cleanout. Блок подвергается полной очистке либо при проверке факта заблокированности строки, либо когда транзакция пытается использовать ITL-слот, подвергшийся быстрой очистке, либо когда транзакция пытается использовать fsc другой транзакции.

Есть два варианта выполнения delayed block cleanout:

  1. прочитавший процесс может определить точный SCN , который был в силе во время commit, так как состояние сегментов отмены все еще свежее, то есть не было перезаписано в ходе последующих транзакций. В этом случае блок будет отмечен корректным - commit SCN и флаг будет выставлен в С.
  2. если прошло много времени и commit SCN нельзя определить, тогда блок будет помечен 'best guess' (лучшая догадка) SCN или upper bound commit number (верхняя граница, когда транзакция наверняка была закоммичена) или еще называют control SCN.Если вы сделаете дамп заголовка сегмента отмены, то перед таблицей транзакций найдете раздел TRN CTL. Тот scn, который вы там видите и есть control SCN ( best guess SCN,upper bound commit number). см статью. Флаг дополнительно выставляется в U ( в итоге флаг будет: С-U-). Еще раз обращаем внимание, что и при быстрой очистке также возможен флаг U. Но эти две ситуации отличаются наличием (при Commit Cleanout ) и отсутствием (при Delayed Block Cleanout) значения в индикаторе Lck (т. е.очищены или нет блокировок на уровне записи).

Операция delayed block cleanout изменяет блоки, а это вызывает генерацию redo. В этом случае можете наблюдать генерацию redo на команду select, особенно после большого обновления данных. Можно обнаружить рост статистики «db block changes» когда это происходит, но посещение блока не будет отражено на статистике «db block gets».

Отложенную очистку можно наблюдать как "cleanout %" и "consistent gets - examination" статистики (V$SYSSTAT или V$SESSTAT).

Источник

 

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

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



 

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

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

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

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


 
 

Бизнес форум

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

Нужна гадалка
20 июля, 1 ответа
Бутель для воды
20 июля, 1 ответа