我们正在尝试将部分数据从一个Oracle数据库复制到另一个数据库。一段时间后,我们可能需要做几次相同的工作(取决于复制数据的使用速度)。 我们需要查看4个表,并根据状态转移数据以及这些表之间的关系(例如,在启动客户状态的情况下获取所有客户及其订单)。
这些是要求:
我们应该使用哪种技术和批次类型?感谢各种建议。
答案 0 :(得分:1)
oracle有其自己的Job / Task Scheduler。您可以创建Job并将其存储过程附加到该Job。
任务还可以在完成后以电子邮件状态向您发送电子邮件。
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
导出导入。但是决定实际上取决于您的数据大小,容错能力,数据复杂性以及源表和目标表结构之间的差异等等。
如果您打算实时输入目标表,并且不想在任何技术上进行投资。我建议您将目标数据库与Database Link
连接,并在源表上创建触发器,以便每当发生INSERT / UPDATE / DELETE时,都可以通过DB Link插入目标表。
答案 1 :(得分:1)
这是一个非常开放的问题,答案实际上取决于您要移动的数据类型,计划移动的数据量,移动数据的任何技术/业务/法律要求(例如,如果敏感/机密数据,您不希望创建用于移动数据的纯文本.csv文件,)是否需要将导出的数据存储一段时间,等等。
如果要将数据从一个Oracle数据库移动到另一个数据库,则可能要先查看Data Pump。 Data Pump是一种实用程序,用于“将数据和元数据从一个数据库高速移动到另一个数据库”。使用Data Pump,您可以轻松地使用cron和一些简单的脚本来安排相关表数据的自动导出和导入。由于您提到数据应基于Status
进行传输,因此可以在Data Pump命令中使用查询来仅导出满足条件的行,如下所示:
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之类的东西将相关数据复制到您选择的另一个数据库中,但这可能对您在此处要完成的工作有些过分。