关于导入导出sequence(r4笔记第11天)
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;
总之办法总比困难多,还是有很多的途径来实现一些没有的功能。
- Chrome 自动化交互利器:用 tampermonkey 向页面注入自定义 Javascript
- 一次小折腾:PyCharm 调用 Cygwin Python 找不到 time、sys 等内置模块
- 网站数据统计分析之二:前端日志采集是与非
- Linux Shell 从入门到删除根目录跑路指南
- SSD Win8 系统盘 4K 无损对齐历险记
- 详解 MySQL 5.7 新的权限与安全问题
- Hive Lock 那些事儿
- Shell 黑科技之匿名函数实现任务并行化
- 文本编辑利器Notepad++ 10个强大而又鲜为人知的特性
- 记一次诡异的 ssh 互信免密码登录失败
- Linux下恶意文件大规模共性分析探讨
- 虚拟时钟
- 线上服务 CPU 100%?一键定位 so easy!
- 设置输出延迟
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SQL工具集-查询会话等待
- 哈工大李志军操作系统实验1
- 有赞推荐系统关键技术
- 8086汇编格式
- React 中 getDerivedStateFromProps 的三个场景
- Java7的try-with-resources声明(转)
- 聊聊java中的哪些Map:(三)HashMap中的Iterator和Spliterator
- 聊聊java中的哪些Map:(四)LinkedHashMap源码分析
- CGroup 介绍
- 有赞持续集成容器化实践
- 怎么创建一个良好的Git提交信息
- Epoll 如何工作的?
- 用函数式的方式思考——递归
- Linux等待队列原理与实现
- 微信小程序switchTab带参解决方法