Oracle CDC配置案例

 

异步部署

1. 环境的配置准备

1.1.    数据库版本

SQL> select * from v$version;
BANNER
-----------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

1.2.    配置数据库参数

SQL> show parameter job_que
NAME                                 TYPE        VALUE
----------------------------------------------- job_queue_processes                  integer     1000

SQL> show parameter streams_pool_size
NAME                                 TYPE        VALUE
----------------------------------------------- 
streams_pool_size                    big integer 0

SQL> show parameter sga_targ
NAME                                 TYPE        VALUE
----------------------------------------------- 
sga_target                           big integer 0

SQL> show parameter memory_targ
NAME                                 TYPE        VALUE
---------------------------------------------- 
memory_target                        big integer 472M

SQL> show parameter java_pool
NAME                                 TYPE        VALUE
------------------------------------ ----------- 
java_pool_size                       big integer 0
SQL> alter system set streams_pool_size=50m ;

System altered.

SQL> show parameter java_pool

NAME                                 TYPE        VALUE
------------------------------------ ----------- 
java_pool_size                       big integer 0
SQL> alter system set java_pool_size=50m;

System altered.

SQL> show parameter undo_ret

NAME                                 TYPE        VALUE
------------------------------------ ----------- 
undo_retention                       integer     900
SQL> alter system set undo_retention=3600;

System altered.
SQL> show parameter streams_pool
NAME                                 TYPE        VALUE
------------------------------------ ----------- 
streams_pool_size                    big integer 52M

SQL> show parameter java_pool
NAME                                 TYPE        VALUE
------------------------------------ ----------- 
java_pool_size                       big integer 52M

SQL> show parameter undo_re
NAME                                 TYPE        VALUE
------------------------------------ ----------- 
undo_retention                       integer     3600

1.3.    开启归档及补充日志

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u02/archivelog_dest
Oldest online log sequence     401
Next log sequence to archive   403
Current log sequence           403
SQL> alter database force logging;  

Database altered.

SQL> alter database add supplemental log data;  

Database altered.

SQL> select LOG_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN
  2  from v$database;

LOG_MODE     FOR SUPPLEME
------------ --- --------
ARCHIVELOG   YES YES

1.4.    准备测试的表

SQL> conn scott/tiger
Connected.
SQL> create table test(id int,name varchar2(30),mark varchar2(50));

Table created.

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS                          TABLE
DEPT                           TABLE
EMP                            TABLE
GTT                            TABLE
SALGRADE                       TABLE
TEMP                           TABLE
TEST                           TABLE

7 rows selected.

2. 创建发布者和订阅者

2.1.    创建发布者/授权

SQL> create tablespace cdc_tbsp 
datafile '/u02/app/oradata/ORCL/cdc_tbsp01.dbf' size 200m;

Tablespace created.

SQL> create user cdc_publisher identified by cdc_publisher 
default tablespace cdc_tbsp temporary tablespace temp;

User created.
SQL> grant create session TO cdc_publisher;

Grant succeeded.

SQL> grant create table TO cdc_publisher;

Grant succeeded.

SQL> grant create sequence TO cdc_publisher; 

Grant succeeded.

SQL> grant create procedure TO cdc_publisher;  

Grant succeeded.

SQL> grant create any job TO cdc_publisher;  

Grant succeeded.

SQL> grant execute_catalog_role TO cdc_publisher; 

Grant succeeded.

SQL> grant select_catalog_role TO cdc_publisher;  

Grant succeeded.

SQL> grant execute ON dbms_cdc_publish TO cdc_publisher;  

Grant succeeded.

SQL> grant execute ON dbms_lock TO cdc_publisher;  

Grant succeeded.

SQL> GRANT UNLIMITED TABLESPACE TO cdc_publisher;

Grant succeeded.

SQL> execute dbms_streams_auth.grant_admin_privilege('CDC_PUBLISHER');  

