Oracle10gR的Change Data Capture (CDC)搭建过程

Oracle10gR2/11gR2官方文档内容

https://docs.oracle.com/cd/E11882_01/server.112/e25554/cdc.htm#DWHSG016
https://docs.oracle.com/cd/B19306_01/server.102/b14223/cdc.htm

源数据库DBA会创建一个用户作为发布者cdc_publisher,在SYS与SYSTEM用户不能被用作变更数据捕获发布者和变更数据捕获发布者不应使用SYSTEM表空间作为其默认表空间。

向发布者授予权限和角色

EXECUTE_CATALOG_ROLE 特权
SELECT_CATALOG_ROLE 特权
CREATE TABLE和CREATE SESSION权限
EXECUTE在DBMS_CDC_PUBLISH
CREATE SEQUENCE权限
被授予 DBA 角色
可以在GRANTEE一个指定DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE的临时数据库DBA发出子程序

为发布者创建默认表空间

异步HotLog 位置必须与源数据库相同,因此硬件,操作系统和Oracle数据库版本与源系统相同。 从当前在线重做日志文件捕获更改数据。随着新交易被提交,更改集将自动填充。 影响源数据库事务对执行补充日志记录的影响最小。额外的源数据库开销来执行更改数据捕获。

系统参数配置

compatible = 10.2.0
java_pool_size = 50000000
job_queue_processes = 2
parallel_max_servers = <current value> + 5
processes = <current value> + 7
sessions = <current value> + 2
streams_pool_size = <current value> + 21 MB
undo_retention = 3600
--修改脚本
alter system set processes= 157 scope=spfile
使用scope=spfile, 修改完成后需要重启数据库
alter system set java_pool_size=50m

数据库日志

Archive log list
select LOG_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN from v$database;

ALTER DATABASE FORCE LOGGING;--FORCE LOGGING日志记录模式
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;--启用补充日志记录。补充日志记录在执行UPDATE操作时将附加列数据放入重做日志文件中。对于任何更改数据捕获源数据库,必须启用数据库级最小补充日志记录:

如何开启归档模式

1)关闭数据库,然后开启数据库到mount状态
SQL>shutdown immediate;
sql>startup mount;
2)开启归档模式
sql>alter database archivelog;
3)开启数据库
sql> alter database open;
sql> archive log list;
sql>archive log start;
关闭归档模式的步骤
  SQL> startup mount;
  SQL> alter database noarchivelog;
SQL> alter database open;
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

ALTER TABLE sh.products
ADD SUPPLEMENTAL LOG GROUP log_group_products
(PROD_ID, PROD_NAME, PROD_LIST_PRICE) ALWAYS;

ALTER TABLE sh.products ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

创建并向发布者授予权限。

create tablespace cdc_tbsp
datafile '/u01/app/oracle/oradata/orcl/cdc_tbsp01.dbf' size 200m;

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

CREATE USER cdc_publisher IDENTIFIED BY cdc_publisher DEFAULT TABLESPACE cdc_tbsp
QUOTA UNLIMITED ON SYSTEM
QUOTA UNLIMITED ON SYSAUX;

GRANT CREATE SESSION TO cdc_publisher;
GRANT CREATE TABLE TO cdc_publisher;
GRANT CREATE TABLESPACE TO cdc_publisher;
GRANT UNLIMITED TABLESPACE TO cdc_publisher;
GRANT SELECT_CATALOG_ROLE TO cdc_publisher;
GRANT EXECUTE_CATALOG_ROLE TO cdc_publisher;
GRANT CREATE SEQUENCE TO cdc_publisher;
GRANT DBA TO cdc_publisher;
GRANT EXECUTE on DBMS_CDC_PUBLISH TO cdc_publisher;

EXECUTE DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(GRANTEE => 'cdc_publisher');

基础配置完成,开始配置CDC过程

准备源表。

源数据库DBA必须通过实例化每个源表来准备源数据库上的源表以进行异步更改数据捕获。实例化每个源表导致底层Oracle Streams环境记录捕获每个源表的更改所需的信息。更改数据捕获必须支持源表结构和列数据类型。
切换到cdc_publisher 用户下执行以后的步骤
BEGIN
DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(TABLE_NAME => 'scott.test2');
END;
/

