转: 配置 ORACLE Stream 详解

原帖:http://hi.baidu.com/binsil/item/9515245d3d2ac19609be1790

 

配置 ORACLE Stream 详解

         --小斌

        最初的时候oracle stream并不是为了高可用性而设计的,stream是ORACLE的消息队列技术的一种扩展应用。oracle的消息队列和其他的产品有点类似,如通 过发布/订阅的来解决事件的管理。随着该技术越来越成熟,而且具有高灵活性的特点所以越来越受到重视。它跟dataguard的功能有点相似,但相比之下 oracle stream最大的优势便是其垮平台。oracle高级复制(oracle advance replication)和oracle 流复制(stream replication)是两种技术,前者是基于触发器的,后者是基于日志挖掘的。

        oracle stream的技术原理就是通过捕获进程(captureprocess),该进程利用logminer技术从日志中提取DDL、DML语句,这些语句有 一种特殊的格式表达,叫做逻辑变更记录(logical change record)。这些LCR被保存在source database 的发送队列中。然后通过传播进程(propagation process)把这些记录通过网络发送到target database的接收队列中。而target database 上面有一个应用进程(apply process)从本地的接收队列中取出这些LCR,再从本地应用,实现数据同步。

        从应用这些环节所处的地方,可以分为:
        UpStreams(capture和propagation在source数据库,apply在destination数据库)。
        DownStream(capture和propagation,以及apply在destination数据库)

        如果成对象来分,可以分成:
        database级的stream
        owner级的stream
        table级的stream

       

        下面我们来通过实验来一步一步认识。我们首先以UpStreams机制,并选择owner级别来进行实验。DownStream机制将在后面另外讲解。

本次实验环境  RAC --> 单机

配置环境如下:

RAC:

                RAC1:     

                           PUBLICE IP:192.168.1.111/24

                           private IP:10.10.10.31/24

                           service_names :devdb_rac

                           INSTANCE:devdb1       

                           DB_NAME:devdb_ra

                           global_name:DEVDB_RA

                           datafile、controlfile、redofile: ASM 

                                                     

                RAC2:

                           PUBLICE IP:192.168.1.122/24

                           private IP:10.10.10.32/24

                           service_names :devdb_rac

                           INSTANCE:devdb2      

                           DB_NAME:devdb_ra

                           global_name:DEVDB_RA

                           datafile、controlfile、redofile: ASM

 

        SINGLE:

                   IP:192.168.1.144/24

                   INSTANCE:devdb3     

                   service_names:devdb_single                

                   DB_NAME:devdb

                   global_name:GSTREAM

                   datafile、controlfile、redofile: OS FILESYSTEM

 

一.配置TNSNAME.ORA文件

    其实主数据库和从数据库的TNSNAME.ORA基本上一样,所以可以直接复制。

    以下是我的tnsname.ora文件供参考:

[root@rac1 admin]# more tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

DEVDB_RAC =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = devdb_rac)
    )
  )

DEVDB2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = devdb_rac)
      (INSTANCE_NAME = devdb2)
    )
  )

DEVDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = devdb_rac)
      (INSTANCE_NAME = devdb1)
    )
  )

devdb_single =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.133)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = devdb_single)
      (INSTANCE_NAME = devdb3)
    )
  )

 

streamstns =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.144)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = streams)
      (INSTANCE_NAME = streams)
    )
  )

 

LISTENERS_DEVDB_RAC =
  (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
  )

DEVDB_RA =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = devdb_ra)
    )
  )

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

 

二.设置归档模式。

     由于原的RAC环境已经是归档模式了,所以这里就直接给出参数文件内容:

devdb1.log_archive_dest_1='location=/u01/archivelog/archive1'
devdb2.log_archive_dest_1='location=/u01/archivelog/archive2'
devdb1.log_archive_dest_2='service=devdb2 db_unique_name=devdb_rac'
devdb2.log_archive_dest_2='service=devdb1 db_unique_name=devdb_rac'

devdb2.standby_archive_dest='/u01/archivelog/archive1'
devdb1.standby_archive_dest='/u01/archivelog/archive2'

我 配置的是节点间相互归档,这种归档日志存放方案在RAC的RMAN备份和涉及到其他节点归档日志读写的应用中都非常有必要。因为当我们在其中一个节点上执 行RMAN备份时,当需要用到其他节点归档文件的时候,要么所有节点的归档文件都在共享设备上所有节点都可以访问,要么就是直接归档到别的节点服务器。相 比较起来,使用共享设备或存放在ASM上都会额外增加管理成本,所以归档到其他节点是比较方便的一种方案。

 

