高階複製主站點主表新增欄位操作

wenhual43發表於2012-12-30
我測試的環境:一個主站點,一個物化檢視站點,需要在複製組的一個表新增欄位,對應物化檢視的基表也需要新增。
心得主要有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部落格 ” ,連結:http://blog.itpub.net/25027760/viewspace-751884/,如需轉載,請註明出處,否則將追究法律責任。

相關文章