Oracle 选择正确的批处理作业类型

Oracle 选择正确的批处理作业类型,oracle,jobs,job-scheduling,Oracle,Jobs,Job Scheduling,我们正在尝试将部分数据从一个Oracle数据库复制到另一个数据库。我们可能需要在一段时间后做几次相同的工作(取决于复制数据的使用速度)。 我们需要查看4个表,并根据状态传输数据和这些表之间的关系(例如,在客户状态启动时获取所有客户及其订单) 这些是要求: 携带1000行数据(基于状态) 目标数据库中的数据结构与原始数据库不同 复制到目标选项卡的数据状态将更改。当只剩下50行且其状态未更改时,批处理作业必须再次运行并再带1000行 我们应该使用什么样的工艺和批次类型?感谢所有的建议 oracle有

我们正在尝试将部分数据从一个Oracle数据库复制到另一个数据库。我们可能需要在一段时间后做几次相同的工作(取决于复制数据的使用速度)。 我们需要查看4个表,并根据状态传输数据和这些表之间的关系(例如,在客户状态启动时获取所有客户及其订单)

这些是要求:

  • 携带1000行数据(基于状态)
  • 目标数据库中的数据结构与原始数据库不同
  • 复制到目标选项卡的数据状态将更改。当只剩下50行且其状态未更改时,批处理作业必须再次运行并再带1000行

  • 我们应该使用什么样的工艺和批次类型?感谢所有的建议

    oracle有自己的作业/任务计划程序。您可以创建作业并将存储过程附加到它

    该任务还可以在完成后向您发送带有cempletion状态的电子邮件

    BEGIN
      DBMS_SCHEDULER.CREATE_JOB (
       job_name           =>  'update_sales',
       job_type           =>  'STORED_PROCEDURE',
       job_action         =>  'OPS.SALES_PKG.UPDATE_SALES_SUMMARY',
       start_date         =>  '28-APR-08 07.00.00 PM Australia/Sydney',
       repeat_interval    =>  'FREQ=DAILY;INTERVAL=2', /* every other day */
       end_date           =>  '20-NOV-08 07.00.00 PM Australia/Sydney',
       auto_drop          =>   FALSE,
       job_class          =>  'batch_update_jobs',
       comments           =>  'My new job');
    END;
    /
    
    用于电子邮件通知

    BEGIN
     DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION (
      job_name   =>  'EOD_JOB',
      recipients =>  'jsmith@example.com, rjones@example.com',
      sender     =>  'do_not_reply@example.com',
      subject    =>  'Scheduler Job Notification-%job_owner%.%job_name%-%event_type%',
      body       =>   '%event_type% occurred at %event_timestamp%. %error_message%',
      events     =>  'JOB_FAILED, JOB_BROKEN, JOB_DISABLED, JOB_SCH_LIM_REACHED');
    END;
    /
    

    如果表很大,可以考虑通过代码> ExpDP/IMPDP < /代码>导出导出。但决策实际上取决于您的数据大小、容错能力、数据的复杂性、源表和目标表结构之间的差异等等


    如果您的目的是实时提供目标表,并且您不想在任何技术上进行投资。我可以建议您将目标db与数据库链接连接起来,并在源表上创建触发器,以便无论何时插入/更新/删除,您都可以通过db链接插入目标表。

    这是一个非常开放的问题,答案实际上取决于您移动的数据类型、计划移动的数据量,移动数据的任何技术/业务/法律要求(例如,如果存在敏感/机密数据,您不希望创建用于移动数据的明文.csv文件),无论您是否需要将导出的数据存储任意时间长度等

    如果要将数据从一个Oracle数据库移动到另一个Oracle数据库,您可能需要首先查看。Data Pump是一个用于“数据和元数据从一个数据库高速移动到另一个数据库”的实用程序。使用Data Pump,您可以轻松地使用cron和一些简单的脚本来安排相关表数据的自动导出和导入。由于您提到应根据
    状态传输数据
    ,因此可以在数据泵命令中使用查询,仅导出符合条件的行,如下所示:

    expdp system/password@db10g full=Y directory=TEST_DIR dumpfile=full.dmp logfile=expdp_full.log query='[YOURSCHEMA].[YOURTABLE1]:"WHERE Status=X",[YOURSCHEMA].[YOURTABLE2]:"WHERE status=X"'
    
    数据泵还可用于在导出/导入数据时转换数据,例如通过重新映射模式/表空间和对满足特定条件的行执行SQL。Data Pump是一个功能强大的实用程序,有很多选项,因此请务必研究该实用程序可以做什么,因为它可能会派上用场,即使您没有为此特定活动决定使用Data Pump


    根据您的许可情况,您也可以使用类似的方法将相关数据复制到您选择的另一个数据库中,但这对于您在这里试图完成的任务来说可能是过火了

    正如我所写的,当复制的数据被消耗时,我们需要运行作业。因此,我们不知道何时执行第二次(或其他)作业?谢谢,该作业并不完全是计划作业,它将根据目标数据库中消耗的数据行数重新执行。请使用我的更新没有问题。我不确定我是否理解第三个要求——“复制的数据已被消耗(状态已更改)。当剩下50行数据(目标数据库中的状态未更改)时,作业必须再次执行,并多带1000行。”这是否意味着当一个表中有50行数据时,作业需要再次执行?你能更详细地解释一下这个要求吗?我不明白需求是什么,也不知道如何给出建议。例如,您首先运行作业并复制1000行,然后将它们移动到目标数据库(db2)中的两个表中。客户机正在使用这些数据,并发出更改数据状态的命令(在目标数据库中)。当只剩下50行(或少于50行)时(它们没有排序),作业必须再次运行,并从db1到db2再带1000行。因此,如果我错了,请纠正我,但听起来您希望从源数据库(db1)运行一次作业,以将数据转换并导入目标数据库(db2),是否希望根据目标数据库中特定表中的行数自动运行作业?所以,步骤1:从源运行作业(db1)步骤2。转换和导入数据,步骤3。只要目标(db2)中的行数小于50,就运行作业,对吗?您可以通过在目标表少于50行时运行触发器来实现这一点,但这并不高效。这一要求有点奇怪,而且最好按照设定的时间表执行此类操作,而不是基于特定表中任意数量的行。如果有人意外地截断了表,工作意外地被取消了呢?您的数据是否可以恢复?如果行数(50)有一个特定的目的,那么无论如何,我会重新考虑该要求,以进行进一步的澄清。为什么是50排?为什么不每晚或每周安排一次呢?