创建更改集。

发布者使用DBMS_CDC_PUBLISH.CREATE_CHANGE_SET来创建更改集。请注意,当更改数据捕获创建更改集时,还会创建其关联的Oracle Streams捕获和应用进程(但不启动)。
以下示例创建一个调用的更改集CHICAGO_DAILY,它捕获从今天开始的更改,并在5天后停止捕获更改数据。更改集捕获来自预定义HOTLOG_SOURCE更改源的更改
https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_cdcpub.htm#i80091-- 字段的具体意义
BEGIN
DBMS_CDC_PUBLISH.CREATE_CHANGE_SET(
change_set_name => 'CHICAGO_DAILY',
description => 'Change set for product info',
change_source_name => 'HOTLOG_SOURCE',
stop_on_ddl => 'y',
begin_date => sysdate,
end_date => sysdate+5);
END;

创建将包含对源表的更改的更改表。

发布者使用DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE来创建更改表。发布者为要发布的每个源表创建一个或多个更改表,指定应包括哪些列,并指定要捕获的更改数据的前后图像的组合。

以下示例在暂存数据库上创建一个更改表,该更改表捕获对源数据库上的源表所做的更改。该示例使用示例表sh.products作为源表。

BEGIN
DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(
owner => 'cdcpub',
change_table_name => 'test',
change_set_name => 'CHICAGO_DAILY',
source_schema => 'scott',
source_table => 'PRODUCTS',
column_type_list => 'PROD_ID NUMBER(6), PROD_NAME VARCHAR2(50),PROD_LIST_PRICE NUMBER(8,2)',
capture_values => 'both',
rs_id => 'y',
row_id => 'n',
user_id => 'n',
timestamp => 'n',
object_id => 'n',
source_colmap => 'n',
target_colmap => 'y',
options_string => 'TABLESPACE TS_CHICAGO_DAILY');
END;

此语句创建products_ct在更改集中命名的更改表CHICAGO_DAILY。该column_type_list参数标识要由更改表捕获的列。在source_schema和source_table参数标识驻留在源数据库上的架构和源表。
capture_values此语句中的设置表示对于更新操作,更改数据将包含两个单独的行,每行更改:一行将包含更新发生前的行值,另一行将在更新发生后包含行值。
options_string此语句中的参数为更改表指定了一个表空间。(此示例假定发布者以前创建了TS_CHICAGO_DAILY表空间。)

启用更改集。

由于异步更改集在创建时始终被禁用,所以发布者必须更改此更改集以启用它。当启用更改集时,将启动Oracle Streams捕获和应用进程。

BEGIN
DBMS_CDC_PUBLISH.ALTER_CHANGE_SET(
change_set_name => 'CHICAGO_DAILY',
enable_capture => 'y');
END;


实际使用的配置,这里把一些过程封装为存储过程

准备源表(Source Table)

conn cdc_publisher/cdc_publisher
BEGIN
DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(
TABLE_NAME => 'scott.test');
END;
-- 存储过程
call sp_cdc_capture_config('scott.test') ;

CREATE OR REPLACE PROCEDURE sp_cdc_capture_config( CAP_SCHEMA_TBL VARCHAR2) IS
BEGIN
DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(table_name=>CAP_SCHEMA_TBL);
END;

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

conn cdc_publisher/cdc_publisher
BEGIN
DBMS_CDC_PUBLISH.CREATE_CHANGE_SET(
change_set_name => 'CDC_SCOTT_TEST',
description => 'Change set for product info',
change_source_name => 'HOTLOG_SOURCE',
stop_on_ddl => 'n',
begin_date => sysdate,
end_date => sysdate+5);
END;

--存储过程
call sp_cdc_capture_config_set('SCOTT','test')

CREATE OR REPLACE PROCEDURE sp_cdc_capture_config_set( CAP_SCHEMA VARCHAR2,cap_tbl VARCHAR2) aS
cap_sche_tbl varchar2(500);
BEGIN
cap_sche_tbl := 'cdc_'||CAP_SCHEMA||'_'||cap_tbl;
DBMS_CDC_PUBLISH.CREATE_CHANGE_SET(
change_set_name => cap_sche_tbl,

description => 'Change set for product info',
change_source_name => 'HOTLOG_SOURCE',
stop_on_ddl => 'n');
END;

