`

序列使用cache值的缺陷

 
阅读更多

列cache的默认值是20,使用cache的好处是:可以加快获得序列值。
但坏处是如果非正常关库时,保存在内存中的所有用户的序列值,全部丢失,导致序列值跳跃。
甚至把cache值保持到sharepool中,异常关机照样会丢失序列值。
所以,shut abort慎用,或者用之前使用以下sql,把序列cache值不为0的改为0,等库重启后,再改为原值。
sys用户下执行:
SQL> set pages 9000
SQL> set lines 400
SQL> spool seq_cache.txt
SQL> select 'alter sequence '||sequence_owner||'.'||sequence_name||' cache '||CACHE_SIZE||';' from dba_sequences where cache_size!=0;
SQL> spool off
把结果保存到一个文件中。

把cache值不为0的序列改为0:
select 'alter sequence '||sequence_owner||'.'||sequence_name||' nocache;' from dba_sequences where cache_size!=0;
把结果执行。

 

测试过程:
SQL> show user
USER is "SCOTT"
SQL> select scott_seq.nextval from dual;

   NEXTVAL
----------
        65

SQL> show user
USER is "SYS"

SQL> select sys_seq.nextval from dual; 

   NEXTVAL
----------
        26

SQL> select JOBSEQ.nextval from dual;

   NEXTVAL
----------
        48

SQL> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  238530560 bytes
Fixed Size                  1335724 bytes
Variable Size             150998612 bytes
Database Buffers           83886080 bytes
Redo Buffers                2310144 bytes
Database mounted.
Database opened.
SQL> select JOBSEQ.nextval from dual;

   NEXTVAL
----------
        49    

SQL> select sys_seq.nextval from dual; 

   NEXTVAL
----------
        27   --正常关库没有导致序列丢失


[oracle@db ~]$ sqlplus scott/tiger

SQL*Plus: Release 11.2.0.1.0 Production on Sun Aug 19 11:40:22 2012

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select scott_seq.nextval from dual;

   NEXTVAL
----------
        66  --正常关库没有导致序列丢失

SQL> show user
USER is "SYS"
SQL> shut abort
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  238530560 bytes
Fixed Size                  1335724 bytes
Variable Size             150998612 bytes
Database Buffers           83886080 bytes
Redo Buffers                2310144 bytes
Database mounted.
Database opened.
SQL> select sys_seq.nextval from dual; 

   NEXTVAL
----------
        47

SQL> select JOBSEQ.nextval from dual;

   NEXTVAL
----------
        69   --异常关库导致sys用户的序列递增了20

[oracle@db ~]$ sqlplus scott/tiger

SQL*Plus: Release 11.2.0.1.0 Production on Sun Aug 19 11:42:35 2012

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select scott_seq.nextval from dual;

   NEXTVAL
----------
        86   --异常关库导致scott用户的序列递增了20

再把JOBSEQ保持到sharepool,看看异常关库会不会导致该序列数值跳跃。
SQL> exec dbms_shared_pool.keep('JOBSEQ','Q');

PL/SQL procedure successfully completed.

SQL> show user
USER is "SYS"
SQL> shut abort
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  238530560 bytes
Fixed Size                  1335724 bytes
Variable Size             150998612 bytes
Database Buffers           83886080 bytes
Redo Buffers                2310144 bytes
Database mounted.
Database opened.

SQL> select JOBSEQ.nextval from dual;

   NEXTVAL
----------
        89   --看来dbms_shared_pool.keep()不能防止序列跳跃

 

把三个序列设为nocache,再做异常关库
SQL> alter sequence sys_seq nocache;

Sequence altered.

SQL> alter sequence jobseq nocache;

Sequence altered.

SQL> alter sequence scott.scott_seq nocache;

Sequence altered.

SQL> shut abort
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  238530560 bytes
Fixed Size                  1335724 bytes
Variable Size             150998612 bytes
Database Buffers           83886080 bytes
Redo Buffers                2310144 bytes
Database mounted.
Database opened.
SQL> select sys_seq.nextval from dual; 

   NEXTVAL
----------
        48   --此时序列是正常的

SQL> select JOBSEQ.nextval from dual;

   NEXTVAL
----------
        70

SQL> select scott.scott_seq.nextval from dual; 

   NEXTVAL
----------
        87  --此时序列正常了。


看来shut abort 执行前,要先做的一步是把cache值不为0的序列,改为0,才能防止序列值跳跃。

 

 


以下是序列的语法和用法:
sequence 序列
 流水号(整数)递增或递减
 存在于library cache
 通常为主键或唯一约束提供值
 减少编写生成序列的程序代码量
 比如QQ号的产生
 

语法
 CREATE SEQUENCE seq_name
 [INCREMENT BY n]
 [START WITH n]   3    1
 [{MAXVALUE N | NOMAXVALUE}]
 [{MINVALUE N | NOMINVALUE}]
 [{CYCLE | NOCYCLE}]
 [{CACHE N|NOCACHE}];


 

INCREMENT BY  N表示步长
START WITH N N表示初始值
[NO]MAXVALUE N N表示有没有最大 最大值是多少 NOMINVALUE选项最大值时10^27
[NO]MINVALUE N  N最小值
CYCLE  达到最大是否循环回到初始值
[NO]CACHE 就是你每次在内存里预保存多少个值 免得每次都要获取 浪费资源 一次获取批量存在内存中

 

取值方法
 NEXTVAL 返回下一个值
 CURRVAL 返回当前值
钉(pin)缓存
start with 不能修改  历史回溯只能删了再建


SQL> create sequence my_seq;

Sequence created.

SQL> select my_seq.currval from dual;
select my_seq.currval from dual
       *
ERROR at line 1:
ORA-08002: sequence MY_SEQ.CURRVAL is not yet defined in this session

初始的序列必须用nextval先取值
SQL> select my_seq.nextval from dual;

   NEXTVAL
----------
  1

SQL> select my_seq.currval from dual;

   CURRVAL
----------
  1

SQL> 
通过nextval获取 序列就是在增长
SQL> select my_seq.nextval from dual;

   NEXTVAL
----------
  2

修改序列
 alter SEQUENCE seq_name
 [INCREMENT BY n]
 [START WITH n]
 [{MAXVALUE N | NOMAXVALUE}]
 [{MINVALUE N | NOMINVALUE}]
 [{CYCLE | NOCYCLE}]
 [{CACHE N|NOCACHE}];


SQL> alter sequence seq2 start with 10;
alter sequence seq2 start with 10
                    *
ERROR at line 1:
ORA-02283: cannot alter starting sequence number


SQL> alter sequence seq2 cache 10;

Sequence altered.

SQL> alter sequence seq2 cycle;

Sequence altered.

分享到:
评论

相关推荐

    LRU算法实现LRU算法实现LRU算法实现LRU算法实现LRU算法实现

    现在,实现LRU算法的主要逻辑在up_cache函数中,该函数将页面访问序列walk_sort和缓存数组cache作为输入参数。 void up_cache(Cache cache[], int walk_sort[]) { int i = 0; // i 为访问序列数组的下标 int x; ...

    mybatis plus使用redis作为二级缓存的方法

    但是,这种缓存机制有一个缺陷,即缓存的数据会随着应用程序的重启而丢失。为了解决这个问题,可以使用 Redis 作为二级缓存,将缓存数据存储在 Redis 中,从而使缓存数据更加持久。 使用 Redis 作为二级缓存的步骤 ...

    详解Spring boot使用Redis集群替换mybatis二级缓存

    RedisCache 类使用 JdkSerializationRedisSerializer 来序列化和反序列化缓存数据,并使用 RedisConnectionFactory 来创建 Redis 连接。 知识点4:RedisConnectionFactory 配置 为了使用 Redis 集群,我们需要配置...

    plone性能优化和扩展.

    - **ZEO Cache**:探索使用ZEO Cache的可能性,进一步优化多服务器环境下的性能。 #### 八、结论 综上所述,Plone性能优化和扩展是一项复杂但必要的工作。通过对系统的全面评估和持续监测,结合合理的缓存策略、...

    IT软件开发常用词汇大全.docx编程资料

    在软件工程中,“动作”通常指的是程序执行过程中的一系列操作或指令序列。 **Activate 激活** 激活是指使某个组件或功能处于可用状态的操作,例如启动一个程序或激活一个服务。 **Active 活动的** 活动的是指...

    计算机和软工复试重点问题.zip

    - 存储层次结构:寄存器、高速缓存(Cache)、主存、外存 6. **软件工程**: - 软件生命周期:需求分析、设计、编码、测试、维护 - UML统一建模语言:用例图、类图、序列图、状态图 - 质量保证和质量控制:测试...

    jira-7-9-2-database-schema.pdf

    Jira是Atlassian公司开发的一款项目与事务跟踪工具,广泛应用于缺陷跟踪、问题跟踪和项目管理领域。本文档“jira-7-9-2-database-schema.pdf”所包含的是Jira 7.9.2版本的数据库模式信息,即数据库中各个表的结构、...

    计算机编程常用术语中英对照.pdf

    - Bug:错误或缺陷,程序运行时可能出现的问题。 - Binary:二进制,计算机中基于0和1的数字系统。 - Byte:字节,通常由8位组成,是计算机存储和处理数据的基本单位。 C - Compiler:编译器,将高级语言转化为机器...

    Apache HBase技术参考手册

    HBase弥补了这一缺陷,允许在Hadoop环境中进行高效的数据检索和实时分析。HBase利用Hadoop的分布式存储能力,但提供了一种更结构化的存储模式,适合处理大规模的、稀疏的多维数据。 **Hadoop随机存取数据库** HBase...

    程序员编程常用词汇.docx

    Algorithm 是一个非常重要的编程概念,指的是一个详细的、明确的、有限的、确定性的步骤序列,可以解决一个特定的问题或任务。Algorithm 是编程的核心,良好的算法可以提高程序的效率、可靠性和可维护性。 Alias ...

    华中科技大学834计算机考研真题(2017-2021)

    3. 存储系统:RAM、ROM、Cache的工作原理,主存与CPU的交互。 4. 指令执行过程:取指、译码、执行、写回等步骤。 5. 输入/输出系统:中断、DMA、程序控制方式。 五、数据库系统 1. 数据库设计:ER模型、关系模型、...

    编程英语单词

    - 算法是一系列定义明确、有限步骤的操作序列,用于解决特定问题或执行特定任务。在计算机科学中,算法的设计与分析是非常重要的。 3. **Alias (别名):** - 在编程中,别名通常指的是同一个数据对象的不同名称。...

    C#微软培训资料

    4.1 值 类 型 .28 4.2 引 用 类 型 .33 4.3 装箱和拆箱 .39 4.4 小 结 .42 第五章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 6.1 隐式类型转换 .48 6.2...

    计算机英语专业词组.doc

    13. **单片高速缓存(On-chip Cache)**:集成在处理器芯片上的高速缓存,用于快速访问常用数据。 14. **硅片(Silicon Die)**:集成电路制造中的基本单元,通常包含一个完整的处理器或其它复杂电路。 15. **磁盘...

Global site tag (gtag.js) - Google Analytics