关于同步Oracle CDC的实现步骤
- 格式:docx
- 大小:18.46 KB
- 文档页数:4
关于同步CDC的实现步骤CDCCDC特性是在Oracle9i数据库中引入的。
CDC能够帮助你识别从上次提取之后发生变化的数据。
利用CDC,在对源表进行INSERT、UPDATE或DELETE等操作的同时就可以提取数据,并且变化的数据被保存在数据库的变化表中。
这样就可以捕获发生变化的数据,然后利用数据库视图以一种可控的方式提供给目标系统。
CDC建立订阅者视图来控制目标系统对变化数据的获取。
目标系统是任何需要使用从源系统中捕获的数据的应用程序。
发布者和订阅:CDC体系结构基于发布者/订阅者模型。
发布者捕捉变化数据并提供给订阅者。
订阅者使用从发布者那里获得的变化数据。
通常,CDC系统拥有一个发布者和多个订阅者。
发布者首先需要识别捕获变化数据所需的源表。
然后,它捕捉变化的数据并将其保存在特别创建的变化表中。
它还使订阅者能够控制对变化数据的访问。
订阅者需要清楚自己感兴趣的是哪些变化数据。
一个订阅者可能不会对发布者发布的所有数据都感兴趣。
订阅者需要创建一个订阅者视图来访问经发布者授权可以访问的变化数据。
2.设置CDC环境:1) 确定源表:2) 设置发布者。
3) 创建变化表。
4) 设置订阅者。
5) 订阅源表并激活订阅过程。
6) 设置CDC窗口。
7) 准备订阅者视图。
8) 访问变化表中的数据。
9) 删除订阅者视图,并清除CDC窗口。
10) 重复第6到第9步,以查看新数据。
3.设置发布者发布者是创建和维护变化表的数据库用户。
正如前面提到的,发布者的职责是识别并提取变化数据,并将其提供给订阅者。
要做到这一点,必须给发布者分配以下两个数据库角色:SELECT_CATALOG_ROLEEXECUTE_CATALOG_ROLE为了简单起见,可以设置源表所在用户为发布者,也可以指定任何其他数据库用户为发布者。
在由多个数据库用户拥有的表构成源表的情况下,最好指定另一个用户作为发布者。
在这种情况下,该用户需要在源表上有SELECT权限。
4.创建变化表:每个源表都需要一个变化表。
发布者使用DBMS_LOGMNR_CDC_PUBLISH .CREATE_CHANGE_TABLE过程来创建变化表。
CREATE_CHANGE_TABLE 过程将变化集的名字作为一个变量来传递。
一个变化集是一个变化表的集合。
使用系统生成的变化集:SYNC_SET。
GRANT EXECUTE_CATALOG_ROLE to cdc_publisher;GRANT SELECT_CATALOG_ROLE to cdc_publisher;过程描述:PROCEDURE create_change_table (owner IN VARCHAR2, change_table_name IN VARCHAR2, change_set_name IN VARCHAR2, source_schema IN VARCHAR2, source_table IN VARCHAR2, column_type_list IN VARCHAR2, capture_values IN VARCHAR2, rs_id IN CHAR,row_id IN CHAR,user_id IN CHAR,timestamp IN CHAR,object_id IN CHAR,source_colmap IN CHAR,target_colmap IN CHAR,options_string IN VARCHAR2); 创建变化表:dbms_cdc_publish.create_change_table( 'res_1' ,'cdc_t1','SYNC_SET','res_1' ,'t_1','a1 integer,b1 varchar2(10)' , 'new' ,'n' ,'n' ,'y','y','n','n','n',null );所建立的变化表字段如下:(OPERATION$ CHAR(2),CSCN$ NUMBER,COMMIT_TIMESTAMP$ DATE,USERNAME$ VARCHAR2(30),TIMESTAMP$ DATE,A1 INTEGER,B1 VARCHAR2(10))5.设置订阅者:订阅者必须在源表和变化表上有SELECT权限6.订阅源表并激活订阅过程在典型的CDC环境中会有多个订阅者,每个订阅者只需要订阅自己所需要的表。
此外,订阅者可能不希望看到自己所订阅的表的所有字段。
在可以订阅发布的数据之前,你需要得到一个订阅句柄。
订阅句柄使订阅者能够管理自己感兴趣的变化表和字段。
在Oracle的CDC环境中,一个订阅只能由一个订阅句柄识别,而无论你订阅了多少个表,你只需创建一个订阅句柄。
使用DBMS_LOGMNR_ CDC_SUBSCRIBE.GET_SUBSCRIPTION HANDLE过程就可以得到一个订阅句柄。
这个过程以变量的方式返回句柄值。
可以在会话中定义一个变量来接收来自过程的句柄值。
定义句柄:variable sh_t1 number;EXECUTE DBMS_LOGMNR_CDC_SUBSCRIBE .GET_SUBSCRIPTION_HANDLE(CHANGE_SET=>'SYNC_SET', -DESCRIPTION=>'Change data from t_1.', -SUBSCRIPTION_HANDLE=>:sh_t1);订阅表和字段:EXECUTE DBMS_LOGMNR_CDC_SUBSCRIBE.SUBSCRIBE( -SUBSCRIPTION_HANDLE=>:sh_sales, -SOURCE_SCHEMA=>'res_1', -SOURCE_TABLE=>'t_1', -COLUMN_LIST=>'a1,b1');当指定了希望订阅的表和字段后,你就可以激活你的订阅。
无论订阅多少个表,你都只需要激活订阅一次。
一旦激活了一个订阅,你就不能再将任何其他表或字段添加到你的订阅中。
激活订阅:EXECUTE DBMS_LOGMNR_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION( - SUBSCRIPTION_HANDLE=>:sh_t1);7.设置CDC窗口源表中的数据不断变化(插入、更新或删除) ,而不管对变化数据的订阅。
因此,订阅要设置(扩展)CDC窗口,通过该窗口可以看到任何变化。
设置CDC窗口:EXECUTE -DBMS_LOGMNR_CDC_SUBSCRIBE.EXTEND_WINDOW( -SUBSCRIPTION_HANDLE=>:sh_sales);当你执行了EXTEND_WINDOW过程后,如果你没有清除窗口并再次对它进行扩展,那么对源表所做的改变在订阅中就无法看到。
8.准备一个订阅者视图一旦你设置了CDC窗口,你就需要为订阅者准备一个视图,以便订阅者能够看到变化数据。
你需要为订阅者订阅的每个源表准备一个视图。
DBMS_LOGMNR_CDC_SUBSCRIBE.PREPARE_SUBSCRIBER_VIEW过程可以被用来准备一个订阅者视图。
你需要将订阅句柄、源模式名和源表名传递给该过程,该过程就会以变量的方式返回订阅者视图的名字。
variable sv_t1 varchar2(30);EXECUTE -DBMS_LOGMNR_CDC_SUBSCRIBE.PREPARE_SUBSCRIBER_VIEW( -SUBSCRIPTION_HANDLE =>:sh_t1, -SOURCE_SCHEMA=>'res_1', -SOURCE_TABLE=>'t_1', -VIEW_NAME => :sv_t1); --返回值9.访问变化表中的数据订阅者视图包含你所需要的变化数据。
它还包含使用变化数据所需的其他一些附加信息,字段OPERATION$ 表示变化是INSERT、UPDATE还是DELETE。
字段CSCN$、COMMIT_TIMESTAMP$、TIMESTAMP$和 USERNAME$表示是谁在源表中做的改变以及是何时做的。
其他字段是源表中订阅的字段。
你可以使用SELECT语句查看订阅者视图中的数据。
10.删除订阅者视图,清除CDC窗口当你了解并提取了变化数据并且不再需要在订阅者视图中显示变化数据时,你需要删除订阅者视图并清除CDC窗口,这样你才可以建立(扩展)新的窗口来查看新的变化数据。
删除已有的订阅者视图。
使用DBMS_LOGMNR_CDC_SUBSCRIBE.DROP_SUBSCRIBER_VIEW过程。
在你可以清除旧的CDC窗口并建立新窗口之前,你需要逐个删除子订阅的每个订阅者视图。
EXECUTE -DBMS_LOGMNR_CDC_SUBSCRIBE.DROP_SUBSCRIBER_VIEW( -SUBSCRIPTION_HANDLE =>:sh_t1, -SOURCE_SCHEMA=>'res_1', -SOURCE_TABLE=>'t_1');删除订阅者视图后,你就可以清除窗口。
使用DBMS_LOGMNR_CDC_SUBSCRIBE.PURGE_WINDOW过程来清除窗口:EXECUTE -DBMS_LOGMNR_CDC_SUBSCRIBE.PURGE_WINDOW( -SUBSCRIPTION_HANDLE=>:sh_sales);11.重复第7到第10步以查看新数据要定期提取变化数据,你需要重复第7到第10步。
如果你每日都要提取变化数据,你的每日(最好在晚上)数据提取工作将包括建立订阅窗口(EXTEND_WINDOW)、准备订阅者视图(PREPARE_SUBSCRIBER_VIEW)、从订阅者视图中访问数据、删除订阅者视图 (DROP_SUBSCRIBER_VIEW)、清除窗口(PURGE_WINDOW)。