PL/SQL procedure successfully completed.

SQL> grant all on scott.test to cdc_publisher;

Grant succeeded.

2.2.    创建订阅者/授权

SQL> create user cdc_subscriber identified by cdc_subscriber
  2  default tablespace cdc_tbsp temporary tablespace temp;

User created.
SQL> grant create session TO cdc_subscriber;

Grant succeeded.

3. 发布/订阅具体数据

3.1.    发布:准备源表(Source Table)

SQL> conn cdc_publisher/cdc_publisher
Connected.
SQL> BEGIN
  2  DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(
TABLE_NAME => 'scott.test');
  3  END;
  4  /

PL/SQL procedure successfully completed.

3.2.    发布:创建变更集(Data Set)

SQL> conn cdc_publisher/cdc_publisher
Connected.
SQL> BEGIN
  2  DBMS_CDC_PUBLISH.CREATE_CHANGE_SET(
  3  change_set_name => 'CDC_SCOTT_TEST',
  4  description => 'Change set for product info',
  5  change_source_name => 'HOTLOG_SOURCE',
  6  stop_on_ddl => 'y',
  7  begin_date => sysdate,
  8  end_date => sysdate+5);
  9  END;
 10  /

PL/SQL procedure successfully completed.

3.3.    发布:创建变更表

SQL> BEGIN
  2     DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(
  3     owner              => 'cdc_publisher',
  4     change_table_name  => 'cdc_test', 
  5     change_set_name    => 'CDC_SCOTT_TEST',
  6     source_schema      => 'SCOTT',
  7     source_table       => 'TEST',
  8     column_type_list   => 'ID NUMBER(5), NAME VARCHAR2(30),MARK VARCHAR2(50)',
  9     capture_values     => 'both',
 10     rs_id              => 'y',
 11     row_id             => 'n',
 12     user_id            => 'n',
 13     timestamp          => 'n',
 14     object_id          => 'n',
 15     source_colmap      => 'n',
 16     target_colmap      => 'y',
 17     options_string     => 'TABLESPACE CDC_TBSP');
 18  END;
 19  /

PL/SQL procedure successfully completed.

3.4.    发布:激活变更集

SQL> BEGIN
  2     DBMS_CDC_PUBLISH.ALTER_CHANGE_SET(
  3        change_set_name => 'CDC_SCOTT_TEST',
  4        enable_capture => 'y');
  5  END;
  6  /

PL/SQL procedure successfully completed.
SQL> grant select on  cdc_test to cdc_subscriber;

Grant succeeded.

备注:其实到此cdc_subscriber用户已经可以检测到scott.test表的变更了

如下测试:

[oracle@std ~]$ sqlplus scott/tiger

SQL*Plus: Release 11.2.0.1.0 Production on Wed Jan 13 17:03:17 2016

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> insert into test values(1,'beijing','11');

1 row created.

SQL> commit;

Commit complete.

SQL> update test set name='shanghai' where id=1;

1 row updated.

SQL> commit;

Commit complete.

SQL> delete test where id=1;

1 row deleted.

SQL> commit;

Commit complete.
SQL> conn cdc_subscriber/cdc_subscriber
Connected.
SQL> select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark
  2  from cdc_publisher.cdc_test t;

OP COMMIT_TIMESTAMP$          ID NAME                           MARK
-- ------------------ ---------- ------------------------------
I  13-JAN-16                   1 beijing                        11
UO 13-JAN-16                   1 beijing                        11
UN 13-JAN-16                   1 shanghai                       11
D  13-JAN-16                   1 shanghai                       11

3.5.    订阅:创建订阅集

SQL> conn cdc_subscriber/cdc_subscriber
Connected.
SQL> BEGIN
  2  dbms_cdc_subscribe.create_subscription(
  3  change_set_name=>'CDC_SCOTT_TEST',
  4  description=>'cdc scott subx', 
  5  subscription_name=>'CDC_SCOTT_SUB');
  6  END;
  7  /

