通常如果需要对主表进行修改的话,如增加字段,修改字段数据类型;这要求我们将快照/复制停掉,甚至删除快照。这样给数据同步带来麻烦。特别是主表数据很多的话,通常采用的方法是将数据导出,再建立on prebuilt table,再导入数据,建立刷新环境。这需要很多时间和回滚段等资源,还容易出错。
我们采用prebuilt table创建的快照和物化视图可以避免这样的情况。
master table 是scott.trade 已经建立了mlog
snapshot on prebuit table是zhangbin.trade;快照建立在prebuilt table是本方法的前提。
SQL>show user
SYS
在主表上添加字段,且之前作了刷新——保证主表和快照数据一致
SQL> alter table scott.trade add zb varchar2(20) default 'ab';
Table altered.
删除快照,但on prebult table还在
SQL> drop snapshot zhangbin.trade;
Materialized view dropped.
SQL> select count(*) from slog$;
COUNT(*)
----------
0
在prebult table上添加字段,执行同样的ddl
SQL> alter table zhangbin.trade add zb varchar2(20) default 'ab';
Table altered.
SQL> connect zhangbin/zhangbin
Connected.
重新创建快照
SQL> create snapshot trade on prebuilt table as select * from scott.trade;
Materialized view created.
快速刷新成功。
SQL> execute dbms_snapshot.refresh('trade','fast');
PL/SQL procedure successfully completed.
SQL> show user
USER is "ZHANGBIN"
SQL> update scott.trade set zb='ddd';
13 rows updated.
SQL> commit;
Commit complete.
SQL> execute dbms_snapshot.refresh('trade','fast');
PL/SQL procedure successfully completed.
可以参考itpub讨论 http://www.itpub.net/showthread.php?s=&threadid=330470
http://www.dbazine.com/nanda2.html 也有例子。