Oracle-11g 中两库间物化视图的同步
运行环境
1.目标端数据库
(1).数据库版本:Oralce-11.2.0.3
(2).IP 地址:11.6.76.222~223
2.源端数据库
(1).数据库版本:Oralce-11.2.0.4
(2).IP 地址:192.168.87.221~222
物化视图同步说明
在源端数据库创建表 TB_MV_TEST1 以及 TB_MV_TEST2,目标端将建立查询以上两表的物化视图,并分别采用增量及全量的方式进行同步。
配置步骤
1.创建测试表(源端)
SQL> CREATE TABLE TB_MV_TEST1 (pkid number, msg varchar2(32));
ALTER TABLE TB_MV_TEST1 ADD CONSTRAINT pk_tb_mv_test1 PRIMARY KEY (pkid);
SQL> CREATE TABLE TB_MV_TEST2 (pkid number, msg varchar2(32));
ALTER TABLE TB_MV_TEST2 ADD CONSTRAINT pk_tb_mv_test2 PRIMARY KEY (pkid);
2.创建物化视图日志(源端)
由于 TB_MV_TEST1 欲采用增量同步方式,所以对其创建物化视图日志。
SQL> CREATE MATERIALIZED VIEW LOG ON tb_mv_test1;
注意:默认情况下将以 with primary key 方式存储物化视图日志。
3.创建 DB LINK(目标端)
SQL> CREATE DATABASE LINK db_test CONNECT TO adm_zsz IDENTIFIED BY "password" USING 'foctestora';
4.创建物化视图(目标端)
SQL> CREATE MATERIALIZED VIEW mv_test1 REFRESH FORCE ON DEMAND WITH PRIMARY KEY AS SELECT * FROM tb_mv_test1@db_test;
SQL> CREATE MATERIALIZED VIEW mv_test2 REFRESH FORCE ON DEMAND WITH PRIMARY KEY AS SELECT * FROM tb_mv_test2@db_test;
5.刷新物化视图(目标端)
SQL> exec dbms_mview.refresh('MV_test1');
SQL> exec dbms_mview.refresh('MV_test2');
注意:因为刷新方式为 FORCE,所以将先尝试使用 FAST 方式刷新物化视图,倘若不符合 FAST 刷新的条件,则采用 COMPLETE 方式刷新。
刷新方式验证
1.新增 MASTER TABLE 数据(源端)
SQL> insert into tb_mv_test1 values (5,'FIVE');
SQL> insert into tb_mv_test2 values (5,'FIVE');
2.查看物化视图日志信息(源端)
SQL> SELECT log_owner, master, log_table, primary_key, last_purge_date,last_purge_status
FROM user_mview_logs;
查询结果如下
由上图可见,表 TB_MV_TEST1 的物化视图日志名称为 MLOG$_TB_MV_TEST1,表 TB_MV_TEST2 并无物化视图日志。
3.查看物化视图日志内容(源端)
SQL> SELECT * FROM MLOG$_TB_MV_TEST1;
查询结果如下
可见新增数据已记录于物化视图日志。
4.刷新物化视图(目标端)
SQL> exec dbms_mview.refresh('MV_test1');
SQL> exec dbms_mview.refresh('MV_test2');
5.查看物化视图刷新方式(目标端)
SQL> SELECT owner, mview_name, last_refresh_type, last_refresh_date, staleness
FROM dba_mviews
查询结果如下
由上图可见 MV_TEST1 采用 FAST 方式刷新,MV_TEST2 采用 COMPLETE 方式刷新。
6.查看物化视图日志内容(源端)
SQL> SELECT * FROM MLOG$_TB_MV_TEST1;
查询结果如下
由上图可见,源端物化视图日志在刷新后,日志内容清空。