数据库数据同步方式有很多,使用Logminer、GoldenGate、DataGurd等基于oracle日志方式的同步,或者使用dblink+trigger进行同步,也可以通过代码的job方式进行同步数据。
最近在做数据采集的一个系统,里面需要对少量表数据进行实时同步,考虑到实时性以及成本,这里采用了dblink+trigger。
我们这里对database_A和database_B进行操作,将database_A里面的表order表数据同步到database_B中。
1. 首先我们需要对两个oracle数据库建立连接
- 使用管理员登录database_A,给用户rescue添加创建dblink和别名的权限
grant create database link to rescue;
grant create synonym to rescue;
- 创建dblink(连接的是database_B,所以用户名、密码、host都是database_B的信息)
CREATE DATABASE LINK dblink_test
CONNECT TO watertest IDENTIFIED BY watertest
USING '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST=192.168.1.20)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = orcl)
)
)';
如果创建成功会提示:Database link created
- 测试是否dblink创建是否成功(在database_A中查询database_B中的数据)
select * from code@dblink_test;
- 创建并测试别名
create public synonym order_A for order@dblink_test;
select * from order_A;
2. 在database_A中添加触发器
create or replace trigger test_trigger
before INSERT ON order FOR EACH ROW
BEGIN
IF inserting THEN
insert into order_A(order_id, goods_id, price) values (:NEW.ORDER_ID, :NEW.GOODS_ID, :NEW.PRICE);
END IF;
END;
3. 在database_A的order表中添加数据,查看database_B是否有同步数据
insert into order(order_id, goods_id, price) values('1', '1', 34);