4

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

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。

谢谢,穆尔。

4

3 回答 3

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 语句,它遍历查询“从 user_sequences 中选择序列名称”中的每个值。

我一直觉得奇怪的是,Oracle 没有办法纠正这个问题,我也没有从网上的任何人那里找到“简单”的解决方案。它将是一些脚本查询每个 max(id) 并将其与当前序列值进行比较,并将其增加差异。

我还听说过一种使用某种“状态”变量运行 expdp(导出数据泵)的方法,这会导致它在整个导出过程中保持状态。如果我发现任何东西,我会更新帖子。与此同时,祝你好运!

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

Oracle 数据泵详细信息

于 2013-09-29T22:01:30.120 回答
0

对此的最佳解决方案是将闪回参数添加到导出中。从您开始导出的那一刻起,这将使您的所有数据保持一致。

FLASHBACK_TIME=SYSTIMESTAMP

于 2017-05-16T02:12:01.593 回答
0

您也可以简单地级联具有序列的模式。我这样做并设置FLASHBACK_TIMEFLASHBACK_SCN

注意:consistent = yexp不是expdp

另请注意:如果您使用的是 12.1,如果您为完整导出设置“FLASHBACK_x”参数,则可能会出现与此相关的错误 --as sysdba 以解决错误 19238926 文档 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;
于 2018-12-06T20:21:36.907 回答