关于导入导出sequence

简介: sequence在平时的工作中是一个默默无闻的角色。可能创建好之后很少会去修改它,它就在默默地自增长。直到一些特殊的原因导致sequence出现问题,比如提供了一个脚本,需要使用insert语句修复一些问题, 修复的语句类似insert into test values(100,xxxxxx,xxxx); 正确的写法应该是insert into test values(test_seq.nextval,xxxxxx,xxxx); 但是测试的时候也没有发现问题,就这样部署到生产中就出现问题了。
sequence在平时的工作中是一个默默无闻的角色。可能创建好之后很少会去修改它,它就在默默地自增长。直到一些特殊的原因导致sequence出现问题,比如提供了一个脚本,需要使用insert语句修复一些问题,
修复的语句类似insert into test values(100,xxxxxx,xxxx);
正确的写法应该是 insert into test values(test_seq.nextval,xxxxxx,xxxx);
但是测试的时候也没有发现问题,就这样部署到生产中就出现问题了。这个时候就是比较典型的sequence不一致问题,可能sequence的nextval是100,但是已经手工插入了一些100,101的数据,这样sequence递增的时候就会出现问题。
所以说sequence的问题发生时,情况还是比较严重的。
在各个环境之间导入导出数据的时候,sequence也是一个不可忽视的环节。数据的导入导出不会默认调用sequence,所以如果不能合理的处理sequence问题,就很可能影响到imp/impdp的进度,甚至导致很多数据问题。
但是在oracle中关于sequence的处理还是一个比较纠结的部分。
oracle没有显示提供工具来做sequence的导入导出,但是工具是死的,人是活的还是有一些途径来完成sequence的导入导出。
有两种主流的处理方法,一种是使用dbms_metadata来导出创建语句,另外一种是直接访问数据字典表,直接生成创建语句。
还有一种方法可以弥补以上两种方法的不足。我都一一做解释。
使用dbms_metadata导出sequence
这种方法也是比较正统的方法。在数据导出的时候可以同时导出一份sequence的脚本。
可以采用如下的脚本来实现。
set linesize 200
col create_ddl format a200
set long 9999
set pages 0
select dbms_metadata.get_ddl('SEQUENCE',u.object_name)||';' create_ddl from user_objects u where object_type='SEQUENCE'

脚本运行情况如下:
SQL> select dbms_metadata.get_ddl('SEQUENCE',u.object_name)||';' create_ddl from user_objects u where object_type='SEQUENCE';

   CREATE SEQUENCE  "N1"."TEST_SEQ2"  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE  ORDER  CYCLE ;

   CREATE SEQUENCE  "N1"."TEST_SEQ"  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE  ORDER  NOCYCLE ;
   
使用数据字典生成动态创建语句
可以使用user_sequences来构建动态的创建语句。
可以使用如下的脚本来实现。
set pages 0
set linesize 200
select 'create sequence '||sequence_name||   
       ' minvalue '||min_value||   
       ' maxvalue '||max_value||   
       ' start with '||last_number||   
       ' increment by '||increment_by||   
        (case when cache_size=0 then ' nocache' else ' cache '||cache_size end) ||';'  
from user_sequences ; 

脚本运行情况如下:
create sequence TEST_SEQ minvalue 1 maxvalue 9999999999999999999999999999 start with 1 increment by 1 nocache;
create sequence TEST_SEQ2 minvalue 1 maxvalue 9999999999999999999999999999 start with 1 increment by 1 nocache;
以上两种方法如果可以访问远环境的情况下是不错的选择。
如果当我们拿到一个dump的时候,没有权限访问源环境的时候,也是可以做点工作得到sequence的语句的。这是第三种方法。
可以使用strings来解析dump文件,然后简单的过滤就能生成sequence的语句。
一般来说我们使用exp做schema级别的数据导出的时候可以看到下面的日志。默认是会导出sequence的值的。
About to export specified users ...
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user N1 
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user N1 
About to export N1's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export N1's tables via Conventional Path ...

我们可以尝试解析dump文件,使用如下的方式,假设dump文件为a.dmp,就能够很轻松的得到sequence的值。
[ora11g@rac1 ~]$ strings a.dmp|grep "CREATE SEQUENCE"|awk '{print $0";"}'
CREATE SEQUENCE "TEST_SEQ2" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER CYCLE;
CREATE SEQUENCE "TEST_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE NOORDER NOCYCLE;

总之办法总比困难多,还是有很多的途径来实现一些没有的功能。


目录
相关文章
|
2月前
|
SQL 人工智能 数据库
数据泵导出导入(映射表空间、Schema)
数据泵导出导入(映射表空间、Schema)
RMAN备份及恢复归档日志的语法
RMAN备份及恢复归档日志的语法
894 0
开发指南—Sequence—显示用法—查询与获取Sequence
本文主要介绍如何查询Sequence类型以及获取Sequence值。
166 0
开发指南—Sequence—显示用法—修改Sequence
本文主要介绍如何对Sequence的各种类型进行修改。
|
消息中间件 存储 监控
【实测】django的超轻量级消息队列:django-task-mq 使用教程
【实测】django的超轻量级消息队列:django-task-mq 使用教程
|
XML 存储 JSON
什么是结构化数据、半结构化数据、非结构化数据
什么是结构化数据、半结构化数据、非结构化数据
483 0
什么是结构化数据、半结构化数据、非结构化数据
|
SQL 关系型数据库 MySQL
PolarDB-X 1.0-SQL 手册-Sequence--Sequence 介绍
DRDS 全局唯一数字序列(64 位数字,对应 MySQL 中 Signed BIGINT 类型,以下简称为 Sequence)的主要目标是为了生成全局唯一和有序递增的数字序列,常用于主键列、唯一索引列等值的生成。 DRDS 中的 Sequence 主要有两类用法: 显式 Sequence,通过 Sequence DDL 语法创建和维护,可以独立使用;通过select seq.nextval获取序列值,seq 是具体 Sequence 的名字; 隐式 Sequence,在为主键定义 AUTO_INCREMENT 后,用于自动填充主键,由 DRDS 自动维护。
281 0
|
关系型数据库 MySQL 数据库
PolarDB-X 1.0-SQL 手册-Sequence-Sequence限制及注意事项
限制与注意事项 转换 Sequence 类型时,必须指定 START WITH 起始值; 单元化 Group Sequence 不支持作为源或目标的类型转换,也不支持起始值以外的参数修改; 属于同一个全局唯一数字序列分配空间的每个单元化 Group Sequence,必须指定相同的单元数量和不同的单元索引; 在 PolarDB-X 非拆分模式库(即后端仅关联一个已有的 RDS 物理库)、或拆分模式库中仅有单表(即所有表都是单库单表,且无广播表)的场景下执行 INSERT 时, PolarDB-X 会自动优化并直接下推语句,绕过优化器中分配 Sequence 值的部分。此时 INSERT INT
273 0
|
弹性计算 监控 数据挖掘
阿里云2核和4核服务器性能差别大吗?如何选择
阿里云服务器2核和4核区别如何选择?云服务器的vCPU核心数主要影响多线程和多进程任务的执行效率,CPU型号、内存及磁盘等硬件相同的情况下,CPU核数越高计算性能越好
821 0
阿里云2核和4核服务器性能差别大吗?如何选择
|
机器学习/深度学习 人工智能 搜索推荐
迁移学习综述与未来展望
迁移学习综述与未来展望
1218 0
迁移学习综述与未来展望