`
lxy2330
  • 浏览: 469478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用oracle快照dblink解决数据库表同步问题

阅读更多

本实例已完全通过测试,单向,双向同步都可使用.

--名词说明:源——被同步的数据库
            目的——要同步到的数据库

前6步必须执行,第6以后是一些辅助信息.

--1、在目的数据库上,创建dblink
drop public database link dblink_orc92_182;
Create public DATABASE LINK dblink_orc92_182 CONNECT TO bst114 IDENTIFIED BY password USING 'orc92_192.168.254.111';
--dblink_orc92_182 是dblink_name
--bst114 是 username
--password 是 password
--'orc92_192.168.254.111' 是远程数据库名


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

 

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

 

--4、在源数据库上,创建要同步表的快照日志
Create snapshot log on test_user;

 

--5、创建快照,在目的数据库上创建快照
Create snapshot sn_test_user as select * from test_user@dblink_orc92_182;

 

--6、设置快照刷新时间(只能选择一种刷新方式,推荐使用快速刷新,这样才可以用触发器双向同步)

快速刷新

Alter snapshot sn_test_user refresh fast Start with sysdate next sysdate with primary key;
--oracle马上自动快速刷新,以后不停的刷新,只能在测试时使用.真实项目要正确权衡刷新时间.

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

 

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

手动刷新方式2
EXEC DBMS_SNAPSHOT.REFRESH('sn_test_user','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 TRI_test_user_AFR
after insert or update or delete on sn_test_user
for each row
begin
if deleting then
      delete from test_user where id=:old.id;
end if;
if inserting then
      insert into test_user(id,name)
      values(:new.id,:new.name);
end if;
if updating then
     update test_user set name=:new.name where id=:old.id;
end if;
end TRI_test_user_AFR;

 

 

--13.如果你想双向同步,请在源数据库中执行前6步,并在双方都创建以下触发器(当源数据库表改变时,目的数据库表跟着改变,目的数据库表改变时,源数据库表也改变)
CREATE OR REPLACE TRIGGER BST114.TRI_TEST_USER_AFR
AFTER DELETE OR INSERT OR UPDATE
ON BST114.SN_TEST_USER
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 test_user where id=:new.id;   
      for p in(select id from test_user where id=:new.id)
      loop
        tmp_id:=p.id;
      end loop;
     
      dbms_output.put_line(tmp_id||'===------------');
      if (tmp_id=-1) then
          insert into test_user(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 test_user where id=:old.id)
     loop
         if (p.name!=:new.name) or (p.age!=:new.age) then
              update test_user 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 test_user where id=:old.id;
end if;
dbms_output.put_line('end');
end TRI_test_user_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

 

分享到:
评论

相关推荐

    利用oracle快照dblink解决数据库表同步问

    ### 利用Oracle快照dblink解决数据库表同步问题 #### 概述 在数据库管理领域,特别是当涉及跨数据库的表同步时,Oracle提供的多种工具和技术为DBA(数据库管理员)提供了极大的便利。其中,Oracle快照(Snapshot)与...

    Oracle利用job和dblink高级数据库同步技术

    本文将深入探讨如何利用Oracle的Job和DBLink功能进行高级数据库同步技术,以确保数据的一致性和实时性。 首先,让我们了解Oracle Job。Job是Oracle的一个调度工具,它允许用户在特定时间或按固定频率执行数据库操作...

    oracle使用dblink高速复制表数据的动态存储过程

    执行存储过程,通过指定目标数据库登录信息,动态生成dblink,打开游标,按批次插入本地指定表中,每批次1万条数据。同步记录和日志信息写在自动生成的sync_log表中。同步完成后自动删除动态生成的存储过程、dblink...

    Oracle使用dblink导用户下的所有表数据(以迁移scott用户为例)

    2. **查询源数据库表**:使用DB Link,我们可以查询源数据库scott用户下的所有表。例如: ```sql SELECT table_name FROM all_tables@scott_dblink WHERE owner = 'SCOTT'; ``` 这将返回scott用户拥有的所有表名...

    Linux下ORACLE 使用dblink连接mysql_lijilinjy的专栏-CSDN博客.mhtml

    Linux下ORACLE 使用dblink连接mysql_lijilinjy的专栏-CSDN博客.mhtml

    oracle数据库之间同步数据 dbLink +job方式

    ### Oracle数据库之间同步数据:dbLink + Job方式 在Oracle数据库管理中,有时我们需要实现不同数据库之间的数据同步。本文将详细介绍如何通过dbLink与Job相结合的方式实现这一目标。 #### 一、dbLink简介 dbLink...

    Oracle之dblink的配置

    Oracle之dblink的配置 Oracle之dblink的配置 Oracle之dblink的配置 Oracle之dblink的配置

    oracle dblink 创建过程

    Oracle快照(Snapshot)是一种存储表的静态副本的方法,常用于实现本地数据库与远程数据库之间的数据同步。 ##### 1. 创建快照日志 首先,在本地数据库中创建一个用于记录变化的快照日志: ```sql CREATE TABLE ...

    oracle通过odbc建立dblink访问sqlserver数据库

    为了实现Oracle数据库与SQLServer数据库之间的数据交换,可以通过多种方式实现连接,其中一种较为简便的方法是利用Oracle提供的ODBC(Open Database Connectivity)机制来建立DBLink。这种方式相较于使用透明网关...

    oracle通过DBlink连接mysql搭建过程

    使用 DBlink 连接 Oracle 和 MySQL 数据库 Oracle 通过 DBlink 连接 MySQL 搭建过程是一个复杂的过程,需要安装和配置多个组件,包括 unixODBC、mysql-connector-odbc 和 Oracle 环境变量。本文将详细说明这个过程...

    巧用dblink结合oracle快照实现两台服务器的数据同步

    巧用dblink结合oracle快照实现两台服务器的数据同步

    oracle通过ODBC建立dblink访问SqlServer数据库配置.docx

    oracle通过ODBC建立dblink访问SqlServer数据库配置

    oracle10g或11g通过dblink访问sql server数据库

    ### Oracle 10g 或 11g 通过 DBLink 访问 SQL Server 数据库 #### 概述 本文档详细介绍了如何在Oracle 10g或11g环境中使用DBLink来访问SQL Server数据库的方法。这种方法对于那些习惯于使用Oracle进行数据库操作的...

    Oracle数据库 Synonym和DBLink

    Oracle 数据库 Synonym 和 DBLink Oracle 数据库中有两个重要的概念:同义词(Synonym)和数据库连接(DBLink)。这两个概念都是为了方便数据库的使用和管理而设计的。 同义词(Synonym) 同义词是 Oracle 数据库...

    oracle dblink 的应用

    Oracle dblink 是 Oracle 数据库中用于连接不同数据库实例的工具,允许用户在多个数据库之间进行数据查询、更新和传输。它的主要应用场景是在分布式环境中,当需要从一个数据库访问另一个远程数据库的数据时。以下是...

    记一次oracle通过dblink连接mysql实施

    总结起来,通过Oracle的DBLink连接MySQL虽然涉及多个层面的配置,但通过正确地识别和解决问题,如HSODBC问题、监听配置问题以及字符集设置,可以成功建立跨数据库的连接。在面对RAC这样的高可用性环境时,需要更细致...

    DBLink oracle数据库连接 及简单操作代码c#

    DBLink oracle数据库连接 及简单操作代码

    建立oracle 数据库的dblink

    Oracle数据库的DBLINK(数据库链接)是一种连接两个不同Oracle数据库实例的机制,允许用户在一个数据库中执行查询或操作另一个数据库的数据。在Oracle中,DBLINK是实现跨数据库交互的重要工具,尤其在分布式数据库...

    Oracle DBLink建立连接

    - **跨库查询**:利用DBLink可以轻松地实现跨数据库的数据查询和处理,这对于数据分析和报表生成非常有用。 #### 知识点五:DBLink的安全性考虑 - **权限管理**:由于DBLink涉及到不同数据库之间的数据访问,因此...

    oracle 使用dblink方式 连接远程数据库,内有详细描述,亲测可以

    ### Oracle使用DBLink连接远程数据库详解 #### 一、DBLink简介 在Oracle数据库中,DBLink(Database Link)是一种非常实用的功能,它允许用户在一个数据库(本地数据库)中访问另一个数据库(远程数据库)的数据。...

Global site tag (gtag.js) - Google Analytics