oracle 导出导入序列器,Oracle数据泵导出导入之序列问题实验

原标题:Oracle数据泵导出导入之序列问题实验

|转载自:博客园

|原文链接:http://www.cnblogs.com/jyzhao/p/6964924.html

今天同事提出了一个问题:

使用数据泵expdp导出1个schema,有个表主键是触发器自增的id,导入测试库测试时,发现表里的数据比自增序列的值要大。导致插入数据报错。

最终结论是:

由于数据库先进行序列导出,然后再进行表数据导出。然后在导出的过程中,该表一直有插入操作,最终导致了这种差异。

解决方法:

重建触发器中的序列,让序列的开始值为表主键最大值+1。

下面我构造实验完整演示下这种场景。

1.准备测试环境

需要建立测试表,序列,触发器和模拟业务插入数据的存储过程。

以下是实际的创建语句:

5b5ac1b44b0a3ed976a4799409280643.png

6deae2d080cf375e094f717a293d7024.png

2.开始模拟该表不断插入

由于我这里实际使用的是死循环,所以只要开始执行存储过程,每秒都会向测试表插入1条测试数据,直到手工停止。

3e94bd38c7824bc4b2b43737d6ce7aba.png

3.进行数据泵导出操作

确认导出目录,编写expdp导出语句,最终将jingyu这个schema导出。实际命令如下:

d7a0936ea777eb5a85d25f1439bdd8f6.png

实际执行导出的输出如下:

50b14f9369330bc5980ab143b0058e43.png

fea5aaa6e98425e958f0539dde300c75.png

4.进行数据泵导入操作

将上一步的导出文件,导入到另一个新建的测试用户jingyu2下。实际命令如下:

a52cc87a3313743bbfd03fb28a7238d8.png

实际执行导入的输出如下:

56b868965f4030fb82bb806c2f2322af.png

8cf21ea41fb8a560eccec73c739a4a28.png

导入完成,但存在一些警告,与本实验有关的只有"JINGYU2"."PROC_INSERT_BOOK2" 编辑警告需要处理,在下面的步骤中详细说明。

5.问题现象重现并解决

问题现象重现:

查询到表最大的BOOKID大于序列的当前值,具体情况如下:

4182e07c7361a1cd31e4efba87a447b2.png

导入的存储过程存在编译警告的问题,排查原因是权限问题,需要先处理下:

7a42940b3b314fb777fadc1c0eae5ce7.png

dfd9d0c6990f23dd21793ef3c2ce8bbb.png

编译存储过程成功后,执行它模拟插入数据,意料之中的会报错:

6cd53456aa11cefb4f985ee06c01b771.png

重新创建序列,序列开始值设置为MAX(BOOKID)+1,再次执行就可以正常插入了。

重新创建序列的语句如下:

9f00508b48a0a8eeaa1b081b269bce48.png

至此,整个实验完成。返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值