1,在目标机上建立Oracle DB Link:--在本地(目标机器)如下文件加入代码,连接到目标数据库上面1.1,在network/admin/tnsname.ora文件中加入源库的连接信息,如:AAA_10.5.1.3=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.5.1.3)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = AAA)))说明: 10.5.1.3:源库ipAAA_10.5.1.3:创建的实例名(服务名)1,2,在目标机器上用sqlplus user/pwd 登录:目标机器(本地)的用户名和密码,不是源库机器的用户名和密码。
1.3,在本地机器(目标库)上用如下命令建立DB Link:create public database link AAA_LINK connect to user identified by pwd using 'AA A_10.5.1.3';命令说明:AAA_LINK:dblink的名称user:源库的用户名pwd :源库的密码AAA_10.5.1.3:配置的实例名(服务名)说明:CREATE PUBLIC DATABASE LINK 数据库链接名 CONNECT TO 用户名 IDENTIFIED BY 密码USING ‘本地配置的数据的实例名’;如果建立成功,会提示:Database link created.1.4--测试使用链接的数据库(表名@dblink名称)select * from FA_CARD@ AAA_LINK;1.5创建一个测试表:在目标机器和原机器上都创建createtable dblink_test (user_id NUMBER,user_name VARCHAR2(100));--在其中增加一条记录:insertinto dblink_test (user_id, user_name)values (1, '钟德荣');2,使用如下脚本,即可同步数据表:2.1 将源库的数据插入到目标库方法一、truncatetable dblink_test;--删除目标库的相应表数据--插入目标机器数据,来源于源库的数据insertinto dblink_testselect * from cztbd.dblink_test@KNG_LINK; --#这里是指向要同步的来源表,表名必须是<表所有者(源库的用户)>.<表名(源库的表)>@<dblink name>commit;方法二、mergeinto dblink_test b using dblink_test@KNG_LINK c on(ER_ID=ER_ID)--如果pk(主键)值是相同则将目标库c将对应表的数据更新到源库b的对应表中whenmatchedthenupdateset ER_NAME=ER_NAME--如果pk(主键)值不一至,则将目标表中的数据整条插入到源表中whennotmatchedtheninsertvalues (ER_ID,ER_NAME);--记得merge后必须commit,否则更改未能提交commit;可以将以上语句作为sql脚本,然后写一个类似2.2的bat命令来作为任务执行2.2 将目标库的数据插入或者更新到源库--从目标库c将对应表的数据插入到源库b的对应表中方法一insertinto cztbd.dblink_test@KNG_LINKselect * from dblink_test;方法二mergeinto dblink_test@KNG_LINK b using dblink_test c on(ER_ID=ER_ID)--如果pk(主键)值是相同则将目标库c将对应表的数据更新到源库b的对应表中whenmatchedthenupdateset ER_NAME=ER_NAME--如果pk(主键)值不一至,则将目标表中的数据整条插入到源表中whennotmatchedtheninsertvalues (ER_ID,ER_NAME);--记得merge后必须commit,否则更改未能提交commit;将以上脚本写入merge.sql中,然后建立merge.bat文件,双击运行merge.bat文件,那么系统会自动将目标库c将对应表的数据插入到源库b的对应表中,可以将merge.bat作为任务定期执行(也可以按照3创建存储过程和任务来做)merge.bat如下图所示merge.sql如下图所示3,实现数据同步方式一、通过2所描述的方式实现数据库数据同步(已测试)方法二、创建存储过程和任务(待测试)--创建一个存储过程create procedure proc_sjtbasbegindelete from swdx_gzryxx where is_tb='1';insert into swdx_gzryxx(gzrybh,mc,jgdm,phone,is_tb)selectdistinct(t.zgswry_dm),t.zgswry_mc,t.nsr_swjg_dm,t.tel_zgy,'1' from dxpt_sjtb@mydblink t;delete from gdzc_jg where is_tb='1';insert into gdzc_jg(jg_dm,jg_mc,is_tb)selectdistinct(t.nsr_swjg_dm),t.nsr_swjg_mc,'1' from dxpt_sjtb@mydblink t; delete from swdx_nsrxx where is_tb='1';insert into swdx_nsrxx(nsrsbh,nsrmc,jgdm,zgydm,is_tb)selectt.nsrsbh,t.nsrmc,t.nsr_swjg_dm,t.zgswry_dm,'1' from dxpt_sjtb@mydblink t;insert into swdx_nsrphone(nsrsbh,lbbh,tel) selectt.nsrsbh,'001',t.TEL_NSR_CW from dxpt_sjtb@mydblink t;insert into swdx_nsrphone(nsrsbh,lbbh,tel) selectt.nsrsbh,'002',t.TEL_NSR_FR from dxpt_sjtb@mydblink t;insert into swdx_nsrphone(nsrsbh,lbbh,tel) selectt.nsrsbh,'003',t.TEL_NSR_QT from dxpt_sjtb@mydblink t;delete from xt_czy where is_tb='1';insert into xt_czy(czy_id, czy_mc, jg_code, czy_lxdh,is_zgy,is_tb,is_jgczy,CZY_YXBZ) select distinct (t.zgswry_dm),t.zgswry_mc, t.nsr_swjg_dm, t.tel_zgy,'1','1','0','Y' fromdxpt_sjtb@mydblink t;insert into xt_czy(czy_id, czy_mc, jg_code,is_zgy,is_tb,is_jgczy,CZY_YXBZ) selectdistinct(t.nsr_swjg_dm),t.nsr_swjg_mc,t.nsr_swjg_dm,'0','1','1','Y' from dxpt_sjtb@mydblink t;end;--创建任务(每分钟执行一次)DECLARE X NUMBER;BEGINSYS.DBMS_JOB.SUBMIT(job => X,what => 'proc_sjtb;',next_date => to_date('09-12-2008 00:00:00','dd/mm/yyyyhh24:mi:ss'),interval => 'TRUNC(sysdate) + 1 +2 / (24)');END;--执行任务--RUN(参数)是我们建立任务的时候自动生成的,指定任务号方可启动任务和删除任务beginSYS.DBMS_JOB.RUN(25);end;--删除任务beginsys.DBMS_JOB.REMOVE(23);end;方法三、创建触发器实现实时同步(测试通过)--KNG_LINK 数据链名称--cztbd 源数据库的用户名--cztbd 源数据库的密码--KNG ORACLE SID实例名(源库)--1、在源数据库上,创建要同步表的快照日志(不是很确定是否是在源库建立这个快照日志)--DBLINK_TEST:源库表,LOG:快照名称,不虚伪log不能修改,否则不能创建成功CreatesnapshotLOGon DBLINK_TEST;--2、在目标数据库上创建快照(被同步(源)数据库服务必须启动)DB_LINK_KZ:快照名称Createsnapshot DB_LINK_KZ asselect * from DBLINK_TEST@KNG_LINK;--3、设置刷新快照时间:如下写法为每隔一分钟刷新一次Altersnapshot DB_LINK_KZrefreshfastStartwithsysdatenextsysdate+1/1440;---删除快照的方法dropsnapshot DB_LINK_KZ;DROPMATERIALIZEDVIEW DB_LINK_KZ;---手动刷新快照begindbms_refresh.refresh('DB_LINK_KZ');end;---查看快照最后一次刷新时间SELECT NAME,LAST_REFRESH FROM ALL_SNAPSHOT_REFRESH_TIMES;---查看快照下次执行时间select last_date,next_date,what from user_jobs order by next_date; --4、创建触发器:在目标库创建未通过,创建用于同步本地表与远程表(源数据库)数据的触发器由于创建快照后,快照在目标数据库表现为会创建一个数据表DB_LINK_KZ,此表根据上一步骤设置的快照刷新时间自动与源数据库的表user同步,要想实现两个数据库的真正同步,只需针对DB_LINK_KZ表创建一个触发器即可解决,即通过触发器实现往目的数据库的指定数据表中插入数据,实现本地数据与目的数据库表的数据同步。