搞了几天数据同步的程序,写完之后觉得很浪费,因为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
*/
****************************全文完*************************************