Oracle Sequence
Table of Contents
1 序列迁移
select 'drop sequence '||sequence_owner||'.'||sequence_name||';'||CHR(10)|| 'create sequence '||sequence_owner||'.'||sequence_name || ' start with '||to_char(last_number+1) || ' increment by '||increment_by || ' minvalue '||min_value || ' MAXVALUE '|| MAX_VALUE || ' cache '||decode(cache_size,0,20,cache_size) || decode(cycle_flag,'N',' NOCYCLE',' CYCLE') || decode(order_flag,'N',' NOORDER',' ORDER') || ';' from dba_sequences where sequence_owner not in ('SYS','SYSTEM','OUTLN','TSMSYS','ORACLE_OCM','DBSNMP', 'SYSMAN','XDB','OLAPSYS','APEX_030200','MDSYS','ORDDATA','CTXSYS', 'WMSYS','DBMON','EXFSYS','HR','SCOTT','IX');
2 RAC中序列的注意事项
在创建序列的语句中有两个参数需要关注,[no]cache 和[no]order.
- cache 的作用是在内存中缓存 N个序列值,供程序调用,而不必每次都去更新基表。
- order 的作用是保证两个节点按顺序取值。
- noorder 的作用是保证每个节点按照自己节点内的顺序取值。这样的话,有可能两个节点取值的顺序是混乱的。 此参数是默认值。
下面是测试结果:
2.1 cache + noorder
节点1, # 号后面的内存是我后面添加的注释。
# 创建序列,采用noorder . SQL> create sequence sq1 start with 1 increment by 1 cache 2000 noorder; Sequence created. # 取出本节点的第一个序列值。 SQL> select sq1.nextval from dual; NEXTVAL ---------- 1 # 查看实例编号,然后去节点2查看序列的下一个值 SQL> select instance_number from v$instance; INSTANCE_NUMBER --------------- 1
节点2:
# 查看序列的下一个值。 SQL> select sq1.nextval from dual; NEXTVAL ---------- 2001
- 结论
- RAC 环境中,每个节点会保存cache(比如示例中cache值是2000)个序列到本实例。每次取值都会从 本实例已cache的序列中取值。也就是说,每个实例都会维护自己的cache值。
2.2 cache + order
节点1示例如下:
# 删除之前创建的序列 SQL> drop sequence sq1; Sequence dropped. # 创建序列,cache 设置为2000,与上一次测试一致。不同的是 noorder 改为 order. SQL> create sequence sq1 start with 1 increment by 1 cache 2000 order; Sequence created. # 取当前实例的序列值,然后去节点2执行相同的语句 SQL> select sq1.nextval from dual; NEXTVAL ---------- 1 # 查看实例编号 SQL> select instance_number from v$instance; INSTANCE_NUMBER --------------- 1 # 去节点2查看序列的下一个值,修改时间显示格式, SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; Session altered. # 由于只查询序列值,无法判断两次查询的先后,所以加了查询时的时间 SQL> select sq1.nextval,sysdate from dual; NEXTVAL SYSDATE ---------- ------------------- 3 2019-12-15 21:48:16
节点2查询:
# 查看实例编号 SQL> select instance_number from v$instance; INSTANCE_NUMBER --------------- 2 # 查看序列的下一个值,此操作在节点1的第一次查询后执行。 SQL> select sq1.nextval from dual; NEXTVAL ---------- 2 # 查看序列的下一个值。由于此语句执行加上了时间,可以判断是在序列值为3后操作的。 SQL> select sq1.nextval,sysdate from dual; NEXTVAL SYSDATE ---------- ------------------- 4 2019-12-15 21:48:23
- 结论
- order 参数可以保证RAC两个节点取序列值,是按顺序取值的,两个实例共同维护同一个cache .
Created: 2019-12-15 Sun 22:50