三.设置相关初始化参数。

     在主、从数据库均添加以下参数。

  Sqlplus / as sysdba

  alter system set aq_tm_processes=2 scope=both;    ##说明: 如果大于零, 就会启用对队列消息的时间监视。该时间值可用于指定消息的延迟和失效属性 (用于应用程序的开发)。 
  alter system set global_names=true scope=both;
  alter system set job_queue_processes=10 scope=both; ##JOB队列中可以放入多少个JOB任务,设置为0则没有JOB要执行。
  alter system set parallel_max_servers=20 scope=both;  ##参数用于设置系统中允许的最大并行进程数。
  alter system set undo_retention=3600 scope=both;       ##撤销保留时间
  alter system set nls_date_format='YYYY-MM-DD HH24:MI:SS' scope=spfile; ##时间格式,最好要一致。
  alter system set streams_pool_size=25M scope=spfile;     ##设定流池的大小,V$STREAMS_POOL_ADVICE视图的信息判断最佳大小
  alter system set utl_file_dir='*' scope=spfile;
  alter system set open_links=4 scope=spfile;                     ##指定在一个会话当中同时最大的远程数据库连接数。

 

四.创建stream的管理用户,及专用表空间。

        一般情况下,将logminer的数据字典从system表空间转移到特定表空间有利于系统表空间的维护,也防止今后被撑爆。

在主,从数据库下创建:

1.创建表空间

SQL>  create tablespace streams_ts datafile size 100m; (我的RAC环境下使用了OMF,所以datafile后面不加路劲参数了)

2.创建用户

SQL> create user streamadm identified by lingksxz
  2  default tablespace streams_ts temporary tablespace temp;

SQL> alter user streamadm quota unlimited on streams_ts;

SQL> grant connect,resource,dba,aq_administrator_role to streamadm;

3.权限环境

SQL> execute dbms_logmnr_d.set_tablespace('streams_ts');##这里面试表空间名

SQL> begin
SQL> dbms_streams_auth.grant_admin_privilege(
SQL> grantee => 'streamadm',  ## 这里面是用户名字
SQL> grant_privileges => true);
SQL> end;
SQL> /

 

五.创建DB_LINK连接

主、从数据库均使用stream管理用户执行。

conn streamadm/lingksxz

主:

SQL> create database link gstreamsconnect to streamadm identified by lingksxz using 'streamstns';

解释:gstreams: 从库的global_name ,可使用select * from global_name查看,使用alter system rename global_name to xxx修改。

          streamadm identified by lingksxz :从库的用户名及口令

          'streamstns':从库的连接别名

测试连接:

SQL> select * from
  2  ;

D
-
X

反馈D X则证明连接成功!

若不成功可能弄错了,可以检查检查以上的三个参数是否弄错了。检查仔细。

删除连接的方法:drop database link gstreams;

从:

SQL> create database link devdb_ra connect to streamadm identified by lingksxz using 'devdb1';
SQL> select * from ;

D
-
X

 

六.创建队列

主:

登录streamadm执行。

1.创建队列

begin
dbms_streams_adm.set_up_queue(
queue_table => 'devdb_queue_table',  ##创建队列表
queue_name => 'devdb_queue');         ##队列名字
end;

2创建捕获过程

begin
dbms_streams_adm.add_schema_rules(
schema_name => 'orabm',            ##捕获的schema名字
streams_type => 'capture',            ##类型为capture
streams_name => 'capture_orabm',  ## 捕获进程的名字
queue_name => 'streamadm.devdb_queue', ##队列名字,要对应刚刚创建队列的那个“队列名字”喔!
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => null,
inclusion_rule => true);
end;
/

 

从:

登录streamadm执行。

1.创建队列

begin
dbms_streams_adm.set_up_queue(
queue_table => 'stream_queue_table', ##从数据库的队列表
queue_name => 'stream_queue');         ##从数据库的队列名
end;
/

 

2.创建应用进程

begin
dbms_streams_adm.add_schema_rules(
schema_name => 'orabm',   ##应用的schema名
streams_type => 'apply',      ##应用类型apply
streams_name => 'apply_streams', ##应用进程名
queue_name => 'streamadm.stream_queue', ##队列名,要和队列的“从数据库的队列名”对应!
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'devdb_ra',
inclusion_rule => true);
end;
/

 

主:

登录streamadm执行。

3.创建分发进程

begin
dbms_streams_adm.add_schema_propagation_rules(
schema_name => 'orabm',    ##分发的schema名字
streams_name => 'capture_orabm',  ##捕获名字,记住要跟捕获进程中的“捕获进程的名字”对应一样喔!
source_queue_name => 'streamadm.devdb_queue', ##源队列名,要对应刚刚创建队列的那个“队列名字”喔!
destination_queue_name => 'streamadm.stream_queue@streamstns', ##目标数据库队列名,要和目标队列“从数据库的队列名”对应!@后面是目标从数据库的连接别名。
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'devdb_ra',
inclusion_rule => true);
end;
/

 

4.修改propagation休眠时间为0,表示实时传播LCR。

