表级单向流环境部署

描述一个最简单的流配置,表级单向流环境部署。

流机制环境准备:http://yangtingkun.itpub.net/post/468/504543

 

 

源数据库和目标数据库都根据上面的文章部署好流环境,建立STRMADMIN用户,建立目录和数据库链。

SQL> CONN YANGTK/YANGTK@192.25.1.100/YANGTK.COMPUTE
已连接。
SQL> CREATE TABLE T_STREAM
  2  AS SELECT ROWNUM ID,
  3  A.*
  4  FROM DBA_OBJECTS A;

表已创建。

SQL> ALTER TABLE T_STREAM ADD CONSTRAINT PK_T_STREAM
  2  PRIMARY KEY (ID);

表已更改。

首先在源数据库上建立流复制的表,下面利用流管理员用户STRADMIN建立所需的QUEUE

SQL> CONN STRMADMIN/STRMADMIN@192.25.1.100/YANGTK.COMPUTE
已连接。
SQL> SELECT DB_LINK FROM USER_DB_LINKS;

DB_LINK
----------------------------------------------------------------
STREAM1.COMPUTE

SQL> SELECT GLOBAL_NAME FROM GLOBAL_NAME@STREAM1.COMPUTE;

GLOBAL_NAME
----------------------------------------------------------------
STREAM1.COMPUTE

SQL> EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE

PL/SQL 过程已成功完成。

连接到目标数据库,同样建立队列:

SQL> CONN STRMADMIN/STRMADMIN@192.25.1.100/STREAM1.COMPUTE
已连接。
SQL> SELECT DB_LINK FROM USER_DB_LINKS;

DB_LINK
------------------------------------------------------------------
YANGTK.COMPUTE

SQL> SELECT GLOBAL_NAME FROM GLOBAL_NAME@YANGTK.COMPUTE;

GLOBAL_NAME
------------------------------------------------------------------
YANGTK.COMPUTE

SQL> EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE

PL/SQL 过程已成功完成。

连接到源数据库,建立传播机制:

SQL> CONN STRMADMIN/STRMADMIN@192.25.1.100/YANGTK.COMPUTE
已连接。
SQL> BEGIN
  2   DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(
  3    TABLE_NAME => 'YANGTK.T_STREAM',
  4    STREAMS_NAME => 'TABLE_SINGLE_STREAM',
  5    SOURCE_QUEUE_NAME => 'STRMADMIN.STREAMS_QUEUE',
  6    DESTINATION_QUEUE_NAME => 'STRMADMIN.STREAMS_QUEUE@STREAM1.COMPUTE',
  7    INCLUDE_DML => TRUE,
  8    INCLUDE_DDL => TRUE,
  9    SOURCE_DATABASE => 'YANGTK.COMPUTE',
 10    INCLUSION_RULE => TRUE,
 11    QUEUE_TO_QUEUE => TRUE);
 12  END;
 13  /

PL/SQL 过程已成功完成。

下面建立捕获机制:

SQL> BEGIN
  2   DBMS_STREAMS_ADM.ADD_TABLE_RULES(
  3    TABLE_NAME => 'YANGTK.T_STREAM',
  4    STREAMS_TYPE => 'CAPTURE',
  5    STREAMS_NAME => 'CAPTURE_TABLE',
  6    QUEUE_NAME => 'STRMADMIN.STREAMS_QUEUE',
  7    INCLUDE_DML => TRUE,
  8    INCLUDE_DDL => TRUE,
  9    INCLUSION_RULE => TRUE);
 10  END;
 11  /

PL/SQL 过程已成功完成。

下面需要在目标数据库上设置实体化SCN。如果要复制的表在目标端不存在,可以有多种方法来实现表的复制并进行实体化,这里为了简化例子,直接在目标数据库上通过CREATE TABLE AS SELECT方式建立复制表,这样被复制表在源数据库和目标数据库就处于数据一致的状态:

SQL> CONN YANGTK/YANGTK@192.25.1.100/STREAM1.COMPUTE
已连接。
SQL> CREATE DATABASE LINK YANGTK.COMPUTE USING 'YANGTK';

数据库链接已创建。

SQL> CREATE TABLE T_STREAM AS
  2  SELECT *
  3  FROM T_STREAM@YANGTK.COMPUTE;

表已创建。

SQL> ALTER TABLE T_STREAM ADD CONSTRAINT PK_T_STREAM
  2  PRIMARY KEY (ID);

表已更改。

下面在源数据库获取当前的SCN,并将这个SCN设置到目标数据库:

