ORACLE 10G用DB 您所在的位置:网站首页 oracle中的dblink能抽不同数据库的吗 ORACLE 10G用DB

ORACLE 10G用DB

2024-06-29 20:10| 来源: 网络整理| 查看: 265

0、设置tnsnames 55 =   (DESCRIPTION =     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.55)(PORT = 1521))     (CONNECT_DATA =       (SERVER = DEDICATED)       (SERVICE_NAME = zhjport)     )   )

1、在目的数据库上,创建dblink drop public database link DBLINK_ADCPHC; Create public DATABASE LINK DBLINK_ADCPHC CONNECT TO adcphccusdev IDENTIFIED BY adcphccusdev USING '55';

--DBLINK_ADCPHC 是dblink_name --adcphccusdev 是 username --adcphccusdev 是 password --'55' 是远程数据库连接串

2、在源和目的数据库上创建要同步的表(最好有主键约束,快照才可以快速刷新) create table ADCPHC_ENTRY_CONTAINER(id number(10) primary key,name varchar2(12),age number(3));

3、在目的数据库上,测试dblink select * from ADCPHC_ENTRY_CONTAINER@DBLINK_ADCPHC;    //查询的是源数据库的表

4、在源数据库上,创建要同步表的快照日志

--主键模式 create snapshot log on ADCPHC_ENTRY_CONTAINER; create materialized view log on ADCPHC_ENTRY_CONTAINER;--基于ROWID create materialized view log on ADCPHC_ENTRY_CONTAINER WITH ROWID;

5、创建快照,在目的数据库上创建快照 Create snapshot SN_ADCPHC_ENTRY_CONTAINER  refresh fast with rowid as select * from ADCPHC_ENTRY_CONTAINER@DBLINK_ADCPHC;

drop snapshot SN_ADCPHC_ENTRY_CONTAINER; Create snapshot SN_ADCPHC_ENTRY_CONTAINER as select * from ADCPHC_ENTRY_CONTAINER@DBLINK_ADCPHC;

6、设置快照刷新时间(只能选择一种刷新方式,推荐使用快速刷新,这样才可以用触发器双向同步) 快速刷新 --主键模式 Alter snapshot SN_ADCPHC_ENTRY_CONTAINER refresh fast Start with sysdate next sysdate with primary key;--ROWID模式 Alter snapshot SN_ADCPHC_ENTRY_CONTAINER refresh fast Start with sysdate next sysdate with rowid; --oracle马上自动快速刷新,以后不停的刷新,只能在测试时使用.真实项目要正确权衡刷新时间.

完全刷新 Alter snapshot SN_ADCPHC_ENTRY_CONTAINER refresh complete Start with sysdate+5/24*60*60 next sysdate+30/24*60*60; --oracle自动在30秒后进行第一次完全刷新,以后每隔30秒完全刷新一次

7、手动刷新快照,在没有自动刷新的情况下,可以手动刷新快照.手动刷新方式1 begin dbms_refresh.refresh('SN_ADCPHC_ENTRY_CONTAINER'); end;

手动刷新方式2 EXEC DBMS_SNAPSHOT.REFRESH('SN_ADCPHC_ENTRY_CONTAINER ','C');  EXEC DBMS_SNAPSHOT.REFRESH('SN_ADCPHC_ENTRY_CONTAINER'','F');  //第一个参数是快照名,第二个参数 F 是快速刷新 C 是完全刷新.

8.修改会话时间格式 ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY-MM-DD HH24:MI:SS'';

9.查看快照最后一次刷新时间 SELECT NAME,LAST_REFRESH FROM ALL_SNAPSHOT_REFRESH_TIMES;

10.查看快照下次执行时间 select last_date,next_date,what from user_jobs order by next_date;

11.打印调试信息dbms_output.put_line(''use ''||''plsql'');

12.如果你只想单向同步,那么在目的数据库创建以下触发器(当源数据库表改变时,目的数据库表跟着改变,但目的数据库表改变时,源数据库表不改变).create or replace trigger INSERT_ADCPHC_ENTRY_CONTAINER   after Insert Or Update Or delete on sn_adcphc_entry_container     for each Row   declare   -- local variables here begin   if deleting then     delete from ADCPHC_ENTRY_CONTAINER where id=:old.id;   end if;   if inserting then       insert into ADCPHC_ENTRY_CONTAINER(Id,entry_id,container_id)       values(:new.id,:new.entry_id,:new.container_id);   end if;   if updating then      update ADCPHC_ENTRY_CONTAINER set entry_id=:new.entry_id,container_id=:new.container_id where id=:old.id;   end if; end INSERT_ADCPHC_ENTRY_CONTAINER;

13.如果你想双向同步,请在源数据库中执行前6步,并在双方都创建以下触发器(当源数据库表改变时,目的数据库表跟着改变,目的数据库表改变时,源数据库表也改变)CREATE OR REPLACE TRIGGER BST114.TRI_ADCPHC_ENTRY_CONTAINER_AFR AFTER DELETE OR INSERT OR UPDATE ON BST114.SN_ADCPHC_ENTRY_CONTAINER  REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW declare     tmp_id number(10):=-1; begin

  dbms_output.put_line(''begin'');   if inserting then       --select id into tmp_id from ADCPHC_ENTRY_CONTAINER where id=:new.id;           for p in(select id from ADCPHC_ENTRY_CONTAINER where id=:new.id)       loop         tmp_id:=p.id;       end loop;              dbms_output.put_line(tmp_id||''===------------'');       if (tmp_id=-1) then           insert into ADCPHC_ENTRY_CONTAINER(id,name,age)           values(:new.id,:new.name,:new.age);       end if;   end if;      if updating then      dbms_output.put_line(''updated'');      for p in(select name,age from ADCPHC_ENTRY_CONTAINER where id=:old.id)      loop          if (p.name!=:new.name) or (p.age!=:new.age) then               update ADCPHC_ENTRY_CONTAINER set name=:new.name,age=:new.age where id=:old.id;          end if;      end loop;   end if;      if deleting then       dbms_output.put_line(''deleted'');       delete from ADCPHC_ENTRY_CONTAINER where id=:old.id;   end if;   dbms_output.put_line(''end''); end TRI_ADCPHC_ENTRY_CONTAINER_AFR;  --为防止双向同步触发器死循环,所以要在触发器中增加一些判断,阻止死循环.

--以上同步原理 1.首先创建一个dblink,可以访问远程数据库 2.在本地创建一个快照,映射远程数据表,当远程数据表有变化时,会反应到快照中. 3.由于快照类似于视图表,所以在本地为快照创建一个触发器,当快照有变化时,会触发相应事件. 4.在触发器中写同步数据的代码.

--附:快照刷新时间参数说明 一天的秒数=24小时*60分钟*60钞 所以要想在30秒后刷新,参数应该这样写 sysdate+30/(24*60*60) 1分钟==sysdate+60/(24*60*60)

一天的分钟数=24小时*60分钟 一分钟也可以这样写 sysdate+1/(24*60) 30分钟==sysdate+30/(24*60) 60分钟==sysdate+60/(24*60)

以此类推 1小时==sysdate+1/24==sysdate+60/(24*60) 1天==sysdate+1 一个月==sysdate+30

 本文转自zylhsy 51CTO博客,原文链接:http://blog.51cto.com/yunlongzheng/529869,如需转载请自行联系原作者



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有