Oracle数据库之间数据同步
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle数据库之间数据同步
项目中开发库与测试数据库分离,其中某些系统表数据与基础资料数据经常需要进行同步,为方便完成指定数据表的同步操作,可以采用dblink结合dbjob方法完成,简单方便。
操作环境:此Oracle数据库服务器ip为ip1,有dbcenter与dbbranch两个库,一般需要将dbcenter的表数据同步到dbbranch,dbcenter为源库,dbbranch为目标库,具体步骤如下:
1.在源库创建到目标库的dblink
create public database link dbcenter
connect to username identified by userpassword
using '
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ip1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
' ;
在创建dblink时,要注意,有时候可能会报用户名和密码错误,但实际上我们所输入的账户信息是正确的,此时就注意将密码的大小写按服务器上所设置的输入,并在账号密码前号加上双引号(服务器版本不同造成的)。
2.成功后验证dblink
select sysdate from dual@dbcenter;
3.建立存储过程获取数据
create or replace procedure job_sync() is
begin
Select * from test@dbcenter;
end job_sync;
4.为方便每次需要同步时自动完成同步工作,采用oraclejobs完成定时工作:
--oracle 定时器
declare
job number;
begin
dbms_job.submit(job, 'job_sync;', sysdate,'sysdate+1/(24*60)'); commit;
end;
begin
dbms_job.run(11);
commit;
end;
6.job相关参数信息
select * from user_jobs;——查看调度任务
select * from dba_jobs_running;——查看正在执行的调度任务select * from dba_jobs;——查看执行完的调度任务
定时器的参数说明:
myjob参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作;what参数是将被执行的PL/SQL代码块,这里指的是一个存储过程,注意名字后面的分号;next_date参数指识何时将运行这个工作。写Job的时候可以不指定该值;
interval参数何时这个工作将被重执行。
关于interval的设置,参考以下几个例子:
1、每分钟执行
Interval => TRUNC(sysdate,’mi’) +1 / (24*60)
2、每天定时执行
例如:每天的凌晨2点执行
Interval => TRUNC(sysdate) + 1 +2 / (24)
3、每周定时执行
例如:每周一凌晨2点执行
Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一周的第二天
4、每月定时执行
例如:每月1日凌晨2点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24
5、每季度定时执行
例如每季度的第一天凌晨2点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24 6、每半年定时执行
例如:每年7月1日和1月1日凌晨2点
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24
7、每年定时执行
例如:每年1月1日凌晨2点执行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24
例子:
--oracle 定时器
declare
job number;
begin
dbms_job.submit(job, 'job_proc;', sysdate,'sysdate+1/(24*60)');
commit;
end;
begin
dbms_job.run(11);
commit;
end;
--job_queue_processes=0不会执行,=10才会执行oracle10以后自动被设置成了0,所以需要用到下面的操作开启job功能
select * from v$parameter where name='job_queue_processes';
alter system set job_queue_processes = 10;