Что происходит с последовательностью Oracle после аварийного восстановления?

StackOverflow https://stackoverflow.com/questions/373914

  •  22-08-2019
  •  | 
  •  

Вопрос

Предположим, экземпляр Oracle должен быть восстановлен после сбоя.Сбрасываются ли последовательности в исходное состояние или в последнее сохраненное состояние, или сохраняются кэшированные значения?

Большое вам спасибо.:-)

Это было полезно?

Решение

Значения последовательности сохраняются в СИСТЕМЕ.SEQ $ (я думаю) таблица, и в памяти сохраняется кэш для следующих значений, которые будут использоваться, причем размер этого кэша зависит от значения КЭША для последовательности.

Когда кэш исчерпан, таблица SEQ $ обновляется до нового значения (непоследовательным образом - т.Е.без применения управления транзакциями пользовательского сеанса) и следующие, скажем, 100 значений (если КЭШ = 100) считываются из памяти.

Давайте предположим, что вы используете последовательность с размером кэша 20.Когда вы выбираете определенное значение из последовательности, скажем, 1400, таблица SEQ $ обновляется до значения 1420.Даже если вы откатите свою транзакцию, SEQ $ по-прежнему будет иметь это значение до тех пор, пока не будут использованы следующие 20 последовательных значений, после чего SEQ $ будет обновлен до 1440.Если затем вы только что использовали значение 1423 и произошел сбой экземпляра, то при перезапуске системы следующим значением, которое будет считано из последовательности, будет 1440.

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

Другие советы

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

Что касается кэшированных значений, то они (могут быть) потеряны даже тогда, когда экземпляр завершает работу упорядоченным образом (*):Экземпляры кэшируют ряд значений последовательности в памяти (SGA) вместо того, чтобы каждый раз обращаться к базе данных.Неиспользуемые значения последовательности, зарезервированные экземпляром, могут "исчезнуть", оставив вас с пробелами в последовательности.

(*) в документации 8i упоминается, что это может произойти с параллельными экземплярами (RAC), и в этом случае последовательность может быть даже не строго возрастающей (но все равно уникальной), в документах 10g говорится, что это происходит в случае сбоя экземпляра.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top