美文网首页
Oracle10gR的Change Data Capture (

Oracle10gR的Change Data Capture (

作者: 只有香如故 | 来源:发表于2018-02-08 11:15 被阅读191次

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

    相关文章

      网友评论

          本文标题:Oracle10gR的Change Data Capture (

          本文链接:https://www.haomeiwen.com/subject/fozzzxtx.html