Oracle-как работают транзакция, сегмент отката и параметр сохранения отмены?

Я не DBA, и мне немного сложно понять процесс управления транзакциями Oracle.

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

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

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

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

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

3 ответов


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

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

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

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

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


мое понимание (в основном) позже, этой ссылке есть подробности.

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


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

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

и

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