oracle导出序列的几种办法
注:本文来源于《oracle导出序列的几种办法》
方法一:
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 dba_sequences where sequence_owner= 'JXDB' ;-- JXDB貌似要大写才行
执行此操作后会生成创建序列的语句
方法二:
select dbms_metadata.get_ddl('SEQUENCE',u.object_name) from user_objects u where object_type='SEQUENCE'
方法三:
用plsql,直接用鼠标操作,右边对象窗口,找到Sequences,在要导出的序列名称上右键--查看,然后点击右下角的查看sql,即可查看该序列的创建sql,然后复制即可
实验:Oracle数据泵导出导入之序列问题
注:本文来源于《实验:Oracle数据泵导出导入之序列问题》
使用数据泵expdp导出1个schema,有个表主键是触发器自增的id,导入测试库测试时,发现表里的数据比自增序列的值要大。导致插入数据报错。
最终结论是:
由于数据库先进行序列导出,然后再进行表数据导出。然后在导出的过程中,该表一直有插入操作,最终导致了这种差异。
解决方法:
重建触发器中的序列,让序列的开始值为表主键最大值+1。
下面我构造实验完整演示下这种场景。
- 1.准备测试环境
- 2.开始模拟该表不断插入
- 3.进行数据泵导出操作
- 4.进行数据泵导入操作
- 5.问题现象重现并解决
1.准备测试环境
需要建立测试表,序列,触发器和模拟业务插入数据的存储过程。
以下是实际的创建语句:
2.开始模拟该表不断插入
由于我这里实际使用的是死循环,所以只要开始执行存储过程,每秒都会向测试表插入1条测试数据,直到手工停止。
3.进行数据泵导出操作
确认导出目录,编写expdp导出语句,最终将jingyu这个schema导出。实际命令如下:
实际执行导出的输出如下:
4.进行数据泵导入操作
将上一步的导出文件,导入到另一个新建的测试用户jingyu2下。实际命令如下:
实际执行导入的输出如下:
导入完成,但存在一些警告,与本实验有关的只有"JINGYU2"."PROC_INSERT_BOOK2" 编辑警告需要处理,在下面的步骤中详细说明。
5.问题现象重现并解决
问题现象重现:
查询到表最大的BOOKID大于序列的当前值,具体情况如下:
导入的存储过程存在编译警告的问题,排查原因是权限问题,需要先处理下:
编译存储过程成功后,执行它模拟插入数据,意料之中的会报错:
重新创建序列,序列开始值设置为MAX(BOOKID)+1,再次执行就可以正常插入了。
重新创建序列的语句如下:
至此,整个实验完成。