oracle cdc 非同步部署文件

jinqibingl發表於2016-04-20
一:概念簡介

1        CDC是一種資料增量處理技術

2        CDC元件(Change Data Capture 改變資料捕獲)的原理:

1)        CDC體系結構基於釋出者/訂閱者模型。
2)        釋出者捕捉變化資料並提供給訂閱者。
3)        訂閱者使用從釋出者那裡獲得的變化資料。
4)        通常,CDC系統擁有一個釋出者和多個訂閱者。
5)        釋出者首先需要識別捕獲變化資料所需的源表。然後,它捕捉變化的資料並將其儲存在特別建立的變化表中。
        它還使訂閱者能夠控制對變化資料的訪問。
6)        訂閱者需要清楚自己感興趣的是哪些變化資料。
7)        一個訂閱者可能不會對釋出者釋出的所有資料都感興趣。 
8)        訂閱者需要建立一個訂閱者檢視來訪問經發布者授權可以訪問的變化資料。

3        CDC有幾個重要的基本概念需要先明確一下:
  
1)        源表(Source Table),業務資料庫的需要捕獲資料的源表
2)        目標端變化集(Change Set),是保證事務一致性的資料集合。一個變化集對應多個變化表
3)        目標端變化表(Change Table),儲存從源表捕獲的變化資料(包括各種DML產生的資料)
4)        訂閱檢視(Subscription View),提供給讀取變化表資料的檢視
5)        訂閱視窗(Subscription Window) ,定義了檢視變化資料的時間範圍.就象一個觀察變化資料的滑動視窗。變化資料處理完成後,可以清除訂閱視窗。

二:CDC的同步與非同步模式
1 同步複製,        Synchronous Change Data Capture Configuration(同步複製),實時的捕獲變化資料並儲存到變化表中,釋出者與訂閱都位於同一資料庫中
2 非同步模式,以Oracle流複製技術為基礎,從redo log中讀取日誌記錄來捕捉變化資料,非同步模式有三種:
                (1) Asynchronous HotLog (非同步線上日誌CDC)
                (2) Asynchronous Distributed HotLog(非同步分散式CDC)
                (3) Asynchronous AutoLog Mode
                                (3.1) Asynchronous Autolog Online  Change Data Capture(非同步線上日誌複製CDC)
                                (3.2) Asynchronous AutoLog Archive Change Data Capture(非同步歸檔日誌CDC)
                                                                                                
Asynchronous AutoLog Mode過程為:source table->例項化source table->>>>目標change source->目標change set->change table.當然,這期間可以過濾某些欄位,或者某些表。


三:部署實施

1. 環境設定

1.1 網路連線(源庫和目標庫都要配置)

1.0.1 原庫的listener.ora 內容如下:

# listener.ora Network Configuration File: /data/oracle/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /data/oracle/product/11.2.0/db_1)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost13.localdomain)(PORT = 1521))
    )
  )
ADR_BASE_LISTENER = /data/oracle

#注意:HOST = localhost13.localdomain 根據系統主機名自行配置

1.0.2 原庫的sqlnet.ora 內容如下:

# sqlnet.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.
#SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

ADR_BASE = /data/oracle


1.0.3 原庫的tnsnames.ora 內容如下:

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

CDC01 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.13)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )


CDC02 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.14)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
#注意:HOST = xxx.xxx 根據系統主機IP自行配置  

1.1.1 目標庫的listener.ora 內容如下:

# listener.ora Network Configuration File: /data/oracle/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

#ADR_BASE_LISTENER = /data/oracle

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /data/oracle/product/11.2.0/db_1)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost14.localdomain)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = /data/oracle
#注意:HOST = localhost14.localdomain 根據系統主機名自行配置



1.1.2 目標庫的sqlnet.ora 內容如下:

# sqlnet.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

ADR_BASE = /data/oracle


1.1.3 目標庫的tnsnames.ora 內容如下:

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

CDC02 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.14)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

CDC01 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.13)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
#注意:HOST = xxx.xxx 根據系統主機IP自行配置



