最近,我们通过发出以下命令对生产数据库进行了实时/在线备份:
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;
甲骨文返回213042
。很明显这个值比序列高1。
所以....我的问题是,我们之所以得到这个结果,是因为我们在生产期间进行了数据导出 - 即存在与数据库的开放和活动连接?或者数据泵是否对缓存的序列有问题?我们使用的是 Oracle 10.2.0.4。
谢谢,穆尔。