PL/SQL procedure successfully completed.

3.6.    订阅:开始订阅表信息

SQL> BEGIN
  2  dbms_cdc_subscribe.subscribe(
  3  subscription_name=>'CDC_SCOTT_SUB', 
  4  source_schema=>'SCOTT', 
  5  source_table=>'TEST',
  6  column_list=>'ID, NAME,MARK',
  7  subscriber_view=>'TEST_TEMP');
  8  END;
  9  /

PL/SQL procedure successfully completed.
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
TEST_TEMP                      VIEW

3.7.    订阅:激活订阅

SQL> BEGIN
  2  dbms_cdc_subscribe.activate_subscription(
  3  subscription_name=>'CDC_SCOTT_SUB');
  4  END;
  5  /

PL/SQL procedure successfully completed.

3.8.    订阅:扩展订阅窗口

SQL> conn cdc_subscriber/cdc_subscriber  
Connected.
SQL> BEGIN
  2  dbms_cdc_subscribe.extend_window(
  3  subscription_name=>'CDC_SCOTT_SUB');
  4  END;
  5  /

PL/SQL procedure successfully completed.
SQL> conn cdc_subscriber/cdc_subscriber
Connected.
SQL> select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark
  2  from test_temp t; 

OP COMMIT_TIMESTAMP$          ID NAME                           MARK
-- ------------------ ---------- ------------------------------ 
I  13-JAN-16                   1 beijing                        11
UO 13-JAN-16                   1 beijing                        11
UN 13-JAN-16                   1 shanghai                       11
D  13-JAN-16                   1 shanghai                       11

4. 测试订阅发布

4.1.    SCOTT表更改

SQL> conn scott/tiger
Connected.
SQL> insert into test values(2,'renqinglei','aa');

1 row created.

SQL> commit;

Commit complete.

SQL> update test set mark='tt' where id=2;

1 row updated.

SQL> commit;

Commit complete.

SQL> delete test where id=2;

1 row deleted.

SQL> commit;

Commit complete.

4.2.    查询数据发布情况

SQL> conn cdc_publisher/cdc_publisher
Connected.
SQL> select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark
  2  from cdc_publisher.cdc_test t;

OP COMMIT_TIMESTAMP$          ID NAME                           MARK
-- ------------------ ---------- ------------------------------ 
I  13-JAN-16                   1 beijing                        11
UO 13-JAN-16                   1 beijing                        11
UN 13-JAN-16                   1 shanghai                       11
D  13-JAN-16                   1 shanghai                       11
I  13-JAN-16                   2 renqinglei                     aa
UO 13-JAN-16                   2 renqinglei                     aa
UN 13-JAN-16                   2 renqinglei                     tt
D  13-JAN-16                   2 renqinglei                     tt

8 rows selected.

4.3.    查询数据订阅情况

SQL> conn cdc_subscriber/cdc_subscriber
Connected.
SQL> select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark
  2  from test_temp t; 

OP COMMIT_TIMESTAMP$          ID NAME                           MARK
-- ------------------ ---------- ------------------------------
I  13-JAN-16                   1 beijing                        11
UO 13-JAN-16                   1 beijing                        11
UN 13-JAN-16                   1 shanghai                       11
D  13-JAN-16                   1 shanghai                       11

发现订阅的数据没有变化,扩展一下订阅窗口:

SQL> conn cdc_subscriber/cdc_subscriber
Connected.
SQL> BEGIN
  2  dbms_cdc_subscribe.extend_window(
  3  subscription_name=>'CDC_SCOTT_SUB');
  4  END;
  5  /

PL/SQL procedure successfully completed.

SQL> select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark
  2  from test_temp t; 

