下面运用Performing Synchronous Publishing的方式实现Change Data Capture。
为了实现同步捕获改变数据,publisher必须用预定义的change source, SYNC_SOURCE。publisher可以自行定义新的change sets ,也可以用预定义的change sets,SYNC_SET。如果使用预定于的change sets,可以直接跳到STEP3;
Step 1:设置初始化参数。
java_pool_size = 50000000
如果要问为什么设定这个参数,请查看
http://download.oracle.com/docs/cd/B19306_01/server.102/b14223/cdc.htm#i1025456
里面介绍了使用各种模式配置Change Data Capture需要设定的初始化参数。
SQL> show parameter java
java_pool_size = 50000000
如果要问为什么设定这个参数,请查看
http://download.oracle.com/docs/cd/B19306_01/server.102/b14223/cdc.htm#i1025456
里面介绍了使用各种模式配置Change Data Capture需要设定的初始化参数。
SQL> show parameter java
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
java_max_sessionspace_size integer 0
java_pool_size big integer 48M
java_soft_sessionspace_limit integer 0
------------------------------------ ----------- ------------------------------
java_max_sessionspace_size integer 0
java_pool_size big integer 48M
java_soft_sessionspace_limit integer 0
Step2:创建表空间
SQL> create tablespace ts_cdcpub datafile 'D:/oracle/product/10.2.0/oradata/ocp10g/cdcpubdata.dbf' s
ize 100m;
表空间已创建。
Step3:建立PUBLISHER用户cdcpub,并授权。
CREATE USER cdcpub IDENTIFIED BY cdcpub DEFAULT TABLESPACE ts_cdcpub
QUOTA UNLIMITED ON SYSTEM
QUOTA UNLIMITED ON SYSAUX;
GRANT CREATE SESSION TO cdcpub;
GRANT CREATE TABLE TO cdcpub;
GRANT CREATE TABLESPACE TO cdcpub;
GRANT UNLIMITED TABLESPACE TO cdcpub;
GRANT SELECT_CATALOG_ROLE TO cdcpub;
GRANT EXECUTE_CATALOG_ROLE TO cdcpub;
GRANT ALL ON sh.sales TO cdcpub;
GRANT ALL ON sh.products TO cdcpub;
GRANT EXECUTE ON DBMS_CDC_PUBLISH TO cdcpub;
CREATE USER cdcpub IDENTIFIED BY cdcpub DEFAULT TABLESPACE ts_cdcpub
QUOTA UNLIMITED ON SYSTEM
QUOTA UNLIMITED ON SYSAUX;
GRANT CREATE SESSION TO cdcpub;
GRANT CREATE TABLE TO cdcpub;
GRANT CREATE TABLESPACE TO cdcpub;
GRANT UNLIMITED TABLESPACE TO cdcpub;
GRANT SELECT_CATALOG_ROLE TO cdcpub;
GRANT EXECUTE_CATALOG_ROLE TO cdcpub;
GRANT ALL ON sh.sales TO cdcpub;
GRANT ALL ON sh.products TO cdcpub;
GRANT EXECUTE ON DBMS_CDC_PUBLISH TO cdcpub;
Step4:建立一个change set.名字叫CHICAGO_DAILY。
SQL> BEGIN
2 DBMS_CDC_PUBLISH.CREATE_CHANGE_SET(
3 change_set_name => 'CHICAGO_DAILY',
4 description => 'Change set for sales history info',
5 change_source_name => 'SYNC_SOURCE');
6 END;
7 /
SQL> BEGIN
2 DBMS_CDC_PUBLISH.CREATE_CHANGE_SET(
3 change_set_name => 'CHICAGO_DAILY',
4 description => 'Change set for sales history info',
5 change_source_name => 'SYNC_SOURCE');
6 END;
7 /
PL/SQL 过程已成功完成。
Step5:建立一个change table。名字叫products_ct;
SQL> BEGIN
2 DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(
3 owner => 'cdcpub',
4 change_table_name => 'products_ct',
5 change_set_name => 'CHICAGO_DAILY',
6 source_schema => 'SH',
7 source_table => 'PRODUCTS',
8 column_type_list => 'PROD_ID NUMBER(6),
9 PROD_NAME VARCHAR2(50),
10 PROD_LIST_PRICE NUMBER(8,2)',
11 capture_values => 'both',
12 rs_id => 'y',
13 row_id => 'n',
14 user_id => 'n',
15 timestamp => 'n',
16 object_id => 'n',
17 source_colmap => 'y',
18 target_colmap => 'y',
19 options_string => 'TABLESPACE ts_cdcpub');
20 END;
21 /
SQL> BEGIN
2 DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(
3 owner => 'cdcpub',
4 change_table_name => 'products_ct',
5 change_set_name => 'CHICAGO_DAILY',
6 source_schema => 'SH',
7 source_table => 'PRODUCTS',
8 column_type_list => 'PROD_ID NUMBER(6),
9 PROD_NAME VARCHAR2(50),
10 PROD_LIST_PRICE NUMBER(8,2)',
11 capture_values => 'both',
12 rs_id => 'y',
13 row_id => 'n',
14 user_id => 'n',
15 timestamp => 'n',
16 object_id => 'n',
17 source_colmap => 'y',
18 target_colmap => 'y',
19 options_string => 'TABLESPACE ts_cdcpub');
20 END;
21 /
PL/SQL 过程已成功完成。
Step6:授权subscriber用户可以访问这个change table;
GRANT SELECT ON cdcpub.products_ct TO subscriber1;
GRANT SELECT ON cdcpub.products_ct TO subscriber1;
这样建立一个同步的Publishing就完成了。我们可以做一个试验:
我们可以用cdcpub用户登陆。
SQL> desc products_ct
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
OPERATION$ CHAR(2)
CSCN$ NUMBER
COMMIT_TIMESTAMP$ DATE
RSID$ NUMBER
SOURCE_COLMAP$ RAW(128)
TARGET_COLMAP$ RAW(128)
PROD_ID NUMBER(6)
PROD_NAME VARCHAR2(50)
PROD_LIST_PRICE NUMBER(8,2)
我们可以用cdcpub用户登陆。
SQL> desc products_ct
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
OPERATION$ CHAR(2)
CSCN$ NUMBER
COMMIT_TIMESTAMP$ DATE
RSID$ NUMBER
SOURCE_COLMAP$ RAW(128)
TARGET_COLMAP$ RAW(128)
PROD_ID NUMBER(6)
PROD_NAME VARCHAR2(50)
PROD_LIST_PRICE NUMBER(8,2)
SQL> select * from products_ct;
未选定行
然后我用SH用户登陆
SQL> conn sh/sh;
已连接。
SQL> update products set prod_name ='Laptop carrying case chirs_test' where prod_id=19;
已更新 1 行。
SQL> conn sh/sh;
已连接。
SQL> update products set prod_name ='Laptop carrying case chirs_test' where prod_id=19;
已更新 1 行。
然后我再用cdcpub登陆,并查看products_ct表。
SQL> conn cdcpub/cdcpub;
已连接。
SQL> select t.prod_id ,t.prod_name from products_ct t;
SQL> conn cdcpub/cdcpub;
已连接。
SQL> select t.prod_id ,t.prod_name from products_ct t;
PROD_ID PROD_NAME
---------- --------------------------------------------------
19 Laptop carrying case
19 Laptop carrying case chirs_test
发现已经得到了发生改变的数据。这个表还有其他的字段,大家可以试验一下。
---------- --------------------------------------------------
19 Laptop carrying case
19 Laptop carrying case chirs_test
发现已经得到了发生改变的数据。这个表还有其他的字段,大家可以试验一下。
当我们做任何DML语句的时候,这个表里都会记录相应的改变的数据。