Что происходит с последовательностью Oracle после аварийного восстановления? - PullRequest
4 голосов
/ 17 декабря 2008

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

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

Ответы [ 2 ]

7 голосов
/ 17 декабря 2008

Значения секвенции хранятся в таблице SYSTEM.SEQ $ (я думаю), и кэш сохраняется в памяти следующих используемых значений, причем размер этого кэша зависит от значения CACHE для последовательности .

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

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

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

2 голосов
/ 17 декабря 2008

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

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

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

...