【业务场景】需要把生产的ERP系统上面的一个表的数据抽取到另外一个报表的数据库里面,公司内部是没有ESB的平台,考虑到整个需求的紧急程度和对效率的要求,建议采用物化视图+DBLINK的方式来实现数据的同步;
【环境说明】
数据库的版本:11.2.0.3数据的流向:DB1为源数据库,DB2为目标数据库
源表:EMP,该表包含主键EMPNO
目标物化视图:MV_EMP
【方案思路】
1、在DB2上面创建一个连接DB1的DBLINK;
2、在EMP表上面增加物化视图日志,并在目标表创建物化视图MV_EMP;
3、创建JOB进行定时刷新;
【实践操作】
1、在db2上面添加tns文件
- DB1 =
- (DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.10)(PORT = 1521))
- )
- (CONNECT_DATA =
- (SERVICE_NAME = DB1)
- )
- )
|
2、在db2上面创建dblink
create public database link DB1 connect to "scott" identified by "tigger" using 'DB1' ;
|
3、在db1上面创建物化视图日志
| create materialized view log on EMP with primary key; |
注:
对于已定义主键的表,分别执行以下 sql:create materialized view log on 表名 with primary key;
对于未定义主键的表,分别执行以下 sql:create materialized view log on 表名 with rowid;
4、在db2上面创建物化视图,并设置刷新时间
CREATE MATERIALIZED VIEW SCOTT.MV_EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
REFRESH FAST ON DEMAND NEXT SYSDATE + 1/(24*60)
#每分钟刷新 WITH PRIMARY KEY
#基于PRIMARY KEY AS
SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO FROM scott.EMP@DB1;
|
【其他】
- 创建物化视图日志的时候,会在相应的物化视图日志表,本质就是一张物理表,表名的结构如下:MLOG$_TABLENAME,本例中创建的物化视图日志表名为:MLOG$_EMP;
- 当有数据变更的时候,MLOG$_EMP表就会记录源表的变更记录,等目标的物化视图表刷新以后,该表的数据会被清空;
整个方案其实用到的东西也是很简单的,物化视图和DBLINK,当这两个功能进行结合的时候,就实现了数据仓储的数据抽取的工作。创新有时候只是功能的叠加使用;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29578568/viewspace-2136897/
,如需转载,请注明出处,否则将追究法律责任。