expdp system/******@SID FULL=y DIRECTORY=data_pump_dir DUMPFILE=full_prod.dmp LOGFILE=full_prod_export.log JOB_NAME=prod_backup
没有错误也没有警告.
然后,我们通过发出以下内容获取此转储并从中创建了许多开发人员数据库:
impdp system/******@SID SCHEMAS=MY_SCHEMA DIRECTORY=data_pump_dir DUMPFILE=full_prod.dmp LOGFILE=full_prod_import.log
同样,没有错误也没有警告.
一旦设置了开发人员环境,开发人员就会启动他们的应用程序并尝试插入一些测试数据.前几次尝试因主键违规而失败.经过一些挖掘,结果证明缓存的序列(NOCACHE序列很好)通常落后于一个或两个值.
一个例子是我们的联系表的序列:
CREATE SEQUENCE REQ_CONTACT_SEQ START WITH 213041 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER;
Oracle为此序列显示最后一个缓存值213041.现在,当我运行以下查询时:
SELECT MAX(id) FROM REQ_CONTACT;
Oracle返回213042.很明显,这个值比序列高1.
所以……我的问题是,我们是否只得到了这个结果,因为我们在生产过程中采用了数据导出 – 即数据库是否存在开放和活动的连接?或者数据泵是否有缓存序列的问题?我们使用的是Oracle 10.2.0.4.
谢谢,
道穆埃尔.
解决方法
在过去的几年里,我一直在使用Oracle 10.2.0.4对我们的开发机器执行相同的过程,并且必须创建一个我在生产导出导入上运行的脚本.
我基本上将每个问题序列递增100,然后将增量值设置回1.
alter sequence [sequence_name] increment by 100; select [sequence_name].nextval from dual; alter sequence [sequence_name] increment by 1; select [sequence_name].nextval from dual; commit;
在我们的例子中,我们看到主键约束错误.随着时间的推移,我已经向我的脚本添加了每个显示PK约束错误的序列.
每隔一段时间,我就会因新的PK约束错误而措手不及,并且必须调整脚本并添加新序列.
我正在考虑创建一个增加每个序列的变体,这样可以防止任何新的PK约束错误出现.
这是我的头脑,但我认为它将是某种LOOP DBMS语句循环查询“select sequence_name from user_sequences”中的每个值.
我总是觉得奇怪的是Oracle没有办法纠正这个问题,也没有找到网上任何人的“简单”解决方案.这将是一些脚本查询每个max(id)并将其与当前序列值进行比较,并将其增加差异.
我还听说过使用某种“状态”变量运行expdp(export datapump)的方法,这会导致它在整个导出过程中保持状态.如果我找到任何内容,我会更新帖子.
在此期间,祝你好运!
编辑:添加到expdp以维护导出数据的参数是“一致= y”
显然,它只是分别维护每个表的数据,所以我不确定序列值是否一致.