我测试的环境:一个主站点,一个物化视图站点,需要在复制组的一个表添加字段,对应物化视图的基表也需要添加。
心得主要有2点:一个是必须执行DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT包,新加的字段不会自动添加到复制支持的列表里去(查询select * from dba_repcolumn;可以观察到)
第二点是在物化视图站点,之前的物化视图需要删掉重建,重建的时候主表新加的字段物化视图识别不了,需要重启物化视图的数据库实例,这点不知道我操作有问题还是oracle的bug。我试了2次都需要重启数据库。
操作过程主要分三块,首先是主站点,然后是物化视图站点,最后回到主站点。
下面是具体的操作过程:
对于主站点,须执行下面步骤
--暂停复制
BEGIN
DBMS_REPCAT.suspend_master_activity ( gname => 'rep_group');
END;
--删除更新策略
begin
dbms_repcat.drop_update_resolution(sname => 'js',
oname => 'JS_CHANGE_CODE',
column_group => 'JS_CHANGE_CODE_cg',
sequence_no => 1) ;
end;
/
--删除列组
BEGIN
DBMS_REPCAT.drop_column_group (
sname => 'js',
oname => 'JS_CHANGE_CODE',
column_group => 'JS_CHANGE_CODE_cg'
);
END;
/
--添加字段
BEGIN
DBMS_REPCAT.ALTER_MASTER_REPOBJECT (
sname => 'js',
oname => 'JS_CHANGE_CODE',
type => 'TABLE',
ddl_text => 'alter table js.JS_CHANGE_CODE add ftest VARCHAR2(8)');
END;
/
--创建列组
BEGIN
DBMS_REPCAT.MAKE_COLUMN_GROUP (
sname => 'js',
oname => 'JS_CHANGE_CODE',
column_group => 'JS_CHANGE_CODE_cg',
list_of_column_names => '*');
END;
--添加更新策略
BEGIN
DBMS_REPCAT.ADD_UPDATE_RESOLUTION (
sname => 'js',
oname => 'JS_CHANGE_CODE',
column_group => 'JS_CHANGE_CODE_cg',
sequence_no => 1,
method => 'overwrite',
parameter_column_name => '*');
END;
/
--重新生成复制支持
begin
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT ( sname => 'js',
name => 'JS_CHANGE_CODE',
type => 'TABLE',
min_communication => TRUE);
END;
/
物化视图站点操作步骤
--从刷新组移除物化视图刷新
BEGIN
DBMS_REFRESH.subtract ( name => 'mvadmin.CDCTEST_REFRESH',
list => 'js.JS_CHANGE_CODE_bs', lax => TRUE);
END;
/
commit;
--从复制组移除复制对象
BEGIN
DBMS_REPCAT.drop_MVIEW_REPOBJECT (
sname => 'js',
name => 'JS_CHANGE_CODE_BS',
type => 'SNAPSHOT'
);
END;
/
--删除物化视图
drop materialized view JS_CHANGE_CODE_BS;
--添加字段
alter table js.JS_CHANGE_CODE_bs add ftest VARCHAR2(8)
--重启了物化视图站点实例,重建物化视图,
--这一步有点奇怪,主站点新增加的字段死活没有添加到物化视图定义里,如果在select里指定那个字段,会说字段不能识别
--这一步我重启了物化视图站点实例,新建的物化视图才能有新加的字段
CREATE MATERIALIZED VIEW JS_CHANGE_CODE_BS
ON PREBUILT TABLE
REFRESH FAST ON DEMAND
FOR UPDATE
AS
SELECT * FROM JS.JS_CHANGE_CODE@CDCTEST ;
--添加到刷新组
BEGIN
DBMS_REFRESH.ADD ( name => 'mvadmin.cdctest_refresh',
list => 'js.JS_CHANGE_CODE_BS', lax => TRUE);
END;
/
commit;
--添加到复制组
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPOBJECT ( gname => 'rep_group',
sname => 'JS',
name => 'JS_CHANGE_CODE_BS',
type => 'SNAPSHOT',
min_communication => TRUE);
END;
回到主站点,恢复复制支持
BEGIN
DBMS_REPCAT.resume_master_activity ( gname => 'rep_group');
END;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25027760/viewspace-751884/
,如需转载,请注明出处,否则将追究法律责任。