在关于Change Data Capture(一)中介绍了CDC的一些基本概念和类型。这篇文章主要是通过一个实际的例子来演示实现同步模式的CDC的基本步骤。
一.版本
BANNER
----------------------------------------------------------------------- --
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL / SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for 32 - bit Windows : Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
二.设置发布者
1.首先在source database创建一个用户作为发布者
User created .
2.授予相应的权限
Grant succeeded .
SYS @ ning > grant select_catalog_role to cdcpub ;
Grant succeeded .
SYS @ ning > grant create table to cdcpub ;
Grant succeeded .
SYS @ ning > grant create session to cdcpub ;
Grant succeeded .
SYS @ ning > grant execute on dbms_cdc_publish to cdcpub ;
Grant succeeded .
三.设置初始化参数
同步CDC,需要将java_pool_size设置为合适的大小,估计是其内部是采用java存储过程来实现的。
System altered .
四.发布变化数据
1.例如要发布用户ning下的sales表
Name Null ? Type
---------------------------- -- -------- ----------------
ID NUMBER ( 38 )
PRODUCTID NUMBER ( 38 )
PRICE NUMBER ( 10 , 2 )
QUANTITY NUMBER ( 38 )
2.授予cdcpub用户对于该表的权限
Grant succeeded .
3.创建chang set
2 dbms_cdc_publish . create_change_set (
3 change_set_name => ' ning_sales ' ,
4 description => ' change set for ning.sales ' ,
5 change_source_name => ' SYNC_SOURCE ' ) ;
6 end ;
7 /
PL / SQL procedure successfully completed .
同步CDC的chang source必须是SYNC_SOURCE。
4.创建change table
如果要将change table创建到users表空间
User altered .
SYS @ ning > begin
2 dbms_cdc_publish . create_change_table (
3 owner => ' cdcpub ' ,
4 change_table_name => ' sales_ct ' ,
5 change_set_name => ' ning_sales ' ,
6 source_schema => ' ning ' ,
7 source_table => ' sales ' ,
8 column_type_list => ' id int,productid int,price number(10,2),quantity int ' ,
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 => ' y ' ,
16 target_colmap => ' y ' ,
17 options_string => ' tablespace users ' ) ;
18 end ;
19 /
PL / SQL procedure successfully completed .
创建好的change table定义如下
Name Null ? Type
--------------------------------------- -- -------- ----------------------------
OPERATION $ CHAR ( 2 )
CSCN $ NUMBER
COMMIT_TIMESTAMP $ DATE
RSID $ NUMBER
SOURCE_COLMAP $ RAW ( 128 )
TARGET_COLMAP $ RAW ( 128 )
ID NUMBER ( 38 )
PRODUCTID NUMBER ( 38 )
PRICE NUMBER ( 10 , 2 )
QUANTITY NUMBER ( 38 )
5.将change table的读取权限授予订阅者
先创建一个订阅者帐号
User created .
SYS @ ning > grant create session to cdcsub ;
Grant succeeded .
SYS @ ning > grant create table to cdcsub ;
Grant succeeded .
SYS @ ning > grant select on cdcpub . sales_ct to cdcsub ;
Grant succeeded .
如果这里没有将change table授权给订阅者,那么在后面订阅的时候,就会报错:
ORA-31466: no publications found
ORA-06512: at “SYS.DBMS_CDC_SUBSCRIBE”, line 19
ORA-06512: at line 2
五.订阅变化数据
1.查看可以订阅的源数据表
Connected .
CDCSUB @ ning > select * from all_source_tables ;
SOURCE_SCHEMA_NAME SOURCE_TABLE_NAME
---------------------------- -- ------------------------------
NING SALES
2.查看可以订阅的change set和column
2 from all_published_columns
3 where source_schema_name = ' NING ' and source_table_name = ' SALES ' ;
CHANGE_SET COLUMN_NAME PUB_ID
-------- -- -------------------- ----------
NING_SALES ID 52590
NING_SALES PRICE 52590
NING_SALES PRODUCTID 52590
NING_SALES QUANTITY 52590
3.创建订阅
2 dbms_cdc_subscribe . create_subscription (
3 change_set_name => ' ning_sales ' ,
4 description => ' change data for sales ' ,
5 subscription_name => ' sales_sub ' ) ;
6 end ;
7 /
PL / SQL procedure successfully completed .
4.订阅具体的source table和column
一个订阅可以同时包含同一个change set中的多个source table
2 dbms_cdc_subscribe . subscribe (
3 subscription_name => ' sales_sub ' ,
4 source_schema => ' NING ' ,
5 source_table => ' SALES ' ,
6 column_list => ' id,productid,price,quantity ' ,
7 subscriber_view => ' sales_view ' ) ;
8 end ;
9 /
PL / SQL procedure successfully completed .
订阅会创建一个叫做sales_view的订阅视图,通过该视图,我们可以获得源表的变化数据。
Name Null ? Type
--------------------------------------- -- -------- ----------------------------
OPERATION $ CHAR ( 2 )
CSCN $ NUMBER
COMMIT_TIMESTAMP $ DATE
RSID $ NUMBER
SOURCE_COLMAP $ RAW ( 128 )
TARGET_COLMAP $ RAW ( 128 )
ID NUMBER ( 38 )
PRICE NUMBER ( 10 , 2 )
PRODUCTID NUMBER ( 38 )
QUANTITY NUMBER ( 38 )
5.激活订阅
不管订阅包含一个source table还是多个,只需要执行一次激活即可。
2 dbms_cdc_subscribe . activate_subscription (
3 subscription_name => ' SALES_SUB ' ) ;
4 end ;
5 /
PL / SQL procedure successfully completed .
6.扩展订阅窗口
在源表数据变化后,变化的数据在订阅端需要执行extend_window后才能看见
2 dbms_cdc_subscribe . extend_window (
3 subscription_name => ' SALES_SUB ' ) ;
4 end ;
5 /
PL / SQL procedure successfully completed .
如果是第一次执行该过程,则会在订阅段看到所有的变化数据,以后每次执行都只增加到从上次执行以来的新数据,相当于物化视图的增量刷新。
7.查询订阅视图中的数据
ID PRODUCTID PRICE QUANTITY
-------- -- ---------- ---------- ----------
1 1 20.2 100
2 1 20.2 200
3 2 40.8 50
9.清除当前窗口中的变化数据
如果当前变化数据已经不再需要,可以清除其数据
2 dbms_cdc_subscribe . purge_window (
3 subscription_name => ' SALES_SUB ' ) ;
4 end ;
5 /
PL / SQL procedure successfully completed .
清除后,在订阅视图中就看不到之前的变化数据了
no rows selected
10.停止订阅
2 dbms_cdc_subscribe . drop_subscription (
3 subscription_name => ' SALES_SUB ' ) ;
4 end ;
5 /
PL / SQL procedure successfully completed .
订阅视图也同时被删除
select id , productid , price , quantity from sales_view
*
ERROR at line 1 :
ORA - 00942 : table or view does not exist