原帖: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;
/
相关推荐
### Oracle Stream 详细配置知识点 #### 一、Oracle Stream配置背景与目的 Oracle Streams 是一个强大的数据复制和集成工具,可以实现数据的实时捕获、处理以及传送功能。通过使用Oracle Streams,用户能够轻松地在...
#### 二、Oracle Stream配置步骤详解 ##### 2.1 环境准备 **2.1.1 设定初始化参数** 在开始 Oracle Stream 的配置之前,首先需要确保主数据库和所有从数据库都正确设置了必要的初始化参数。这些参数对于确保 ...
### 流批一体Streamsets Data Collector(SDC)管道Oracle CDC实时同步配置详解 #### 一、概述 在大数据处理领域,Streamsets Data Collector (SDC)作为一种强大的数据集成工具,被广泛应用于各种复杂的数据流场景中...
3. **连接字符串**:配置正确的数据库连接字符串,包括服务器地址、端口号、数据库服务名等,例如`jdbc:oracle:thin:@hostname:port/service_name`。 4. **权限和认证**:在建立数据库连接时提供有效的用户名和密码...
### Oracle Stream + AQ + JMS 搭建详解 #### 一、背景及目标 在当前数据密集型应用环境中,数据库变更数据的实时捕获与处理变得尤为重要。Oracle Stream技术结合Oracle的高级队列(Advanced Queuing, AQ)以及...
### 二、Oracle提权方法详解 #### 1. 使用PL/SQL代码实现提权 文件中的部分内容展示了如何通过编写PL/SQL代码来实现Oracle提权。这里的关键在于利用了Oracle的一些内置包和功能,例如`SYS.DBMS_EXPORT_EXTENSION`...
### Streamsets Data Collector管道详细配置文档 #### 一、概览 Streamsets Data Collector (SDC) 是一种高性能、可扩展的数据集成工具,用于构建可靠的数据管道。它支持多种数据源和目标,能够处理结构化与非结构...
Oracle 12C驱动包是Java应用程序连接Oracle 12C数据库的重要组件,主要用于实现Java Database Connectivity (JDBC)。JDBC是Java编程语言中用于规范客户端程序如何访问数据库的标准接口,而ojdbc驱动则是Oracle公司...
### Oracle自动内存管理ASMM详解 #### 一、引言 随着Oracle数据库技术的发展,内存管理变得越来越自动化和智能化。其中,“Oracle自动内存管理(Automatic Shared Memory Management, ASMM)”是一个重要的里程碑...
### Oracle流配置与复制Schemas的关键点解析 #### 一、概述 Oracle Streams 是一种用于在数据库之间同步数据和事件的技术。它通过捕捉源数据库上的数据更改(包括DDL和DML操作),并通过网络将这些更改传播到目标...
【SSH+Oracle上传图片】项目详解 在Java Web开发中,SSH(Struts2、Spring、Hibernate)框架常用于构建企业级应用。本项目重点在于如何通过SSH框架将图片数据存储到Oracle数据库的Blob列中。以下是实现这一功能的...
### Oracle大数据解决方案架构详解 #### 一、Oracle大数据解决方案概览 Oracle提供的大数据解决方案旨在帮助企业高效管理和分析海量数据。该方案不仅涵盖了传统的结构化数据处理,还涉及到了非结构化数据、实时...
### Oracle读写分离详解 #### 一、读写分离概念 **读写分离**是一种数据库设计模式,旨在通过将数据库的读操作与写操作分开,从而优化系统的整体性能。这种模式下,通常会有两个或多个数据库实例:一个主数据库...
### Oracle相关接口使用详解 在Oracle数据库操作中,掌握接口的使用是进行高效数据库管理和应用开发的关键。本文将深入解析“Oracle相关接口使用方法”,基于标题、描述、标签及部分内容,详细阐述各接口的功能与...
**JDK8 Windows Oracle 官方版详解** Java Development Kit(JDK)是Oracle公司提供的用于开发和运行Java应用程序的工具集。JDK8作为Java编程语言的一个重要版本,引入了许多创新特性和优化,对开发者来说意义重大...
【知识点详解】 在本文中,我们将探讨如何在CentOS服务器上配置JDK、Tomcat以及MySQL,这是一个典型的Java Web应用程序部署流程。 1. **连接服务器**: 首先,你需要通过SSH(Secure Shell)连接到你的CentOS...
#### 知识点四:初始化参数配置详解 **背景:** 设置了以下初始化参数: - DB_BLOCK_SIZE = 8KB - SGA_MAX_SIZE = 2GB - SGA_TARGET = 0 - SHARED_POOL_SIZE = 120MB - DB_CACHE_SIZE = 896MB - STREAM_POOL_SIZE ...
**Java Development Kit (JDK) 1.8 安装与配置详解** Java Development Kit,简称JDK,是Oracle公司发布的用于开发和运行Java应用程序的重要工具包。JDK 1.8是Java的一个重要版本,引入了许多新特性,提升了开发...
在Java的JDBC环境中,处理Oracle数据库中的CLOB(Character Large Object)字段是一项常见的任务,尤其是在存储大量文本数据时。CLOB类型用于存储超过4000个字符的字符串数据。以下是对`jdbc`处理`oracle`的`clob`...