我想请教一下在sequence操作过程中发生掉电后,恢复是如何做的,两个例子:1.CREATE SEQUENCE TESTSQC START WITH 0 INCREMENT BY 1 MINVALUE 0 MAXVALUE 10000 CYCLE
这种情况下,没有指定cache值,如果当前通过NextVal读到值为1052的时候发生了突然掉电情况,那么在下次数据库系统恢复时,能够保证通过CurrVal获得的掉电后第一个sequence值为1052吗? 2.CREATE SEQUENCE TESTSQC START WITH 20 INCREMENT BY 1 MINVALUE 20 MAXVALUE 10000 CACHE 100 CYCLE
这种情况下,指定了cache值100, 如果通过NextVal读到值为1052的时候发生了突然掉电情况,那么在下次数据库系统恢复时,通过CurrVal获得的掉电后第一个sequence值应该是多少呢?请高人指点一下,不慎感激!
这种情况下,没有指定cache值,如果当前通过NextVal读到值为1052的时候发生了突然掉电情况,那么在下次数据库系统恢复时,能够保证通过CurrVal获得的掉电后第一个sequence值为1052吗? 2.CREATE SEQUENCE TESTSQC START WITH 20 INCREMENT BY 1 MINVALUE 20 MAXVALUE 10000 CACHE 100 CYCLE
这种情况下,指定了cache值100, 如果通过NextVal读到值为1052的时候发生了突然掉电情况,那么在下次数据库系统恢复时,通过CurrVal获得的掉电后第一个sequence值应该是多少呢?请高人指点一下,不慎感激!
再也读取不到1052这个值了,你可以在plsql里面测试
select TESTSQC.NextVal from dual; 连续这样几次,你就看得出来了第二个问题没有试过?
http://topic.csdn.net/u/20090306/14/142fd517-2ca2-4654-8960-c17a6da68c5a.html
2.nextval肯定是1120,currval我想应该也是1052
cache N 只在预先放在缓冲区的个数,默认为20!不会对sequence的事务特性有影响!
所以
1.nextval是1053,currval是1052
2.nextval是1053,currval是1052
1. 下一个是1053,在使用nextval之前使用currval没有值,返回错误2. 1120, 因为初始值20,cache100,那么在读取到1020的时候就已经把1020到1119之间100个值cache到内存中了,1052是直接从内存中取出的,这个时候掉电,重启后会从1120开始
1,不是是1053,没有cache,那么这个号没有回滚段,也不记录到回滚表空间里面。所以直接nextval的话就是1053!2,理论上是1120,因为你cache了,所以你的1020到1119这些记录已经预先以脏数据的形式放到回滚段里,记录在回滚表空间里面了,所以重启数据库之后,会取到1120这个号,而从这个号开始算起。---------------------------
若有说的不当之处,欢迎大家斧正!
当分配到1020的时候,磁盘上sequence的值已经被修改成1119了(cache100个),这提前100个取出来的值就放在内存中,在使用的时候直接从内存中取出来就行,当用完这100个号的时候,才会考虑重新取100个号放到内存中,每100个号才更新一次磁盘上sequence的值,一次加100,这就是为什么能够通过cache提高效率;如果你所说,sequence不存在回滚的问题(circle类型的sequence的号会循环重新开始除外),那么放在undo segment里面有什么作用呢?sequence存储在system表空间,不管是否断电,system表空间都是在磁盘上的,不会因为掉电而丢失(磁盘损坏或者system表空间的数据文件被删除等等除外)
然后重新启动电脑,那么下次重启动电脑时是从1071开始还是从1120开始?
看重新启动电脑前,数据库的关闭方式shutdown normal/immediate 等正常关闭方式,从1071开始shutdown abort 等不正常关闭方式,从1120开始;取决于shared_pool里面的值写回磁盘了没有