ORACLE 10G用DB_LINK和触发器同步不同库中表的数据

简介:

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,如需转载请自行联系原作者

相关文章
|
5天前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
12 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
4天前
|
SQL 存储 Oracle
TDengine 3.3.2.0 发布:新增 UDT 及 Oracle、SQL Server 数据接入
**TDengine 3.3.2.0 发布摘要** - 开源与企业版均强化性能,提升WebSocket、stmt模式写入与查询效率,解决死锁,增强列显示。 - taos-explorer支持geometry和varbinary类型。 - 企业版引入UDT,允许自定义数据转换。 - 新增Oracle和SQL Server数据接入。 - 数据同步优化,支持压缩,提升元数据同步速度,错误信息细化,支持表名修改。 - 扩展跨平台支持,包括麒麟、Euler、Anolis OS等。
11 0
|
7天前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在online模式下增量抓取Oracle数据时,在archive_log切换时,出现数据丢失的情况,是什么原因
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
Oracle 关系型数据库 数据处理
实时计算 Flink版产品使用问题之如何进行Oracle到HBase的同步
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之oracle无主键的表支持同步吗如何实现
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
SQL 数据采集 Oracle
实时计算 Flink版产品使用问题之如何读取oracle中的blob类型的数据
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
Oracle 关系型数据库 数据库
实时计算 Flink版产品使用问题之连接到Oracle数据库但无法读取到数据,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
运维 DataWorks Oracle
DataWorks产品使用合集之在标准模式下,当同步Oracle的表或视图时,是否需要在源端的测试和生产环境中都存在要同步的表或视图
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
19 3
|
1月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之在进行Oracle数据库的全量同步时,只同步了一条数据而源表实际上包含多条数据,是什么原因
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之同步oracle表时,数据量约800万,检查点异常,该如何排查
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

推荐镜像

更多