1.2 初始引數
1.2.1 設定兩庫密碼
確保源庫和目標庫的sys使用者名稱密碼要一致;
原庫重建密碼檔案:
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle
建好之後copy到備庫的$ORACLE_HOME/dbs 並且改名為備庫的$ORACLE_HOME/dbs/orapw$ORACLE_SID ,注意沒有字尾.ora

1.2.2 目標庫引數修改
sqlplus / as sysdba
show parameter global_names;                                 /* 檢視global_names的值 */
alter system set global_names=true scope=both;       /* 如果global_names的為false的話,修改global_names為true,both為啟動生效 */
show parameter java_pool_size;                                /* 檢視java_pool_size當前的值 */
alter system set java_pool_size=50M scope=both;     /* 如果當前值為0的話,設定java_pool_size為50M,否則可以增加50M */
show parameter log_archive_dest_;                           /* 檢視當前歸檔日誌使用的情況 */
alter system set log_archive_dest_1 = 'location=D:\app\arch1 mandatory reopen=5 valid_for=(online_logfile,primary_role)' scope=both;  /* 如果log_archive_dest_1沒有被使用的話,就使用log_archive_dest_1設定歸檔路徑 */
alter system set log_archive_dest_2 = 'location=D:\app\arch2 mandatory valid_for=(standby_logfile,primary_role)' scope=both;        /* 如果log_archive_dest_2沒有被使用的話,就使用log_archive_dest_2設定遠端歸檔日誌的路徑 */
alter system set log_archive_dest_state_1=enable scope=both;
alter system set log_archive_dest_state_2=enable scope=both;
alter system set log_archive_format="cdc02_%R_%T_%S.arc" scope=spfile;
alter system set job_queue_processes = 2;
show parameter parallel_max_servers;
alter system set parallel_max_servers =15 scope=both;
show parameter remote_login_passwordfile;              /* 檢視remote_login_passwordfile的值 */
alter system set remote_login_passwordfile=EXCLUSIVE scope=spfile;   /* 設定remote_login_passwordfile為shared:只有INTERNAL/SYS帳號能被密碼檔案識別,不允許他們以SYSOPER/SYSDBA的許可權登入 */
show parameter streams_pool_size;                                             /* 檢視stream_pool_size的值,如果不設定streams_pool_size引數,將用shared_pool_size池十分之一的記憶體 */
alter system set streams_pool_size=200m scope=both;                   /* 可從v$sgastat中檢視streams_pool_size池的使用,根據監控的結果,為streams_pool_size設定合適的值 */
show parameter undo_retention;
alter system set undo_retention=3600 scope=BOTH;
alter system set "_job_queue_interval"=1 scope=spfile;   --同時設定_job_queue_interval也是為了提高佇列檢查時間,防止apply出問題。
alter system set aq_tm_processes=2 scope=both;
/*之上,如果沒有/home/oracle/arch/arch_cdc02_dest1和/home/oracle/arch/arch_cdc02_dest2 自己mkdir -p建立*/

/* 啟用歸檔模式 */
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
archive log list;

/* 切換歸檔模式,確認歸檔是否成功(在歸檔日誌路徑下面是否有歸檔日誌生成) */
alter system switch logfile;