begin
dbms_aqadm.alter_propagation_schedule(
queue_name => 'devdb_queue',
destination => 'streamstns',
latency => 0);
end;
/

 

七.同步schema

    使用exp/imp进行同步。

导出:

rac1-> exp userid=orabm/orabm file='/u01/orabm.dmp' object_consistent=y rows=y;

Export: Release 10.2.0.1.0 - Production on Sun Sep 18 01:28:38 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user ORABM
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user ORABM
About to export ORABM's objects ...

 

导入:
localhost-> imp userid=system/oralin file='/u01/orabm.dmp' ignore=y commit=y streams_instantiation=y fromuser=orabm touser=orabm

Import: Release 10.2.0.1.0 - Production on Sat Sep 17 21:52:38 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

Export file created by EXPORT:V10.02.01 via conventional path

Warning: the objects were exported by ORABM, not by you

import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses ZHS16GBK character set (possible charset conversion)
. importing ORABM's objects into ORABM
. . importing table                           "AA"         14 rows imported
Import terminated successfully without warnings.

 

 

八.启用stream

主:

登录streamadm执行。

begin
dbms_capture_adm.start_capture(
capture_name => 'capture_orabm');  ##捕获进程的名,要和捕获进程名对应喔!
end;
/

 

从:

登录streamadm执行。

begin
dbms_apply_adm.start_apply(
apply_name =>'apply_streams'); ##要和应用进程名对应喔!
end;
/

 

到此基本创建完毕。

 

九.检查进程是否正常。

1.如何知道Appy进程是否运行正常

以streamadm身份,登录从数据库,执行如下语句:

SQL> SELECT apply_name, apply_captured, status FROM dba_apply;

APPLY_NAME                     APP STATUS
------------------------------ --- --------
APPLY_STREAMS                  YES ENABLED

如果STATUS状态是ENABLED,表示Apply进程运行正常;
如果STATUS状态是DISABLED,表示Apply进程处于停止状态,只需重新启动即可;

启动apply进程:

begin
dbms_apply_adm.start_apply(
apply_name =>'apply_streams');

end;
/

 

2.如何知道捕捉(Capture)进程是否运行正常?
SQL> SELECT CAPTURE_NAME,QUEUE_NAME,RULE_SET_NAME,NEGATIVE_RULE_SET_NAME,STATUS FROM DBA_CAPTURE;

CAPTURE_NAME                   QUEUE_NAME
------------------------------ ------------------------------
RULE_SET_NAME                  NEGATIVE_RULE_SET_NAME         STATUS
------------------------------ ------------------------------ --------
CAPTURE_ORABM                  DEVDB_QUEUE
RULESET$_42                                                   ENABLED

如果STATUS状态是ENABLED,表示Capture进程运行正常;

如果STATUS状态是DISABLED,表示Capture进程处于停止状态,只需重新启动即可;

begin
dbms_capture_adm.start_capture(
capture_name => 'capture_orabm'); 

end;
/

 

 十.小结

        由于时间匆忙,可能有些地方疏漏和错误,希望大家能够斧正。stream功能其实很灵活很强大,可以创造出很多的应用方式,实施过程可能会有些地方遗漏或 错误,所以测试不通的话,请仔细检测各个细节。后面我将会另外给出DownStream(capture和propagation,以及apply在 destination数据库)的例子。

 

另附简要记录:

owner级UpStream

begin
dbms_streams_adm.set_up_queue(
queue_table => 'ds_queue_table',
queue_name => 'ds_queue');
end;


begin
dbms_streams_adm.set_up_queue(
queue_table => 'dds_queue_table',
queue_name => 'dds_queue');
end;

 

begin
dbms_streams_adm.add_schema_rules(
schema_name => 'hr',
streams_type => 'capture',
streams_name => 'capture_ds',
queue_name => 'streamadm.ds_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => null,
inclusion_rule => true);
end;
/

 

begin
dbms_streams_adm.add_schema_propagation_rules(
schema_name => 'hr',
streams_name => 'propag_ds',
source_queue_name => 'streamadm.ds_queue',
destination_queue_name => 'streamadm.dds_queue@streamstns',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'devdb_ra',
inclusion_rule => true);
end;
/


begin
dbms_aqadm.alter_propagation_schedule(
queue_name => 'ds_queue',
destination => 'streamstns',
latency => 0);
end;
/


begin
dbms_streams_adm.add_schema_rules(
schema_name => 'hr',
streams_type => 'apply',
streams_name => 'apply_dds',
queue_name => 'streamadm.dds_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'devdb_ra',
inclusion_rule => true);
end;
/

 

begin
dbms_capture_adm.start_capture(
capture_name => 'capture_ds');
end;
/

 


begin
dbms_apply_adm.start_apply(
apply_name => 'apply_dds');
end;
/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值