【问题标题】:choosing right type of batch job选择正确的批处理作业类型
【发布时间】:2019-05-26 08:55:18
【问题描述】:

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

这些是要求:

  1. 带1000行数据(根据状态)
  2. 目标数据库中的数据结构与原始数据库不同
  3. 复制数据到目标表的状态将会改变。当只剩下 50 行并且它们的状态没有改变时,批处理作业必须再次运行并带来另外 1000 行。

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

【问题讨论】:

    标签: oracle jobs job-scheduling


    【解决方案1】:

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

    任务还可以在完成后向您发送电子邮件,并显示完成状态。

    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】:

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

    如果您要将数据从一个 Oracle 数据库移动到另一个,您可能需要先查看 Data Pump。 Data Pump 是一种实用程序,用于“将数据和元数据从一个数据库高速移动到另一个数据库”。使用 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 之类的东西将相关数据复制到您选择的另一个数据库中,但这对于您在此处尝试完成的任务可能有点过头了。

    【讨论】:

    • 谢谢,该作业不完全是调度作业,它会根据消耗目标数据库中的数据行数重新执行。请查看我的更新-
    • 没问题。我不确定我是否理解第三个要求 - “复制的数据已被消耗(状态已更改)。当剩下 50 行数据时(目标数据库中的状态未更改),必须再次执行作业并带来 1000 多行。”这是否意味着当一张表有50行数据时,需要再次执行作业?您能否对该要求进行更详细的解释?我不明白要求是什么,也不知道如何提供建议。
    • 例如,您首先运行作业并复制 1000 行并将它们移动到目标数据库 (db2) 中的两个表中。客户端正在使用这些数据并发出更改数据状态的命令(在目标数据库中)。当只剩下 50 行(或少于 50 行)时(它们没有排序),必须再次运行作业并将 1000 多行从 db1 带到 db2。
    • 如果我错了请纠正我,但听起来您希望从源数据库 (db1) 运行一次作业以将数据转换并导入目标数据库 (db2.)从那时起,您希望根据目标数据库中特定表中的行数自动运行作业吗?因此,步骤 1:从源 (db1) 运行作业步骤 2. 转换和导入数据,步骤 3. 只要目标 (db2) 中的行数少于 50 时运行作业,对吗?您可以使用在 Target 表少于 50 行时运行的触发器来完成此操作,但效率不高。
    • 这个要求有点奇怪,按照设定的时间表而不是基于特定表中的任意行数可能会更好。如果有人不小心截断了表格并且工作意外地开始了怎么办?您的数据可以恢复吗?如果行数(50)有特定目的,那么无论如何,但我会重新审视该要求以进一步澄清。为什么是 50 行?为什么不按每晚或每周安排一次?
    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多