在数据库迁移时,无论采用物理备份还是逻辑备份的方式,经常会碰到源数据库和目的数据库同时存在的问题。本文简单讨论一下,在这种情况下,如果源数据库和目的数据库的物化视图都去主站点刷新数据,会发生什么情况。
首先看看物理备份生成的数据库对物化视图刷新产生的影响。
环境的建立这里就不描述了,可以参考下面这篇文章里面给出的步骤:http://yangtingkun.itpub.net/post/468/216990
注意,本文中的复制环境是通过上面给出的连接中的步骤建立的。而目的数据库的生成并没有采用链接中给出的EXP/IMP方式,而是采用了物理备份的方式建立。
Oracle的物化视图注册信息仅仅是通过GLOBAL_NAME来判断数据库的,而且对于复制得到的数据库,也不可能在主站点生成新的注册信息,这就是说,两个具有相同的GLOBAL_NAME的数据库中的物化视图在基表所在站点上共享相同的注册信息。
Oracle通过物化视图的注册信息和物化视图日志信息,使得一个物化视图日志可以支持多个物化视图的刷新。那么对于这种两个不同的物化视图但是共享相同注册信息的情况,Oracle的物化视图日志还能不能支持呢?其实我更关系倒不是快速刷新能否支持,而是Oracle能否区分出这是两个不同的数据库。
SQL> CONN YANGTK/YANGTK@TESTMV已连接。
SQL> EXEC DBMS_MVIEW.REFRESH('T1');
PL/SQL 过程已成功完成。
SQL> SELECT COUNT(*) FROM T1;
COUNT(*)
----------
12239
SQL> CONN YANGTK/YANGTK@TESTMV245已连接。
SQL> EXEC DBMS_MVIEW.REFRESH('T1')
BEGIN DBMS_MVIEW.REFRESH('T1'); END;
*第 1 行出现错误:
ORA-12034: "YANGTK"."T1" 上的实体化视图日志比上次刷新后的内容新
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 794
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 851
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 832
ORA-06512: 在line 1
SQL> SELECT COUNT(*) FROM T1;
COUNT(*)
----------
12239
SQL> EXEC DBMS_MVIEW.REFRESH('T1', 'C')
PL/SQL 过程已成功完成。
IXDBA.NET社区论坛SQL> EXEC DBMS_MVIEW.REFRESH('T1')
PL/SQL 过程已成功完成。
SQL> CONN YANGTK/YANGTK@TESTMV已连接。
SQL> EXEC DBMS_MVIEW.REFRESH('T1')
BEGIN DBMS_MVIEW.REFRESH('T1'); END;
*第 1 行出现错误:
ORA-12034: "YANGTK"."T1" 上的实体化视图日志比上次刷新后的内容新
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 794
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 851
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 832
ORA-06512: 在line 1
从上面的简单测试就可以发现,虽然两个数据库共享了同一个注册数据库信息,但是由于Oracle还保存了上次刷新时刻,因此,只有一个物化视图可以正常刷新,而另一个物化视图刷新则会报错,这个物化视图如果需要进行快速刷新,必须首先执行完全刷新,而且一旦这个物化视图执行了快速刷新,则另一个物化视图刷新时会报错。这样就保证了物化视图数据的准确性。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
会话已更改。
SQL> COL OWNER FORMAT A10
SQL> COL MVIEW_SITE FORMAT A30
SQL> COL NAME FORMAT A5
SQL> COL MASTER FORMAT A5
SQL> SELECT OWNER, NAME, MVIEW_SITE FROM USER_REGISTERED_MVIEWS;
OWNER NAME MVIEW_SITE
---------- ----- ------------------------------
YANGTK T TESTMV.US.ORACLE.COM
YANGTK T1 TESTMV.US.ORACLE.COM
SQL> SELECT * FROM USER_BASE_TABLE_MVIEWS;
OWNER MASTE MVIEW_LAST_REFRESH_ MVIEW_ID
---------- ----- ------------------- ----------
YANGTK T 2006-10-19 14:50:19 5
YANGTK T1 2006-10-19 14:55:17 6
SQL> CONN YANGTK/YANGTK@TESTMV已连接。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';