/* 新增遠端歸檔日誌 */
sqlplus  sys/oracle@cdc01 as sysdba;      /* 登陸到源庫 */
select group#, bytes/1024/1024 size_mb from v$log;     /* 檢視源庫的redo log組個數(假設為3)和大小(假設為50MB) */
sqlplus sys/oracle@cdc02 as sysdba;      /* 登陸到目標庫 */
select max(group#) from v$log;   /* 檢視當前group的個數,假設當前為3 */

/* 在目標庫建立的日誌個數要為源庫個數+1個,日誌檔案大小要相同 */
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('D:\app\stdbylogs/slog1a.rdo', 'D:\app\stdbylogs/slog1b.rdo') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('D:\app\stdbylogs/slog2a.rdo', 'D:\app\stdbylogs/slog2b.rdo') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('D:\app\stdbylogs/slog3a.rdo', 'D:\app\stdbylogs/slog3b.rdo') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('D:\app\stdbylogs/slog4a.rdo', 'D:\app\stdbylogs/slog4b.rdo') SIZE 50M;

SELECT group#, bytes, status FROM v$standby_log;



1.2.3 源庫引數設定
sqlplus / as sysdba
show parameter global_names;                                 /* 檢視global_names的值 */
alter system set global_names=true scope=both;       /* 如果global_names的為false的話,修改global_names為true,both為啟動生效 */
show parameter java_pool_size;                                /* 檢視java_pool_size當前的值 */
alter system set java_pool_size=50M scope=both;     /* 如果當前值為0的話,設定java_pool_size為50M,否則可以增加50M */
show parameter log_archive_dest_;                           /* 檢視當前歸檔日誌使用的情況 */
alter system set log_archive_dest_1='location=/home/oracle/arch/archive mandatory reopen=5' scope=both;  /* 如果log_archive_dest_1沒有被使用的話,就使用log_archive_dest_1設定歸檔路徑 */
alter system set log_archive_dest_2='service=cdc02 lgwr async optional noregister reopen=5 valid_for=(online_logfile,primary_role)' scope=both;  /*非同步線上日誌,不要指定template*/
#--alter system set log_archive_dest_2='service=cdc02 arch optional noregister reopen=5 template=D:\app\stdbylogs/cdc_stby_%R_%T_%S.archi' scope=both;      /*非同步歸檔日誌 如果log_archive_dest_2沒有被使用的話,就使用log_archive_dest_2設定遠端歸檔目標 */
alter system set log_archive_dest_state_1=enable scope=both;
alter system set log_archive_dest_state_2=enable scope=both;
alter system set log_archive_format="cdc01_%R_%T_%S.arc" scope=spfile;
alter system set job_queue_processes = 2;
show parameter parallel_max_servers;
alter system set parallel_max_servers = 15 scope=both;
show parameter remote_login_passwordfile;              /* 檢視remote_login_passwordfile的值 */
alter system set remote_login_passwordfile=EXCLUSIVE scope=spfile;   /* 設定remote_login_passwordfile為shared:只有INTERNAL/SYS帳號能被密碼檔案識別,不允許他們以SYSOPER/SYSDBA的許可權登入 */
show parameter streams_pool_size;                                             /* 檢視stream_pool_size的值,如果不設定streams_pool_size引數,將用shared_pool_size池十分之一的記憶體 */
alter system set streams_pool_size=200m scope=both;                   /* 可從v$sgastat中檢視streams_pool_size池的使用,根據監控的結果,為streams_pool_size設定合適的值 */
show parameter undo_retention;
alter system set undo_retention=3600 scope=BOTH;
alter system set "_job_queue_interval"=1 scope=spfile;   --同時設定_job_queue_interval也是為了提高佇列檢查時間,防止apply出問題。
alter system set aq_tm_processes=2 scope=both;


/* 啟用歸檔模式,*/
shutdown immediate;
startup mount;
alter database archivelog;
alter database force logging;
alter database add supplemental log data;
alter database open;
archive log list;
show parameter log_archive_dest_; 

/* 切換歸檔模式,確認歸檔是否成功(在歸檔日誌路徑下面是否有歸檔日誌生成) */
alter system switch logfile;



-----------------------------------------------------------------------------------------------------------------------

2. 建立使用者
2.1 源庫使用者
sqlplus / as sysdba
/* 建立使用者,源表擁有者 */
create user cdc_source identified by cdc_source default tablespace users temporary tablespace temp;
/* 賦予許可權 */  
grant connect, resource, select any table to cdc_source;    

2.2 目標庫使用者
sqlplus / as sysdba

/* 建立釋出者,並賦予許可權 */
CREATE TABLESPACE ts_cdcpub DATAFILE 'D:\app\Administrator\oradata\proc\ts_cdcpub.dbf' SIZE 500m;    
create user cdc_stg_pub identified by cdc_stg_pub default tablespace ts_cdcpub temporary tablespace temp quota unlimited on system quota unlimited on ts_cdcpub quota unlimited on sysaux; 
grant create session, create table, create tablespace, create sequence, select_catalog_role, execute_catalog_role, dba to cdc_stg_pub;
grant unlimited tablespace to cdc_stg_pub;
grant execute on dbms_cdc_publish to cdc_stg_pub;
execute dbms_streams_auth.grant_admin_privilege(grantee => 'cdc_stg_pub');

/* 建立訂閱者,並賦予許可權 */
create user cdc_stg_user identified by cdc_stg_user default tablespace users temporary tablespace temp; 
grant connect, resource,dba to cdc_stg_user;



3. CDC啟用
3.1 建立源表
sqlplus cdc_source/cdc_source;                           
create table emp as select * from scott.emp;             
create table dept as select * from scott.dept;           
alter table emp add supplemental log data (all) columns; 
alter table dept add supplemental log data (all) columns;

/* 登陸源庫 */
conn / as sysdba                    /* 登陸源庫 */
/* 設定可以輸出顯示 */
/* 獲取源資料SCN值,並記錄以後使用 */
set serveroutput on; 
variable f_scn number;
begin
  :f_scn :=0;
  dbms_capture_adm.build( :f_scn );
  dbms_output.put_line( 'The first_scn value is ' || :f_scn );
end;
/

/* 例項化每個表 */
begin
  dbms_capture_adm.prepare_table_instantiation(table_name => 'cdc_source.emp');
  dbms_capture_adm.prepare_table_instantiation(table_name => 'cdc_source.dept');
end;
/

select global_name from global_name;    /* 查詢源資料庫的全名 */


3.2 建立變化表
/* 建立修改源 */
sqlplus cdc_stg_pub/cdc_stg_pub@cdc02             /* 以釋出者身份登陸目標庫 To create an AutoLog online change source:*/
begin
  dbms_cdc_publish.create_autolog_change_source(
    change_source_name                 => 'emp_dept_src',
    description             => 'Emp and Dept source',
    source_database         => 'ORCL',     --/*source_database是原庫global_name名*/
    first_scn               => '801450',  -- /*first_scn是原庫:f_scn*/
    online_log              => 'n');       -- /*此為非同步歸檔模式-*/
end;
/


--#################特別注意: 如果是非同步線上模式,最後的一個引數可以用'y' 如下:##################################
/* 建立修改源 */
sqlplus cdc_stg_pub/cdc_stg_pub             /* 以釋出者身份登陸目標庫 To create an AutoLog archive change source:*/
begin
  dbms_cdc_publish.create_autolog_change_source(
    change_source_name                             => 'emp_dept_src',
    description                 => 'Emp and Dept source',
    source_database                         => 'CDC01',      
    first_scn                   => '1296139',     
    online_log                  => 'y');        
end;
/
--#################特別注意: 如果是非同步線上模式,最後的一個引數可以用'y' 如上: ##################################




select source_name, 
  source_description, 
  source_type,
  source_database
from change_sources
where source_name = 'EMP_DEPT_SRC';    /* 驗證是否建立成功,注意where中的條件區分大小寫 */

/* 建立編變化集 */
sqlplus cdc_stg_pub/cdc_stg_pub             /* 以釋出者身份登陸目標庫 */
begin
  dbms_cdc_publish.create_change_set(
    change_set_name        => 'emp_dept_set',
    description            => 'Emp and dept change set',
    change_source_name     => 'emp_dept_src',
    stop_on_ddl            => 'y',
    begin_date                           => sysdate,
    end_date                        => sysdate+5);
end;
/

--#################################################
#begin
#  dbms_cdc_publish.create_change_set(
#    change_set_name        => 'emp_dept_set',
#    description            => 'Emp and dept change set',
#    change_source_name     => 'emp_dept_src',
#    stop_on_ddl            => 'y');
#end;
#/
--##########################################################

/* 驗證是否建立成功 */
sqlplus cdc_stg_pub/cdc_stg_pub             /* 以釋出者身份登陸目標庫 */
select set_name,
  set_description,
  change_source_name,
  apply_name,
  queue_name,
  queue_table_name
from change_sets
where publisher = 'CDC_STG_PUB'
  and set_name = 'EMP_DEPT_SET';

/* 檢查CDC */
sqlplus cdc_stg_pub/cdc_stg_pub             /* 以釋出者身份登陸目標庫 */
select app.apply_name,
  q.name,
  app.status,
  qt.queue_table
from dba_apply app,
  dba_queues q,
  dba_queue_tables qt
where app.apply_user = 'CDC_STG_PUB'
  and q.owner = 'CDC_STG_PUB'
  and qt.owner = 'CDC_STG_PUB'
  and q.name = app.queue_name
  and qt.queue_table = q.queue_table
  and app.apply_name like '%EMP_DEPT%';


/* 建立變化表:emp表 */
sqlplus cdc_stg_pub/cdc_stg_pub             /* 以釋出者身份登陸目標庫 */
begin
  dbms_cdc_publish.create_change_table(
    owner                        => 'cdc_stg_pub',
    change_table_name                    => 'emp_ct',
    change_set_name                       => 'emp_dept_set',
    source_schema                           => 'cdc_source',
    source_table                      => 'emp',
    column_type_list                        => 'empno number(4), ename varchar2(10), job varchar2(9), mgr number(4), sal number(7,2), comm number(7,2), deptno number(2)', 
    capture_values                   => 'both',
    rs_id                        => 'y',
    row_id                       => 'n',
    user_id                      => 'n',
    timestamp                           => 'y',
    object_id                    => 'n',
    source_colmap                    => 'n',
    target_colmap                     => 'y',
    options_string               => null);
end;
/

/* 為訂閱者付許可權 */
grant select on emp_ct to cdc_stg_user;                     

/* 建立變化表:dept表 */
sqlplus cdc_stg_pub/cdc_stg_pub             /* 以釋出者身份登陸目標庫 */
begin
  dbms_cdc_publish.create_change_table(
    owner                        => 'cdc_stg_pub',
    change_table_name    => 'dept_ct',
    change_set_name       => 'emp_dept_set',
    source_schema           => 'cdc_source',
    source_table               => 'dept',
    column_type_list         => 'deptno number(2), dname varchar2(14), loc varchar2(13)', 
    capture_values           => 'both',
    rs_id                         => 'y',
    row_id                       => 'n',
    user_id                      => 'n',
    timestamp                  => 'y',
    object_id                    => 'n',
    source_colmap            => 'n',
    target_colmap             => 'y',
    options_string              => null);
end;
/

/* 為訂閱者付許可權 */
grant select on dept_ct to cdc_stg_user;                    

/* 驗證 */
sqlplus cdc_stg_pub/cdc_stg_pub             /* 以釋出者身份登陸目標庫 */
select change_table_name,
  change_set_name,
  source_schema_name,
  source_table_name
from change_tables
where change_table_schema = 'CDC_STG_PUB'
  and change_set_name = 'EMP_DEPT_SET'
order by change_table_name;

select streams_name,
  streams_type,
  table_owner,
  table_name,
  rule_type,
  source_database
from dba_streams_table_rules
where rule_owner = 'CDC_STG_PUB'
  and table_owner = 'CDC_SOURCE'
order by table_name,
  rule_type,
  streams_type;

3.3 啟用CDC
sqlplus cdc_stg_pub/cdc_stg_pub             /* 以釋出者身份登陸目標庫 */
begin
  dbms_cdc_publish.alter_change_set(
    change_set_name => 'EMP_DEPT_SET',
    enable_capture     => 'Y');
end;
/

/* 驗證 */
select apply_name,
  status
from dba_apply
where apply_user = 'CDC_STG_PUB'
  and apply_name like '%EMP_DEPT%';
  
/*find the source tables for which the subscriber has access privileges.*/ 
sqlplus cdc_stg_pub/cdc_stg_pub
SELECT * FROM ALL_SOURCE_TABLES;

/*Find the change set names and columns for which the subscriber has access privileges.*/
sqlplus cdc_stg_pub/cdc_stg_pub
SELECT UNIQUE CHANGE_SET_NAME, COLUMN_NAME, PUB_ID 
FROM ALL_PUBLISHED_COLUMNS 
WHERE SOURCE_SCHEMA_NAME ='CDC_SOURCE' AND SOURCE_TABLE_NAME = 'EMP';  --EMP注意大寫
SELECT UNIQUE CHANGE_SET_NAME, COLUMN_NAME, PUB_ID 
FROM ALL_PUBLISHED_COLUMNS 
WHERE SOURCE_SCHEMA_NAME ='CDC_SOURCE' AND SOURCE_TABLE_NAME = 'DEPT';   --DEPT注意大寫


/* 登陸源庫 */
sqlplus sys/oracle as sysdba
alter system switch logfile;


/* 登陸目標庫,驗證 */
sqlplus cdc_stg_pub/cdc_stg_pub
select capture_name,
  state,
  total_messages_captured
from v$streams_capture
where capture_name like '%EMP_DEPT%';

select group#, thread#, sequence#, archived, status from v$standby_log;


3.4 建立訂閱
sqlplus cdc_stg_user/cdc_stg_user
begin
  dbms_cdc_subscribe.create_subscription(
    change_set_name                              => 'emp_dept_set',
    description                       => 'Emp and dept change subscription',
    subscription_name                 => 'emp_dept_sub1');
end;
/

begin
  dbms_cdc_subscribe.subscribe(
    subscription_name        => 'emp_dept_sub1',
    source_schema            => 'cdc_source',
    source_table             => 'emp',
    column_list              => 'empno, ename, job, mgr, sal, comm, deptno',
    subscriber_view          => 'emp_chg_view');
end;
/

begin
  dbms_cdc_subscribe.subscribe(
    subscription_name        => 'emp_dept_sub1',
    source_schema            => 'cdc_source',
    source_table             => 'dept',
    column_list              => 'deptno, dname, loc',
    subscriber_view          => 'dept_chg_view');
end;
/

/* 啟用訂閱 */
begin
  dbms_cdc_subscribe.activate_subscription(
    subscription_name => 'emp_dept_sub1');
end;
/

/* 驗證 */
select s.subscription_name,
  s.set_name,
  s.description,
  st.source_schema_name,
  st.source_table_name,
  st.view_name,
  sc.column_name
from user_subscriptions s,
  user_subscribed_tables st,
  user_subscribed_columns sc
where s.subscription_name = 'EMP_DEPT_SUB1'
  and st.handle   = s.handle
  and sc.handle   = s.handle
  and st.source_schema_name  = sc.source_schema_name
  and st.source_table_name      = sc.source_table_name
order by st.source_schema_name,
  st.source_table_name, sc.column_name;



4. 查詢變化資料
4.1 檢視變化表中的變化資料
sqlplus cdc_stg_pub/cdc_stg_pub             /* 以釋出者身份登陸目標庫 */
select operation$ operation, to_char(timestamp$, 'dd-mon-yyyy hh24:mi:ss') this_time, empno, ename, sal, comm from emp_ct order by timestamp$;
select operation$ operation, to_char(timestamp$, 'dd-mon-yyyy hh24:mi:ss') this_time, deptno, dname, loc from dept_ct order by timestamp$;

4.2 訂閱者檢視檢視
sqlplus cdc_stg_user/cdc_stg_user             /* 以訂閱者身份登陸目標庫 */
begin
  dbms_cdc_subscribe.extend_window(
    subscription_name => 'emp_dept_sub1');
end;
/

/* 驗證 */
select operation$ operation, to_char(timestamp$, 'dd-mon-yyyy hh24:mi:ss') this_time, empno, ename, sal, comm from emp_chg_view order by timestamp$;

select operation$ operation, to_char(timestamp$, 'dd-mon-yyyy hh24:mi:ss') this_time, deptno, dname, loc from dept_chg_view order by timestamp$;

/* 刪除變化集 */
begin
  dbms_cdc_subscribe.purge_window(
  subscription_name => 'emp_dept_sub1');
end;
/

select operation$ operation, to_char(timestamp$, 'dd-mon-yyyy hh24:mi:ss') this_time, deptno, dname, loc from dept_chg_view order by timestamp$;


注意: standby redo時候,在目標stage site建立路徑,注意和在source site的dest2一致!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9606200/viewspace-2084502/,如需轉載,請註明出處,否則將追究法律責任。

相關文章