OP COMMIT_TIMESTAMP$          ID NAME                           MARK
-- ------------------ ---------- ------------------------------
I  13-JAN-16                   1 beijing                        11
UO 13-JAN-16                   1 beijing                        11
UN 13-JAN-16                   1 shanghai                       11
D  13-JAN-16                   1 shanghai                       11
I  13-JAN-16                   2 renqinglei                     aa
UO 13-JAN-16                   2 renqinglei                     aa
UN 13-JAN-16                   2 renqinglei                     tt
D  13-JAN-16                   2 renqinglei                     tt

8 rows selected.

4.4.    清除变更数据集

SQL> conn cdc_subscriber/cdc_subscriber
Connected.
SQL> BEGIN
  2  DBMS_CDC_SUBSCRIBE.PURGE_WINDOW(
  3  subscription_name => 'CDC_SCOTT_SUB');
  4  END;
  5  /

PL/SQL procedure successfully completed.

SQL> select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark
  2  from test_temp t;

no rows selected

4.5.    重新生成变化数据

SQL> conn scott/tiger
Connected.
SQL> insert into test values(3,'shandong','hh');

1 row created.

SQL> insert into test values(4,'diankeyuan','hh');

1 row created.

SQL> commit;

Commit complete.
SQL> conn cdc_publisher/cdc_publisher
Connected.
SQL> select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark
  2  from cdc_publisher.cdc_test t;

OP COMMIT_TIMESTAMP$          ID NAME                           MARK
-- ------------------ ---------- ------------------------------ 
I  13-JAN-16                   1 beijing                        11
UO 13-JAN-16                   1 beijing                        11
UN 13-JAN-16                   1 shanghai                       11
D  13-JAN-16                   1 shanghai                       11
I  13-JAN-16                   2 renqinglei                     aa
UO 13-JAN-16                   2 renqinglei                     aa
UN 13-JAN-16                   2 renqinglei                     tt
D  13-JAN-16                   2 renqinglei                     tt
I  13-JAN-16                   3 shandong                       hh
I  13-JAN-16                   4 diankeyuan                     hh

10 rows selected.
SQL> conn cdc_subscriber/cdc_subscriber
Connected.
SQL> BEGIN
  2  dbms_cdc_subscribe.extend_window(
  3  subscription_name=>'CDC_SCOTT_SUB');
  4  END;
  5  /

PL/SQL procedure successfully completed.

SQL> select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark
  2  from test_temp t;

OP COMMIT_TIMESTAMP$          ID NAME                           MARK
-- ------------------ ---------- ------------------------------ 
I  13-JAN-16                   3 shandong                       hh
I  13-JAN-16                   4 diankeyuan                     hh

4.6.    删除发布的数据

SQL> conn cdc_publisher/cdc_publisher
Connected.
SQL> select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark
  2  from cdc_publisher.cdc_test t;

OP COMMIT_TIMESTAMP$          ID NAME                           MARK
-- ------------------ ---------- ------------------------------ 
I  13-JAN-16                   1 beijing                        11
UO 13-JAN-16                   1 beijing                        11
UN 13-JAN-16                   1 shanghai                       11
D  13-JAN-16                   1 shanghai                       11
I  13-JAN-16                   2 renqinglei                     aa
UO 13-JAN-16                   2 renqinglei                     aa
UN 13-JAN-16                   2 renqinglei                     tt
D  13-JAN-16                   2 renqinglei                     tt
I  13-JAN-16                   3 shandong                       hh
I  13-JAN-16                   4 diankeyuan                     hh

10 rows selected.

SQL> truncate cdc_test;
truncate cdc_test
                *
ERROR at line 1:
ORA-03290: Invalid truncate command - missing CLUSTER or TABLE keyword


SQL> delete cdc_test;

10 rows deleted.

SQL> commit;

Commit complete.

SQL> select t.operation$,t.commit_timestamp$,t.id,t.name,t.mark
  2  from cdc_publisher.cdc_test t;

no rows selected
原文地址:https://www.cnblogs.com/myrunning/p/5329139.html