表级单向流环境部署.docx
《表级单向流环境部署.docx》由会员分享,可在线阅读,更多相关《表级单向流环境部署.docx(8页珍藏版)》请在冰豆网上搜索。
表级单向流环境部署
表级单向流环境部署
===========================================================
作者:
yangtingkun()
发表于:
2010.08.3023:
16
分类:
ORACLE
出处:
---------------------------------------------------------------
流机制环境准备
===========================================================
作者:
yangtingkun()
发表于:
2010.08.2923:
57
分类:
ORACLE
出处:
---------------------------------------------------------------
要部署一个流环境,必要环境设置,以及权限用户的建立是必不可少的。
这篇文章简单描述一下建立流环境的前期准备工作。
第一步需要创建一个流管理员,名称并不重要,关键是要授予必要的权限:
SQL>CONNYANGTK@"192.25.1.101/YANGTK.COMPUTE"输入口令:
******已连接。
SQL>SELECT*FROMGLOBAL_NAME;
GLOBAL_NAME
------------------------------------------------------------------------------
YANGTK.COMPUTE
SQL>CREATETABLESPACESTREAMTBS
2DATAFILE'E:
ORACLEORADATAYANGTKSTREAMTBS01.DBF'SIZE1024M;
表空间已创建。
SQL>CREATEUSERSTRMADMINIDENTIFIEDBYSTRMADMIN
2DEFAULTTABLESPACESTREAMTBS
3QUOTAUNLIMITEDONSTREAMTBS;
用户已创建。
SQL>GRANTDBATOSTRMADMIN;
授权成功。
如果流管理员STRMADMIN需要执行用户的存储过程,那么STRMADMIN还需要通过DBMS_STREAMS_AUTH包来授权:
SQL>CONNSYS@"192.25.1.101/YANGTK.COMPUTE"ASSYSDBA输入口令:
****已连接。
SQL>BEGIN
2DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(
3GRANTEE=>'STRMADMIN',
4GRANT_PRIVILEGES=>TRUE);
5END;
6/
PL/SQL过程已成功完成。
在所有节点上建立了用户后,就需要创建两个节点间的数据库链,如果是双向复制,那么就需要在两个节点上分别建立指向对方的数据库链,如果是单向复制,需要在源节点上建立指向目标节点的数据库链:
SQL>CONNSTRMADMIN/STRMADMIN@192.25.1.101/YANGTK.COMPUTE已连接。
SQL>CREATEDATABASELINKSTREAM1.COMPUTE
2CONNECTTOSTRMADMIN
3IDENTIFIEDBYSTRMADMIN
4USING'STREAM1';
数据库链接已创建。
这里只创建了从源数据库YANGTK.COMPUTE到目标数据库STREAM1.COMPUTE的数据库链,如果是双向流环境,或者在实体化的时候需要目标数据库到源数据库的数据库链,那么应该在目标数据库上建立类似的数据库链指向源数据库。
下面建立必要的目录对象,由于流复制的实体化过程可能需要数据泵执行导出操作,因此需要建立DIRECTORY对象:
SQL>CREATEDIRECTORYD_OUTPUTAS'E:
DMP';
目录已创建。
检查源数据库是否处于归档模式,如果不是归档模式,需要将数据库关闭,至于归档模式后再打开:
SQL>SELECTNAME,LOG_MODEFROMV$DATABASE;
NAMELOG_MODE
---------------------
YANGTKARCHIVELOG
如果需要使用DOWNSTREAM流环境,需要部署源数据库到DOWNSTREAM数据库的归档日志传递方式。
如果数据库之间可以之间访问,则只需设置一个LOG_ARCHIVE_DEST_N参数就可以了。
最后需要注意和流相关的初始化参数是否正确的设置,比如STREAMS_POOL_SIZE大小的设置等等,不过数据库中并没有什么额外开关类型的初始化参数控制流,一般来说默认的初始化参数已经可以是流环境正常工作了。
当然9.2版本的流由于存在多个bug,因此必须设置一些初始化参数,甚至包括隐藏参数,这里就不详细描述了。
至此,流环境的准备工作完成。
yangtingkun发表于:
2010.08.2923:
57:
:
分类:
(ORACLE):
:
阅读:
(159次):
:
评论(0)
描述一个最简单的流配置,表级单向流环境部署。
流机制环境准备:
源数据库和目标数据库都根据上面的文章部署好流环境,建立STRMADMIN用户,建立目录和数据库链。
SQL>CONNYANGTK/YANGTK@192.25.1.100/YANGTK.COMPUTE已连接。
SQL>CREATETABLET_STREAM
2ASSELECTROWNUMID,
3A.*
4FROMDBA_OBJECTSA;
表已创建。
SQL>ALTERTABLET_STREAMADDCONSTRAINTPK_T_STREAM
2PRIMARYKEY(ID);
表已更改。
首先在源数据库上建立流复制的表,下面利用流管理员用户STRADMIN建立所需的QUEUE:
SQL>CONNSTRMADMIN/STRMADMIN@192.25.1.100/YANGTK.COMPUTE已连接。
SQL>SELECTDB_LINKFROMUSER_DB_LINKS;
DB_LINK
----------------------------------------------------------------
STREAM1.COMPUTE
SQL>SELECTGLOBAL_NAMEFROMGLOBAL_NAME@STREAM1.COMPUTE;
GLOBAL_NAME
----------------------------------------------------------------
STREAM1.COMPUTE
SQL>EXECDBMS_STREAMS_ADM.SET_UP_QUEUE
PL/SQL过程已成功完成。
连接到目标数据库,同样建立队列:
SQL>CONNSTRMADMIN/STRMADMIN@192.25.1.100/STREAM1.COMPUTE已连接。
SQL>SELECTDB_LINKFROMUSER_DB_LINKS;
DB_LINK
------------------------------------------------------------------
YANGTK.COMPUTE
SQL>SELECTGLOBAL_NAMEFROMGLOBAL_NAME@YANGTK.COMPUTE;
GLOBAL_NAME
------------------------------------------------------------------
YANGTK.COMPUTE
SQL>EXECDBMS_STREAMS_ADM.SET_UP_QUEUE
PL/SQL过程已成功完成。
连接到源数据库,建立传播机制:
SQL>CONNSTRMADMIN/STRMADMIN@192.25.1.100/YANGTK.COMPUTE已连接。
SQL>BEGIN
2DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(
3TABLE_NAME=>'YANGTK.T_STREAM',
4STREAMS_NAME=>'TABLE_SINGLE_STREAM',
5SOURCE_QUEUE_NAME=>'STRMADMIN.STREAMS_QUEUE',
6DESTINATION_QUEUE_NAME=>'STRMADMIN.STREAMS_QUEUE@STREAM1.COMPUTE',
7INCLUDE_DML=>TRUE,
8INCLUDE_DDL=>TRUE,
9SOURCE_DATABASE=>'YANGTK.COMPUTE',
10INCLUSION_RULE=>TRUE,
11QUEUE_TO_QUEUE=>TRUE);
12END;
13/
PL/SQL过程已成功完成。
下面建立捕获机制:
SQL>BEGIN
2DBMS_STREAMS_ADM.ADD_TABLE_RULES(
3TABLE_NAME=>'YANGTK.T_STREAM',
4STREAMS_TYPE=>'CAPTURE',
5STREAMS_NAME=>'CAPTURE_TABLE',
6QUEUE_NAME=>'STRMADMIN.STREAMS_QUEUE',
7INCLUDE_DML=>TRUE,
8INCLUDE_DDL=>TRUE,
9INCLUSION_RULE=>TRUE);
10END;
11/
PL/SQL过程已成功完成。
下面需要在目标数据库上设置实体化SCN。
如果要复制的表在目标端不存在,可以有多种方法来实现表的复制并进行实体化,这里为了简化例子,直接在目标数据库上通过CREATETABLEASSELECT方式建立复制表,这样被复制表在源数据库和目标数据库就处于数据一致的状态:
SQL>CONNYANGTK/YANGTK@192.25.1.100/STREAM1.COMPUTE已连接。
SQL>CREATEDATABASELINKYANGTK.COMPUTEUSING'YANGTK';
数据库链接已创建。
SQL>CREATETABLET_STREAMAS
2SELECT*
3FROMT_STREAM@YANGTK.COMPUTE;
表已创建。
SQL>ALTERTABLET_STREAMADDCONSTRAINTPK_T_STREAM
2PRIMARYKEY(ID);
表已更改。
下面在源数据库获取当前的SCN,并将这个SCN设置到目标数据库:
SQL>CONNSTRMADMIN/STRMADMIN@192.25.1.100/YANGTK.COMPUTE已连接。
SQL>DECLARE
2V_SCNNUMBER:
=DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;
3BEGIN
4DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@STREAM1.COMPUTE(
5SOURCE_OBJECT_NAME=>'YANGTK.T_STREAM',
6SOURCE_DATABASE_NAME=>'YANGTK.COMPUTE',
7INSTANTIATION_SCN=>V_SCN);
8END;
9/
PL/SQL过程已成功完成。
下面在目标数据库建立应用机制:
SQL>CONNSTRMADMIN/STRMADMIN@192.25.1.100/STREAM1.COMPUTE已连接。
SQL>BEGIN
2DBMS_STREAMS_ADM.ADD_TABLE_RULES(
3TABLE_NAME=>'YANGTK.T_STREAM',
4STREAMS_TYPE=>'APPLY',
5STREAMS_NAME=>'APPLY_TABLE',
6QUEUE_NAME=>'STRMADMIN.STREAMS_QUEUE',
7INCLUDE_DML=>TRUE,
8INCLUDE_DDL=>TRUE,
9SOURCE_DATABASE=>'YANGTK.COMPUTE',
10INCLUSION_RULE=>TRUE);
11END;
12/
PL/SQL过程已成功完成。
下面设置APPLY进程的参数,并启动应用进程:
SQL>BEGIN
2DBMS_APPLY_ADM.SET_PARAMETER(
3APPLY_NAME=>'APPLY_TABLE',
4PARAMETER=>'DISABLE_ON_ERROR',
5VALUE=>'N');
6END;
7/
PL/SQL过程已成功完成。
SQL>BEGIN
2DBMS_APPLY_ADM.START_APPLY(APPLY_NAME=>'APPLY_TABLE');
3END;
4/
PL/SQL过程已成功完成。
最后在源数据库启动捕获进程:
SQL>CONNSTRMADMIN/STRMADMIN@192.25.1.100/YANGTK.COMPUTE已连接。
SQL>BEGIN
2DBMS_CAPTURE_ADM.START_CAPTURE(CAPTURE_NAME=>'CAPTURE_TABLE');
3END;
4/
PL/SQL过程已成功完成。
至此,表级单向的流环境配置完成,下面检查一下流环境是否工作正常。
在源数据库修改记录和表结构:
SQL>CONNYANGTK/YANGTK@192.25.1.100/YANGTK.COMPUTE已连接。
SQL>SELECTCOUNT(*)FROMT_STREAM;
COUNT(*)
----------
49958
SQL>DELETET_STREAMWHEREID=1;
已删除1行。
SQL>SELECTDATA_DEFAULT
2FROMUSER_TAB_COLUMNS
3WHERETABLE_NAME='T_STREAM'
4ANDCOLUMN_NAME='CREATED';
DATA_DEFAULT
------------------------------------------------------------
SQL>ALTERTABLET_STREAMMODIFYCREATEDDEFAULTSYSDATE;
表已更改。
SQL>SELECTDATA_DEFAULT
2FROMUSER_TAB_COLUMNS
3WHERETABLE_NAME='T_STREAM'
4ANDCOLUMN_NAME='CREATED';
DATA_DEFAULT
------------------------------------------------------------
SYSDATE
SQL>INSERTINTOT_STREAM
2(ID,OWNER,OBJECT_NAME)
3VALUES(0,'YANGTK','TEST');
已创建1行。
SQL>COMMIT;
提交完成。
连接目标数据库,检查表结构的修改和数据的修改是否已经应用到复制表上:
SQL>CONNYANGTK/YANGTK@192.25.1.100/STREAM1.COMPUTE已连接。
SQL>ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DDHH24:
MI:
SS';
会话已更改。
SQL>SELECTSYSDATEFROMDUAL;
SYSDATE
-------------------
2010-01-0800:
16:
24
SQL>SELECTID,OWNER,OBJECT_NAME,CREATED
2FROMT_STREAM
3WHEREID<2;
IDOWNEROBJECT_NAMECREATED
-----------------------------------------------------------------------------------------
0YANGTKTEST2010-01-0800:
14:
32
SQL>SELECTDATA_DEFAULT
2FROMUSER_TAB_COLUMNS
3WHERETABLE_NAME='T_STREAM'
4ANDCOLUMN_NAME='CREATED';
DATA_DEFAULT
--------------------------------------------------------------------------------
SYSDATE
可以看到,DML和DDL语句都已经传播并应用到了目标数据库中。