搞了几天数据同步的程序,写完之后觉得很浪费,因为oracle自身的数据库联机备份功能已经相当强大。不过关键一点是我们应用场景跟联机备份有很大差别。

虽然这次没用上oracle自身备份功能,但是有一个通过建立db link 来实现同步倒也很简单,查询了网上资料之后,自己也实现了这一功能。

具体步骤如下:

场景:

数据库版本:oracle9i,默认情况下两个数据库服务器都是刚建好的

局域网或广域网上两台能互联的数据库服务器,一个是main,一个是ass,现在每往main中某一表test增删改一条记录时,ass中test表通过main库中触发器来增删改,哦,对了两个test结构一样

我现在实现的是局域网内的数据同步:

预热:

先建表

*****************************************************************

Create table
create table TEST
(
  USERNAME VARCHAR2(20),
  PASSWORD VARCHAR2(10)
)
tablespace SYNTEST
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

*****************************************************************

1:先构建一下ass数据库实例的连接符,先备份一个%oracle_home%--ora92--network--admin-->tnsnames.ora,然后用UltraEdit打开,添加如下

*****************************************************************

ass100 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = syntest)
    )
  )

*****************************ok************************************

注意:ass100是用于网络连接用的名称,2中要用到

2:建立db_link

*****************************************************************

create public database link syntest100
connect to syntest
identified by syntest
using 'ass100'

*****************************************************************

注意:syntest100是db link 名称,可以随便起名,

ass100就是1中的建立的连接符名称

synonym

*****************************************************************

create or replace synonym

syntest.test@syntest100

*****************************************************************

注意:syntest100就是2中的db link 名称,syntest.test是ass中的实例名.表名

小提示:执行完3后,可以在本地执行select * from syn100,这时得出来的结果是ass数据库中表test的数据。

4:如果以上都正确的话,现在可以为本地表test建触发器,我写了3个触发器,增加,删除,修改

*****************************************************************

--增加

create or replace trigger synins
after insert on test
for each row
begin
 insert into syn100 (USERNAME,Password) values (:NEW.USERNAME,:NEW.password);
end;

--执行完,可以测试一下

/*

添加本机一条记录

insert into test (username,password) values ('murphy','1234')

查看ass表test

select * from syn100

可以吧,我这里是ok的。

*/

 

--修改

create or replace trigger synupd
  after update on test 
  for each row
declare
begin
  update syn100 set password = :new.password where username = :old.username;
end synupd;

--执行完,可以测试一下

/*

修改本机一条记录

update test set password = '123' where username = 'murphy'

查看ass表test

select * from syn100

*/

 

--删除

create or replace

  after delete on test 
  for each row
declare
  -- local variables here
begin
  delete from syn100 where username=:old.username;
end syndel;

--执行完,可以测试一下

/*

删除一条本地记录

delete from test where username = 'murphy'

查看ass表test

select * from syn100

*/

****************************全文完*************************************