【问题标题】:Oracle Data Pump export includes incorrect sequencesOracle 数据泵导出包括不正确的序列
【发布时间】:2012-10-21 14:03:40
【问题描述】:

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

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 datapump


    【解决方案1】:

    我相信你的假设是正确的,因为环境是实时的并且具有开放的连接。 在过去的几年里,我一直在使用 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 datapump details

    【讨论】:

      【解决方案2】:

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

      FLASHBACK_TIME=SYSTIMESTAMP

      【讨论】:

        【解决方案3】:

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

        注意:consistent = y 用于exp 而不是expdp

        另请注意:如果您使用的是 12.1,如果您为完整导出设置了“FLASHBACK_x”参数,则可能会收到与此相关的错误 --as sysdba 解决错误 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;
        

        【讨论】:

          猜你喜欢
          • 2017-08-24
          • 2012-12-12
          • 2010-10-06
          • 2020-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-10
          • 1970-01-01
          相关资源
          最近更新 更多