最近,我们通过发出以下命令对我们的生产数据库进行了实时/在线备份:
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。
谢谢, 道穆埃尔。
答案 0 :(得分:5)
我相信你的假设是正确的,因为环境是有效的并且有开放的联系。 在过去的几年里,我一直在使用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”中的每个值。
我总是觉得很奇怪甲骨文没有办法纠正这个问题,也没有找到网上任何人的“简单”解决方案。这将是一些脚本查询每个max(id)并将其与当前序列值进行比较,并将其增加差异。
我还听说过使用某种“状态”变量运行expdp(export datapump)的方法,这会导致它在整个导出过程中保持状态。如果我找到任何内容,我会更新帖子。 祝你好运!
编辑:添加到expdp以维护导出数据的参数是“consistent = y” 显然,它只是分别维护每个表的数据,所以我不确定序列值是否一致。
答案 1 :(得分:0)
解决此问题的最佳方法是将flashback参数添加到导出中。从您开始导出的那一刻起,这将使您的所有数据保持一致。
FLASHBACK_TIME=SYSTIMESTAMP
答案 2 :(得分:0)
您还可以简单地删除级联具有序列的模式。
我这样做并设置FLASHBACK_TIME
或FLASHBACK_SCN
注意:consistent = y
用于exp
而不是expdp
还请注意:如果您使用的是12.1,则为完全导出设置“ FLASHBACK_x”参数时,可能会遇到与此相关的错误 --as sysdba可以解决bug 19238926 Doc ID 1676411.1
grant flashback any table to exp_full_database;
grant flashback on SYS.KU$_USER_MAPPING_VIEW to exp_full_database;
grant flashback on SYS.FGA_LOG$FOR_EXPORT to exp_full_database;
grant flashback on SYS.AUDTAB$TBS$FOR_EXPORT to exp_full_database;
grant flashback on SYS.DBA_SENSITIVE_DATA to exp_full_database;
grant flashback on SYS.DBA_TSDP_POLICY_PROTECTION to exp_full_database;
grant flashback on SYS.NACL$_ACE_EXP to exp_full_database;
grant flashback on SYS.NACL$_HOST_EXP to exp_full_database;
grant flashback on SYS.NACL$_WALLET_EXP to exp_full_database;