发布:创建变更表

BEGIN
DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(
owner => 'cdc_publisher',
change_table_name => 'cdc_test',
change_set_name => 'CDC_SCOTT_TEST',
source_schema => 'SCOTT',
source_table => 'TEST',
column_type_list => 'ID NUMBER(5), NAME VARCHAR2(30),MARK VARCHAR2(50)',
capture_values => 'both',
rs_id => 'n',
row_id => 'y',
user_id => 'n',
timestamp => 'n',
object_id => 'n',
source_colmap => 'n',
target_colmap => 'y',
options_string => 'TABLESPACE CDC_TBSP');
END;

--存储过程

call sp_cdc_capture_config_table('SCOTT','test','id int ,name varchar(50)')

CREATE OR REPLACE PROCEDURE sp_cdc_capture_config_table( CAP_SCHEMA VARCHAR2,cap_tbl VARCHAR2,column_type_list VARCHAR2) aS
cdc_cap_sche_tbl varchar2(100);
cdc_cap_tbl varchar2(50);
BEGIN
cdc_cap_sche_tbl := 'cdc_'||CAP_SCHEMA||''||cap_tbl;
cdc_cap_tbl := 'cdc
'||cap_tbl;
DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(
owner => 'cdc_publisher',
change_table_name => cdc_cap_tbl,
change_set_name => cdc_cap_sche_tbl,
source_schema => CAP_SCHEMA,
source_table => cap_tbl,
column_type_list => column_type_list ,
capture_values => 'both',
rs_id => 'n',
row_id => 'y',
user_id => 'n',
timestamp => 'n',
object_id => 'n',
source_colmap => 'n',
target_colmap => 'y',
options_string => 'TABLESPACE CDC_TBSP');
END;

发布:激活变更集

BEGIN
DBMS_CDC_PUBLISH.ALTER_CHANGE_SET(
change_set_name => 'CDC_SCOTT_TEST',
enable_capture => 'n');
END;

--存储过程
call sp_cdc_capture_set_active('SCOTT','test')

CREATE OR REPLACE PROCEDURE sp_cdc_capture_set_active( CAP_SCHEMA VARCHAR2,cap_tbl VARCHAR2) aS
cap_sche_tbl varchar2(50);
BEGIN
cap_sche_tbl := 'cdc_'||CAP_SCHEMA||'_'||cap_tbl;
DBMS_CDC_PUBLISH.ALTER_CHANGE_SET(
change_set_name => cap_sche_tbl,
enable_capture => 'y');
END;

查看变更表

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

note:
只能创建一个变更集,一个变更集下拥有多个变更表。先创建变更表之后再激活变更集
相关的系统表 change_sets, change_tables,dba_capture
Please refer the document
http://docs.oracle.com/cd/B19306_01/server.102/b14229/strms_trouble.htm#i1006114
https://twiki.cern.ch/twiki/bin/view/PSSGroup/StreamsOperationsManual

ORA-01280: Fatal Logminer Error
Also ORA-04030: Out of process memory when ...
Check memory consumption
Re-start the capture process
DBMS_CAPTURE_ADM.STOP_CAPTURE('CAPTURE_NAME');
DBMS_CAPTURE_ADM.SET_PARAMETER('CAPTURE_NAME', '_SGA_SIZE','50');
DBMS_CAPTURE_ADM.START_CAPTURE('CAPTURE_NAME');

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 总览 ETL过程中发生了什么? 首先从多个不同的数据源中抽取数据(Extraction),然后传输(transpo...
    姜小明同学阅读 3,461评论 0 51
  • SQLServer2008引入了数据变更捕获功能(后面简称为CDC),所以支持2008后的版本基础信息参考网址基础...
    只有香如故阅读 6,489评论 2 2
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,028评论 0 19
  • 我是一名教师, 只因儿时的仰慕与憧憬, 让教师这一职业成为了我的衣食父母, 如果现在让我重新选择, 我仍然会选择教...
    青梅醉雪阅读 243评论 2 4
  • 最近参加了几个线上写作课程,总的来讲,效果一般都是上课积极,课后消极,对我自己的写作没什么进步。我觉的最大的原因是...
    罗沫沫66阅读 719评论 0 3