假设在灾难发生后必须恢复Oracle实例.序列是重置为初始状态还是上次保存的状态,还是保留了缓存的值?
非常感谢你.:-)
sequnce值存储在SYSTEM.SEQ $(我认为)表中,缓存在内存中保存下一个要使用的值,该缓存的大小取决于序列的CACHE值.
当缓存耗尽时,SEQ $表被更新为一个新值(以不一致的方式 - 即没有应用用户会话的transacton控件),并且从内存中读取下一个说100个值(如果CACHE = 100) .
假设您正在使用缓存大小为20的序列.当您从序列中选择某个值(例如1400)时,SEQ $表将更新为值1420.即使您回滚事务中的SEQ $仍然具有该值,直到使用下一个20个序列值,此时SEQ $更新为1440.如果您刚刚使用了值1423并且发生实例崩溃,那么当系统重新启动下一个要读取的值时sequnce将是1440年.
所以,是的,序列的完整性将被保留,数字将不会被"重新发布".请注意,这同样适用于正常关闭 - 当您重新启动时,您将在上面的示例中获得新值1440.由于这个原因,在实践中序列不能保证无间隙(因为使用值然后回滚不会将该值恢复到缓存).