描述一个最简单的流配置,表级单向流环境部署。
流机制环境准备: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
可以看到,DML和DDL语句都已经传播并应用到了目标数据库中。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-672208/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-672208/