• 关于Change Data Capture(五)Oracle CDC Autolog online 例子


    1.cdc 模式在源库是集群的情况下! 源库的
    log_archive_dest_2='SERVICE=alcdcstg lgwr async optional noregister reopen=5 valid_for=(online_logfile,primary_role) sid=’1’'
    log_archive_dest_2='SERVICE=alcdcstg lgwr async optional noregister reopen=5 valid_for=(online_logfile,primary_role) sid=’2’'

    一.CDC autolog online


    1.前提条件:
    (1).数据库版本必须是企业版.
    (2).源库和中间库所在的操作系统版本必须相同.
    (3).源库和中间库的SYS口令必须相同.
    (4).源库和中间库可以通过tnsnames.ora互相访问.

    =============================================================================================

    2.数据库参数配置:
    (1).stagdb端:
    --开启本地归档的路径 和 接受远程归档或远程redo日志的路径:
    alter system set global_names=true;
    alter system set java_pool_size=50M;
    alter system set streams_pool_size=50M;
    alter system set remote_login_passwordfile=shared scope=spfile;
    alter system set log_archive_dest_1='LOCATION=/u01/oracle/oradata/hua/archivelog mandatory reopen=5 valid_for=(online_logfile,primary_role)';
    alter system set log_archive_dest_2='LOCATION=/u01/oracle/oradata/hua/staglog mandatory valid_for=(standby_logfile,primary_role)'; 
     --将stagdb置于归档模式:
    shutdown immediate;
    startup mount;
    alter database archivelog ;
    alter database open ;
    alter system switch logfile;
    --在stagdb中添加standby logfile,用来接收源端传输过来的日志,所以stagdb的standby logfile个数应该大于源端的online redo个数.每个standby logfile的大小应该>=源湍的online log大小.
    alter database add standby logfile group 5 ('<path to standby redo log>') size ***M;
    ......

    (2).源端:
    --设置本地归档和远程归档:
    alter system set remote_login_passwordfile=shared scope=spfile;
    alter system set log_archive_dest_1='LOCATION=/u01/oracle/oradata/yun/archivelog';
    alter system set log_archive_dest_2='SERVICE=hua lgwr async optional noregister reopen=5 valid_for=(online_logfile,primary_role)';
    --开归档,force logging,附加日志:
    shutdown immediate;
    startup mount;
    alter database archivelog;
    alter database open ;
    alter system switch logfile;
    alter database add supplemental log data (primary key, unique index) columns;
    alter database force logging;
    =============================================================================================

    3.创建用户:
    (1).源端:
    conn sys/oracleabcd@yun as sysdba

    drop user cdc_admin cascade;

    create user cdc_admin identified by cdc_admin;
    grant create session to cdc_admin;
    grant create table to cdc_admin;
    grant create tablespace to cdc_admin;
    grant unlimited tablespace to cdc_admin;
    grant select_catalog_role to cdc_admin;
    grant execute_catalog_role to cdc_admin;
    grant execute on dbms_cdc_publish to cdc_admin;

    (2).stagdb端:
    conn sys/oracleabcd@hua as sysdba

    drop user cdc_admin cascade;

    create user cdc_admin identified by cdc_admin;
    grant create session to cdc_admin;
    grant create table to cdc_admin;
    grant create tablespace to cdc_admin;
    grant create sequence to cdc_admin;
    grant select_catalog_role to cdc_admin;
    grant execute_catalog_role to cdc_admin;
    grant unlimited tablespace to cdc_admin;
    grant select_catalog_role to cdc_admin;
    grant execute_catalog_role to cdc_admin;
    grant connect, resource, dba to cdc_admin;
    grant execute on dbms_cdc_publish to cdc_admin;
    execute dbms_streams_auth.grant_admin_privilege(grantee => 'cdc_admin');

    =============================================================================================
    4.配置源数据库:
    (1).创建测试表:
    -- create source table.
    connect CDC_ADMIN/CDC_ADMIN@yun

    CREATE TABLE CDC_HEARTBEAT_DW
    (
    CDC_NAME VARCHAR2(128) CONSTRAINT CHB_COL01_NN NOT NULL,
    LATEST_DATETIME TIMESTAMP(6) DEFAULT SYSTIMESTAMP CONSTRAINT CHB_COL02_NN NOT NULL
    );

    alter table CDC_HEARTBEAT_DW add constraint pk_CDC_HEARTBEAT_DW primary key(CDC_NAME) using index;

    alter Table cdc_heartbeat_dw ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

    (2).查看记录的SCN:
    -- Run the following and record the SCN.

    conn sys/oracleabcd@yun as sysdba

    SET SERVEROUTPUT ON
    DECLARE
    l_logminer_scn NUMBER;
    BEGIN
    dbms_capture_adm.build ( l_logminer_scn );
    DBMS_OUTPUT.PUT_LINE('SCN: '|| l_logminer_scn);
    END;
    /

    eg: 12045675269343

    (3).将源表实例化:
    -- Prepare table for instantiation.

    conn sys/oracleabcd@yun as sysdba

    EXECUTE dbms_capture_adm.prepare_table_instantiation ( 'CDC_ADMIN.CDC_HEARTBEAT_DW' );

    (4).查看源端的global_name:
    conn sys/oracleabcd@yun as sysdba

    select global_name from global_name ;

    =============================================================================================

    5.配置stagdb:

    -- create Change source
    conn CDC_ADMIN/CDC_ADMIN@hua
    begin
    dbms_cdc_publish.create_autolog_change_source(
    change_source_name => 'dw',
    description => 'Source Database is yun',
    source_database => 'yun',
    first_scn => 12045675269343,
    online_log => 'y');
    end;
    /
    参数说明:
    The source_database parameter has to have the global_name for the source database.
    first_scn must be the value you captured from the source database.

    -- create change set
    begin
    dbms_cdc_publish.create_change_set(
    change_set_name => 'CS05',
    description => 'Source Database is SDTAIS with change set CS05',
    change_source_name => 'dw',
    stop_on_ddl => 'y');
    end;
    /

    -- Create change table.
    begin
    dbms_cdc_publish.create_change_table(
    owner => 'CDC_ADMIN',
    change_table_name => 'CT_CDC_HEARTBEAT_CS05',
    change_set_name => 'CS05',
    source_schema => 'CDC_ADMIN',
    source_table => 'CDC_HEARTBEAT_DW',
    column_type_list => 'CDC_NAME VARCHAR2(128), LATEST_DATETIME TIMESTAMP(6)',
    capture_values => 'both',
    rs_id => 'y',
    row_id => 'n',
    user_id => 'n',
    timestamp => 'y',
    object_id => 'n',
    source_colmap => 'n',
    target_colmap => 'y',
    options_string => null) ;
    end ;
    /
    说明:在调用create_change_table时需要JVM,如果stage数据库未安装JVM,则会报错.最好在源端和目标端都安装JVM.


    -- alter few tuning parameters:
    EXECUTE dbms_capture_adm.alter_capture( capture_name => 'CDC$C_CS05', checkpoint_retention_time => 1 );
    EXECUTE dbms_capture_adm.set_parameter( capture_name => 'CDC$C_CS05', parameter => 'DISABLE_ON_LIMIT', value => 'Y');
    EXECUTE dbms_capture_adm.set_parameter( capture_name => 'CDC$C_CS05', parameter => 'MAXIMUM_SCN', value => 'INFINITE');
    EXECUTE dbms_apply_adm.set_parameter( apply_name => 'CDC$A_CS05', parameter => 'COMMIT_SERIALIZATION', value => 'NONE');
    EXECUTE dbms_apply_adm.set_parameter( apply_name => 'CDC$A_CS05', parameter => 'DISABLE_ON_ERROR', value => 'Y');
    EXECUTE dbms_apply_adm.set_parameter( apply_name => 'CDC$A_CS05', parameter => 'DISABLE_ON_LIMIT', value => 'Y');
    EXECUTE dbms_apply_adm.set_parameter( apply_name => 'CDC$A_CS05', parameter => 'PARALLELISM', value => '1');
    EXECUTE dbms_apply_adm.set_parameter( apply_name => 'CDC$A_CS05', parameter => '_DYNAMIC_STMTS', value => 'Y');
    EXECUTE dbms_apply_adm.set_parameter( apply_name => 'CDC$A_CS05', parameter => '_HASH_TABLE_SIZE', value => '1000000');
    EXECUTE dbms_apply_adm.set_parameter( apply_name => 'CDC$A_CS05', parameter => '_TXN_BUFFER_SIZE', value => '10');


    -- Active change_set:
    begin
    dbms_cdc_publish.alter_change_set(
    change_set_name=>'CS05',
    enable_capture=>'y');
    end;
    /

    =============================================================================================
    5.源端切换日志,将源端的数据字典传输至stagdb,让捕获进程初始化:
    -- switch logfile:
    alter system switch logfile;
    =============================================================================================

    6.测试:

    connect sys/oracleabcd@yun as sysdba

    INSERT INTO cdc_heartbeat_dw( CDC_NAME, LATEST_DATETIME ) VALUES ( 'Iddfdfd2st', SYSDATE );
    commit;


    ALTER SYSTEM archive log current;

    conn CDC_ADMIN/CDC_ADMIN@hua
    select count(*) from CT_CDC_HEARTBEAT_CS05;
    select * from CT_CDC_HEARTBEAT_CS05;

    ===============================================================================================

    7.配置验证:
    1.验证change source是否已经创建成功,如果是 autolog online模式,则source_type的值为AUTOLOG ONLINE:
    select source_name, source_description, source_type, source_database
      from change_sources
    where source_name = 'DW';

    2.验证change set:
        change set will create an associated, still disabled, streams apply process, an apply queue and apply queue table.
    select set_name,
           set_description,
           change_source_name,
           apply_name,
           queue_name,
           queue_table_name
      from change_sets
    where set_name = 'CS05';

    --检查底层的stream apply进程的定义:
    select app.apply_name, q.name, app.status, qt.queue_table
      from dba_apply app, dba_queues q, dba_queue_tables qt
    where app.apply_user = 'CDC_ADMIN'
       and q.owner = 'CDC_ADMIN'
       and qt.owner = 'CDC_ADMIN'
       and q.name = app.queue_name
       and qt.queue_table = q.queue_table
    该语句会显示底层streams的apply进程的状态.

    3.验证change table:
         change tables will creates the Streams apply rules as well as the Streams capture rules on the staging database.
    select change_table_name,
           change_set_name,
           source_schema_name,
           source_table_name
      from change_tables
    where change_table_schema = 'CDC_ADMIN'
    order by change_table_name;

    --检查底层的streams capture和apply的规则:
    select streams_name,
           streams_type,
           table_owner,
           table_name,
           rule_type,
           source_database
      from dba_streams_table_rules
    where rule_owner = 'CDC_ADMIN'
    order by table_name, rule_type, streams_type;
    说明:
        至此,底层的streams配置完成,但capture、propagation、apply进程仍是inactive状态.

    4.当change set激活后,检查apply进程的状态是否为enable:
    select apply_name, status from dba_apply where apply_user = 'CDC_ADMIN';

    5.检查capture的状态:
    select capture_name, state, total_messages_captured from v$streams_capture;
    说明:
        STATE can show several values until it shows CAPTURING CHANGES. Until state is CAPTURING CHANGES you will not see the value for TOTAL_MESSAGES_CAPTURED increase.

    6.检查autolog online是否正确的被激活:
    select group#, thread#, sequence#, archived, status from v$standby_log;
    说明:
        如果autolog online正确的被激活,则至少有一个standby logfile的状态为ACTIVE.

    ===============================================================================================
    说明: autolog online方式在10.2.0.4基于AIX,在创建change set时报遇到BUG. BUG:11768445.

  • 相关阅读:
    8.ps输出属性-----状态
    洛谷P1057 传球游戏
    动态规划
    洛谷P1192 台阶问题
    最大公约数和最小公倍数
    C++ memcpy()函数用法
    next_permutation(a,a+n)
    std::ios::sync_with_stdio(false);
    让计算机很快地求出a^b%c;
    洛谷P1433 吃奶酪
  • 原文地址:https://www.cnblogs.com/HondaHsu/p/2428765.html
Copyright © 2020-2023  润新知