oracle导出序列的几种办法


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,再次执行就可以正常插入了。
重新创建序列的语句如下:

至此,整个实验完成。

你可能感兴趣的:(数据库)