代码之家  ›  专栏  ›  技术社区  ›  user217648

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

  •  1
  • user217648  · 技术社区  · 7 年前

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

    这些是要求:

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

    我们应该使用什么样的技术和批次类型?谢谢你的建议。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Derviş Kayımbaşıoğlu    7 年前

    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;
    /
    

    Reference

    如果表是巨大的,你可以考虑通过 expdp/impdp 。但决策实际上取决于您的数据大小、容错能力、数据的复杂性、源表和目标表结构之间的差异等等

    如果您打算实时向目标表提供数据,并且不想对任何技术进行投资。我可以建议你将目标数据库连接到 Database Link 并在源表上创建触发器,以便无论何时发生INSERT/UPDATE/DELETE,都可以通过DB Link插入到目标表中。

        2
  •  1
  •   1991DBA    7 年前

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

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

    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。

    根据您的许可情况,您还可以使用 GoldenGate 将相关数据复制到您选择的另一个数据库中,但对于您在这里试图实现的目标来说,这可能是过分的。