Chinaunix首页 | 论坛 | 博客
  • 博客访问: 548141
  • 博文数量: 166
  • 博客积分: 4038
  • 博客等级: 上校
  • 技术积分: 1115
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-14 23:29
文章分类

全部博文(166)

文章存档

2010年(12)

2009年(126)

2008年(28)

分类: Oracle

2009-04-26 16:05:18

搞了几天数据同步的程序,写完之后觉得很浪费,因为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中的建立的连接符名称

3:如果2执行通过的话,就可以建立同义synonym

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

create or replace synonym syn100 for

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

注意: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 trigger syndel

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

*/

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

感觉很方便。

阅读(592) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~