假设必须在灾难后恢复 Oracle 实例。序列是否重置为初始状态,或上次保存的状态,或者是否保留缓存值?
非常感谢。 :-)
最佳答案
序列值存储在 SYSTEM.SEQ$(我认为)表中,并在要使用的下一个值的内存中维护一个缓存,该缓存的大小取决于序列的 CACHE 值。
当缓存耗尽时,SEQ$ 表被更新为一个新值(以不一致的方式——即没有应用用户 session 的事务控制),然后从内存中读取接下来的 100 个值(如果 CACHE=100) .
假设您正在使用缓存大小为 20 的序列。当您从序列中选择某个值时,例如 1400,SEQ$ 表将更新为值 1420。即使您回滚事务,SEQ$在接下来的 20 个序列值被使用之前仍然具有该值,此时 SEQ$ 更新为 1440。如果您刚刚使用了值 1423 并且发生了实例崩溃,那么当系统重新启动要从中读取的下一个值时序列将是 1440。
因此,是的,将保留序列的完整性,并且不会“重新发布”数字。请注意,这同样适用于正常关闭——当您重新启动时,您将在上面的示例中获得一个新值 1440。由于这个原因,序列在实践中不能保证是无间隙的(也是因为使用一个值然后回滚不会将该值恢复到缓存中)。
关于oracle - 灾难恢复后 Oracle 序列会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/373914/