gpt4 book ai didi

Oracle 数据泵导出包含不正确的序列

转载 作者:行者123 更新时间:2023-12-05 01:18:09 25 4
gpt4 key购买 nike

最近,我们通过发出以下命令对我们的生产数据库进行了实时/在线备份:

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(导出数据泵)的方法,这会导致它在整个导出过程中保持事物的状态。如果我发现任何东西,我会更新帖子。
同时,祝你好运!

编辑:添加到 expdp 以维护整个导出数据的参数是“consistent = y”
显然,它只分别维护每个表的数据,所以我不确定序列值是否一致。

Oracle datapump details

关于Oracle 数据泵导出包含不正确的序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13169375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com