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

Oracle10gR2/11gR2官方文檔內(nèi)容

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

源數(shù)據(jù)庫DBA會創(chuàng)建一個用戶作為發(fā)布者cdc_publisher,在SYS與SYSTEM用戶不能被用作變更數(shù)據(jù)捕獲發(fā)布者和變更數(shù)據(jù)捕獲發(fā)布者不應(yīng)使用SYSTEM表空間作為其默認表空間。

向發(fā)布者授予權(quán)限和角色

EXECUTE_CATALOG_ROLE 特權(quán)
SELECT_CATALOG_ROLE 特權(quán)
CREATE TABLE和CREATE SESSION權(quán)限
EXECUTE在DBMS_CDC_PUBLISH
CREATE SEQUENCE權(quán)限
被授予 DBA 角色
可以在GRANTEE一個指定DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE的臨時數(shù)據(jù)庫DBA發(fā)出子程序

為發(fā)布者創(chuàng)建默認表空間

異步HotLog 位置必須與源數(shù)據(jù)庫相同,因此硬件,操作系統(tǒng)和Oracle數(shù)據(jù)庫版本與源系統(tǒng)相同。 從當前在線重做日志文件捕獲更改數(shù)據(jù)。隨著新交易被提交,更改集將自動填充。 影響源數(shù)據(jù)庫事務(wù)對執(zhí)行補充日志記錄的影響最小。額外的源數(shù)據(jù)庫開銷來執(zhí)行更改數(shù)據(jù)捕獲。

系統(tǒng)參數(shù)配置

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, 修改完成后需要重啟數(shù)據(jù)庫
alter system set java_pool_size=50m

數(shù)據(jù)庫日志

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;--啟用補充日志記錄。補充日志記錄在執(zhí)行UPDATE操作時將附加列數(shù)據(jù)放入重做日志文件中。對于任何更改數(shù)據(jù)捕獲源數(shù)據(jù)庫,必須啟用數(shù)據(jù)庫級最小補充日志記錄:

如何開啟歸檔模式

1)關(guān)閉數(shù)據(jù)庫,然后開啟數(shù)據(jù)庫到mount狀態(tài)
SQL>shutdown immediate;
sql>startup mount;
2)開啟歸檔模式
sql>alter database archivelog;
3)開啟數(shù)據(jù)庫
sql> alter database open;
sql> archive log list;
sql>archive log start;
關(guān)閉歸檔模式的步驟
  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;

創(chuàng)建并向發(fā)布者授予權(quán)限。

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');

基礎(chǔ)配置完成,開始配置CDC過程

準備源表。

源數(shù)據(jù)庫DBA必須通過實例化每個源表來準備源數(shù)據(jù)庫上的源表以進行異步更改數(shù)據(jù)捕獲。實例化每個源表導(dǎo)致底層Oracle Streams環(huán)境記錄捕獲每個源表的更改所需的信息。更改數(shù)據(jù)捕獲必須支持源表結(jié)構(gòu)和列數(shù)據(jù)類型。
切換到cdc_publisher 用戶下執(zhí)行以后的步驟
BEGIN
DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(TABLE_NAME => 'scott.test2');
END;
/

創(chuàng)建更改集。

發(fā)布者使用DBMS_CDC_PUBLISH.CREATE_CHANGE_SET來創(chuàng)建更改集。請注意,當更改數(shù)據(jù)捕獲創(chuàng)建更改集時,還會創(chuàng)建其關(guān)聯(lián)的Oracle Streams捕獲和應(yīng)用進程(但不啟動)。
以下示例創(chuàng)建一個調(diào)用的更改集CHICAGO_DAILY,它捕獲從今天開始的更改,并在5天后停止捕獲更改數(shù)據(jù)。更改集捕獲來自預(yù)定義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;

創(chuàng)建將包含對源表的更改的更改表。

發(fā)布者使用DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE來創(chuàng)建更改表。發(fā)布者為要發(fā)布的每個源表創(chuàng)建一個或多個更改表,指定應(yīng)包括哪些列,并指定要捕獲的更改數(shù)據(jù)的前后圖像的組合。

以下示例在暫存數(shù)據(jù)庫上創(chuàng)建一個更改表,該更改表捕獲對源數(shù)據(jù)庫上的源表所做的更改。該示例使用示例表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;

此語句創(chuàng)建products_ct在更改集中命名的更改表CHICAGO_DAILY。該column_type_list參數(shù)標識要由更改表捕獲的列。在source_schema和source_table參數(shù)標識駐留在源數(shù)據(jù)庫上的架構(gòu)和源表。
capture_values此語句中的設(shè)置表示對于更新操作,更改數(shù)據(jù)將包含兩個單獨的行,每行更改:一行將包含更新發(fā)生前的行值,另一行將在更新發(fā)生后包含行值。
options_string此語句中的參數(shù)為更改表指定了一個表空間。(此示例假定發(fā)布者以前創(chuàng)建了TS_CHICAGO_DAILY表空間。)

啟用更改集。

由于異步更改集在創(chuàng)建時始終被禁用,所以發(fā)布者必須更改此更改集以啟用它。當啟用更改集時,將啟動Oracle Streams捕獲和應(yīng)用進程。

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;

發(fā)布:創(chuàng)建變更集(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;

發(fā)布:創(chuàng)建變更表

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;

發(fā)布:激活變更集

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:
只能創(chuàng)建一個變更集,一個變更集下?lián)碛卸鄠€變更表。先創(chuàng)建變更表之后再激活變更集
相關(guān)的系統(tǒng)表 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');

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 總覽 ETL過程中發(fā)生了什么? 首先從多個不同的數(shù)據(jù)源中抽取數(shù)據(jù)(Extraction),然后傳輸(transpo...
    姜小明同學閱讀 3,720評論 0 51
  • SQLServer2008引入了數(shù)據(jù)變更捕獲功能(后面簡稱為CDC),所以支持2008后的版本基礎(chǔ)信息參考網(wǎng)址基礎(chǔ)...
    只有香如故閱讀 7,226評論 2 2
  • 什么是數(shù)據(jù)庫? 數(shù)據(jù)庫是存儲數(shù)據(jù)的集合的單獨的應(yīng)用程序。每個數(shù)據(jù)庫具有一個或多個不同的API,用于創(chuàng)建,訪問,管理...
    chen_000閱讀 4,151評論 0 19
  • 我是一名教師, 只因兒時的仰慕與憧憬, 讓教師這一職業(yè)成為了我的衣食父母, 如果現(xiàn)在讓我重新選擇, 我仍然會選擇教...
    青梅醉雪閱讀 294評論 2 4
  • 最近參加了幾個線上寫作課程,總的來講,效果一般都是上課積極,課后消極,對我自己的寫作沒什么進步。我覺的最大的原因是...
    羅沫沫66閱讀 800評論 0 3

友情鏈接更多精彩內(nèi)容