SQL> CONN STRMADMIN/STRMADMIN@192.25.1.100/YANGTK.COMPUTE
已连接。
SQL> DECLARE
  2   V_SCN NUMBER := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;
  3  BEGIN
  4   DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@STREAM1.COMPUTE(
  5    SOURCE_OBJECT_NAME => 'YANGTK.T_STREAM',
  6    SOURCE_DATABASE_NAME => 'YANGTK.COMPUTE',
  7    INSTANTIATION_SCN => V_SCN);
  8  END;
  9  /

PL/SQL 过程已成功完成。

下面在目标数据库建立应用机制:

SQL> CONN STRMADMIN/STRMADMIN@192.25.1.100/STREAM1.COMPUTE
已连接。
SQL> BEGIN
  2   DBMS_STREAMS_ADM.ADD_TABLE_RULES(
  3    TABLE_NAME => 'YANGTK.T_STREAM',
  4    STREAMS_TYPE => 'APPLY',
  5    STREAMS_NAME => 'APPLY_TABLE',
  6    QUEUE_NAME => 'STRMADMIN.STREAMS_QUEUE',
  7    INCLUDE_DML => TRUE,
  8    INCLUDE_DDL => TRUE,
  9    SOURCE_DATABASE => 'YANGTK.COMPUTE',
 10    INCLUSION_RULE => TRUE);
 11  END;
 12  /

PL/SQL 过程已成功完成。

下面设置APPLY进程的参数,并启动应用进程:

SQL> BEGIN
  2   DBMS_APPLY_ADM.SET_PARAMETER(
  3    APPLY_NAME => 'APPLY_TABLE',
  4    PARAMETER => 'DISABLE_ON_ERROR',
  5    VALUE => 'N');
  6  END;
  7  /

PL/SQL 过程已成功完成。

SQL> BEGIN
  2   DBMS_APPLY_ADM.START_APPLY(APPLY_NAME => 'APPLY_TABLE');
  3  END;
  4  /

PL/SQL 过程已成功完成。

最后在源数据库启动捕获进程:

SQL> CONN STRMADMIN/STRMADMIN@192.25.1.100/YANGTK.COMPUTE
已连接。
SQL> BEGIN
  2   DBMS_CAPTURE_ADM.START_CAPTURE(CAPTURE_NAME => 'CAPTURE_TABLE');
  3  END;
  4  /

PL/SQL 过程已成功完成。

至此,表级单向的流环境配置完成,下面检查一下流环境是否工作正常。

在源数据库修改记录和表结构:

SQL> CONN YANGTK/YANGTK@192.25.1.100/YANGTK.COMPUTE
已连接。
SQL> SELECT COUNT(*) FROM T_STREAM;

  COUNT(*)
----------
     49958

SQL> DELETE T_STREAM WHERE ID = 1;

已删除 1 行。

SQL> SELECT DATA_DEFAULT
  2  FROM USER_TAB_COLUMNS
  3  WHERE TABLE_NAME = 'T_STREAM'
  4  AND COLUMN_NAME = 'CREATED';

DATA_DEFAULT
------------------------------------------------------------


SQL> ALTER TABLE T_STREAM MODIFY CREATED DEFAULT SYSDATE;

表已更改。

SQL> SELECT DATA_DEFAULT
  2  FROM USER_TAB_COLUMNS
  3  WHERE TABLE_NAME = 'T_STREAM'
  4  AND COLUMN_NAME = 'CREATED';

DATA_DEFAULT
------------------------------------------------------------
SYSDATE

SQL> INSERT INTO T_STREAM
  2  (ID, OWNER, OBJECT_NAME)
  3  VALUES (0, 'YANGTK', 'TEST');

已创建 1 行。

SQL> COMMIT;

提交完成。

连接目标数据库,检查表结构的修改和数据的修改是否已经应用到复制表上:

SQL> CONN YANGTK/YANGTK@192.25.1.100/STREAM1.COMPUTE
已连接。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

会话已更改。

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-01-08 00:16:24

SQL> SELECT ID, OWNER, OBJECT_NAME, CREATED
  2  FROM T_STREAM
  3  WHERE ID < 2;

        ID OWNER                          OBJECT_NAME                    CREATED
---------- ------------------------------ ------------------------------ -------------------
         0 YANGTK                         TEST                           2010-01-08 00:14:32

SQL> SELECT DATA_DEFAULT
  2  FROM USER_TAB_COLUMNS
  3  WHERE TABLE_NAME = 'T_STREAM'
  4  AND COLUMN_NAME = 'CREATED';

DATA_DEFAULT
--------------------------------------------------------------------------------
SYSDATE

可以看到,DMLDDL语句都已经传播并应用到了目标数据库中。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-672208/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-672208/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值