Oracle - Как работает транзакция, сегмент отката и параметр undo_retention? - PullRequest
8 голосов
/ 10 октября 2008

Я не администратор баз данных, и мне сложно понять процесс управления транзакциями в Oracle.

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

Но кто-то в нашей компании, предположительно в курсе, недавно сказал мне обратное: по его словам, когда транзакция совершается, новые данные немедленно записываются в блоки данных, и откат табличное пространство сегмента / отмены хранит старые данные в течение UNDO_RETENTION секунд. Эти старые данные остаются доступными в течение этого времени для доступа по запросам, запущенным в SCN до транзакции.

Итак, что же на самом деле происходит внутри Oracle, и можете ли вы предоставить ссылки для подтверждения своего ответа?

Мы используем Oracle 9.2.0.8.

Заранее спасибо.

Ответы [ 3 ]

13 голосов
/ 10 октября 2008

Много, чтобы покрыть здесь! Сотрудник вашей компании, по сути, прав, за исключением того, что изменения записываются в блок данных в памяти по мере их внесения даже до фиксации; и они записываются на диск полностью независимо от того, когда вы фиксируете (возможно, до, возможно, после, никогда как часть операции фиксации).

1) UNDO_RETENTION не имеет ничего общего с тем, когда ваши изменения записываются в блок данных, либо в памяти, либо на диске. UNDO_RETENTION контролирует, как долго сохраняются данные, необходимые для отмены вашего изменения, ПОСЛЕ того, как вы передадите изменение. Цель состоит в том, чтобы другие запросы или сериализуемые транзакции, запущенные до вашей фиксации, могли по-прежнему запрашивать эти данные. Справка: http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/undo.htm#sthref1477

2) При обновлении блоки данных в памяти изменяются. Они могут записываться или не записываться на диск (я полагаю, даже до того, как вы совершите коммит); это делается фоновым процессом. Также информация повторов записывается в буфер журналов повторов. Отмена генерируется и сохраняется в сегменте отмены.

3) Когда вы фиксируете, Oracle проверяет, что ваша информация о восстановлении записана на диск, и помечает данные отмены как зафиксированные. Но он не записывает измененные блоки данных в памяти на диск и не возвращает назад и не отмечает каждый блок как зафиксированный. Это сделано для того, чтобы сделать коммит как можно быстрее. Справка: http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/transact.htm#sthref628

4) Блоки данных в памяти будут помечены как зафиксированные, когда они будут записаны на диск фоновым процессом, или в следующий раз, когда они используются (с помощью SELECT или любой другой операции). Это то, что обсуждается в записке AskTom. Это не о том, записаны ли ваши изменения данных в блок; речь идет о том, помечены ли они как зафиксированные в самом блоке.

0 голосов
/ 10 октября 2008

Я также голосую за вторую версию, основанную на
это ссылка (то есть Oracle 10.2, но я думаю, что она также применима и к 9.2).

Там написано: «После фиксации транзакции данные отмены больше не нужны для отката или восстановления транзакции. Однако для согласованных целей чтения для длительных запросов может потребоваться эта старая информация отмены для создания более старых изображений блоков данных».

и

"Когда включено автоматическое управление отменой, всегда существует текущий период хранения отмены, который представляет собой минимальное время, в течение которого Oracle Database пытается сохранить старую информацию отмены перед ее перезаписью."

0 голосов
/ 10 октября 2008

Насколько я понимаю (в основном) позже, Эта ссылка содержит подробности.

Блоки данных не должны записываться, просто обновляются в буфере, они могут записываться или не записываться на диск. Перед тем как выполнить коммит, повтор должен быть записан на диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...