- 浏览: 70900 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
sjzheng803:
不知道你有没有在多线程中试过,我用Future试多线程,就会出 ...
JAVA处理线程超时 -
steven0lisa:
其实,楼主可以用telnet来完成
Socket Client 测试工具 -
nywyang:
把源代码公布出来呀,改进也方便呀。
Socket Client 测试工具 -
java_林:
嗯,我们公司现在用的就是第一种。但感觉第二种更好,简单、统一! ...
利用通配符,减少struts-config.xml的配置 -
simonhoo:
mercyblitz 写道这个功能是什么时候开始支持的,可能是 ...
利用通配符,减少struts-config.xml的配置
Oracle Stream功能是为提高数据库的高可用性而设计的,在Oracle 9i及之前的版本这个功能被称为Advance Replication。Oracle Stream利用高级队列技术,通过解析归档日志,将归档日志解析成DDL及DML语句,从而实现数据库之间的同步。这种技术可以将整个数据库、数据库中的对象复制到另一数据库中,通过使用Stream的技术,对归档日志的挖掘,可以在对主系统没有任何压力的情况下,实现对数据库对象级甚至整个数据库的同步。
解析归档日志这种技术现在应用的比较广泛,Quest公司的shareplex软件及DSG公司的realsync都是这样的产品,一些公司利用这样的产品做应用级的容灾。但shareplex或是realsync都是十分昂贵的,因此你可以尝试用Stream这个Oracle提供的不用额外花钱的功能。Oracle Stream对生产库的影响是非常小的,从库可以是与主库不同的操作系统平台,你可以利用Oracle Stream复制几个从库,从库可用于查询、报表、容灾等不同的功能。本文不谈技术细节,只是以手把手的方式一步一步的带你把Stream的环境搭建起来,细节内容可以查联机文档。
环境:
主数据库:
操作系统:Solaris 9
IP地址:192.168.10.35
数据库:Oracle 10.2.0.2
ORACLE_SID:prod
Global_name:prod
从数据库:
操作系统:AIX 5.2
IP地址:192.168.10.43
数据库:Oracle 10.2.0.3
ORACLE_SID:h10g
Global_name:h10g
设定初始化参数:
使用pfile的修改init.ora文件,使用spfile的通过alter system命令修改spile文件。主、从数据库分别执行如下的语句:
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; 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; alter system set utl_file_dir='*' scope=spfile; alter system set open_links=4 scope=spfile;
执行完毕后重启数据库。
数据库置为归档模式:
设置log_archive_dest_1到相应的位置;设定log_archive_start为TRUE,即启用自动归档功能;设定log_archive_format指定归档日志的命令格式。
举例:
sqlplus ‘/ as sysdba’ alter system set log_archive_dest_1=’location=/yang/arch’ scope=spfile; alter system set log_archive_start=TRUE scope=spfile; alter system set log_archive_format=’ arch%t_%s_%r.arc’ scope=spfile; shutdown immediate; startup mount; alter database archivelog; alter database open;
数据库置为归档模式后,可以按如下方式检验一下:
archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination /yang/arch Oldest online log sequence 534 Next log sequence to archive 536 Current log sequence 536
创建stream 管理用户:
创建主环境stream管理用户:
#以sysdba身份登录 connect / as sysdba #创建主环境的Stream专用表空间 create tablespace tbs_stream datafile '/yang/oradata/prod/tbs_stream01.dbf' size 100m autoextend on maxsize unlimited segment space management auto; #将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间 execute dbms_logmnr_d.set_tablespace('tbs_stream'); #创建Stream管理用户 create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp; #授权Stream管理用户 grant connect,resource,dba,aq_administrator_role to strmadmin; begin dbms_streams_auth.grant_admin_privilege( grantee => 'strmadmin', grant_privileges => true); end; /
创建从环境stream管理用户:
#以sysdba身份登录 connect / as sysdba #创建Stream专用表空间,我的从库用了ASM,这一步也可以参见3.3.1 create tablespace tbs_stream datafile '+VGDATA/h10g/datafile/tbs_stream01.dbf' size 100m autoextend on maxsize unlimited segment space management auto; #同样,将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间 execute dbms_logmnr_d.set_tablespace('tbs_stream'); #创建Stream管理用户 create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp; #授权Stream管理用户 grant connect,resource,dba,aq_administrator_role to strmadmin; begin dbms_streams_auth.grant_admin_privilege( grantee => 'strmadmin', grant_privileges => true); end; /
配置网络连接:
配置主环境tnsnames.ora:
主数据库(tnsnames.ora)中添加从数据库的配置。
H10G = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.43)(PORT = 1521)) ) (CONNECT_DATA = (SID = h10g) (SERVER = DEDICATED) ) )
配置从环境tnsnames.ora:
从数据库(tnsnames.ora)中添加主数据库的配置。
PROD = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.35)(PORT = 1521)) ) (CONNECT_DATA = (SID = prod) (SERVER = DEDICATED) ) )
启用追加日志:
可以基于Database级别或Table级别,启用追加日志(Supplemental Log)。在建立根据Schema粒度进行复制的Oracle Stream环境中,如果确认Schema下所有Table都有合理的主键(Primary Key),则不再需要启用追加日志。
#启用Database 追加日志 alter database add supplemental log data; #启用Table追加日志 alter table add supplement log group log_group_name(table_column_name) always;
创建DBlink
根据Oracle 10gR2 Stream官方文档,针对主数据库建立的数据库链的名字必须和从数据库的global_name相同。
如果需要修改global_name,执行“alter database rename global_name to xxx”。
创建主数据库数据库链
#以strmadmin身份,登录主数据库。
connect strmadmin/strmadmin
#建立数据库链
create database link h10g connect to strmadmin identified by strmadmin using 'h10g';
创建从数据库数据库链
#以strmadmin身份,登录从数据库。
connect strmadmin/strmadmin
#建立数据库链
create database link prod connect to strmadmin identified by strmadmin using 'prod';
创建流队列
创建Master流队列
以下是引用片段: #以strmadmin身份,登录主数据库。 connect strmadmin/strmadmin begin dbms_streams_adm.set_up_queue( queue_table => 'prod_queue_table', queue_name => 'prod_queue'); end; / |
创建Backup流队列
以下是引用片段: #以strmadmin身份,登录从数据库。 connect strmadmin/strmadmin begin dbms_streams_adm.set_up_queue( queue_table => 'h10g_queue_table', queue_name => 'h10g_queue'); end; / |
创建捕获进程
以下是引用片段: #以strmadmin身份,登录主数据库。提醒一下,本文档以hr用户做示例。 connect strmadmin/strmadmin begin dbms_streams_adm.add_schema_rules( schema_name => 'hr', streams_type => 'capture', streams_name => 'capture_prod', queue_name => 'strmadmin.prod_queue', include_dml => true, include_ddl => true, include_tagged_lcr => false, source_database => null, inclusion_rule => true); end; / |
实例化复制数据库
在主数据库环境中,执行如下Shell语句。如果从库的hr用户不存在,建立一个hr的空用户。
exp userid=hr/hr@prod file='/tmp/hr.dmp' object_consistent=y rows=y
imp userid=system/manager@h10g file='/tmp/hr.dmp' ignore=y commit=y log='/tmp/hr.log' streams_instantiation=y fromuser=hr touser=hr
创建传播进程
以下是引用片段: #以strmadmin身份,登录主数据库。 connect strmadmin/strmadmin begin dbms_streams_adm.add_schema_propagation_rules( schema_name => 'hr', streams_name => 'prod_to_h10g', source_queue_name => 'strmadmin.prod_queue', destination_queue_name => 'strmadmin.h10g_queue@h10g', include_dml => true, include_ddl => true, include_tagged_lcr => false, source_database => 'prod', inclusion_rule => true); end; / #修改propagation休眠时间为0,表示实时传播LCR。 begin dbms_aqadm.alter_propagation_schedule( queue_name => 'prod_queue', destination => 'h10g', latency => 0); end; / |
创建应用进程
以下是引用片段: #以strmadmin身份,登录从数据库。 connect strmadmin/strmadmin begin dbms_streams_adm.add_schema_rules( schema_name => 'hr', streams_type => 'apply', streams_name => 'apply_h10g', queue_name => 'strmadmin.h10g_queue', include_dml => true, include_ddl => true, include_tagged_lcr => false, source_database => 'prod', inclusion_rule => true); end; / |
启动STREAM
以下是引用片段: #以strmadmin身份,登录从数据库。 connect strmadmin/strmadmin #启动Apply进程 begin dbms_apply_adm.start_apply( apply_name => 'apply_h10g'); end; / #以strmadmin身份,登录主数据库。 connect strmadmin/strmadmin #启动Capture进程 begin dbms_capture_adm.start_capture( capture_name => 'capture_prod'); end; / |
停止STREAM
以下是引用片段: #以strmadmin身份,登录主数据库。 connect strmadmin/strmadmin #停止Capture进程 begin dbms_capture_adm.stop_capture( capture_name => 'capture_prod'); end; / #以strmadmin身份,登录从数据库。 connect strmadmin/strmadmin #停止Apply进程 begin dbms_apply_adm.stop_apply( apply_name => 'apply_h10g'); end; / |
清除所有配置信息
要清楚Stream配置信息,需要先执行3.13,停止Stream进程。
以下是引用片段: #以strmadmin身份,登录主数据库。 connect strmadmin/strmadmin exec DBMS_STREAMS_ADM.remove_streams_configuration(); #以strmadmin身份,登录从数据库。 connect strmadmin/strmadmin exec DBMS_STREAMS_ADM.remove_streams_configuration(); |
4 测试场景
本文档建立了针对hr用户的Stream 复制环境,如果没有特别声明,以下测试场景均以hr用户身份执行。
建一张表测试
主数据库
SQL> CREATE TABLE TTT(id NUMBER PRIMARY KEY,
2 name VARCHAR2(50)
3 )
4 /
Table created.
从数据库
SQL> desc TTT
Name Null? Type
---------- -------- -------------
ID NOT NULL NUMBER
NAME VARCHAR2(50)
表中插入一行数据
主数据库
SQL> insert into ttt values (1,'sdfsdfsdfsdf');
1 row created.
SQL> commit;
Commit complete.
SQL>
从数据库
SQL> select * from TTT;
ID NAME
---------- --------------------
1 sdfsdfsdfsdf
变更一下表的结构,添加一列
主数据库
SQL> ALTER TABLE TTT ADD(age NUMBER(2));
Table altered
从数据库
SQL> desc TTT
Name Null? Type
----------- -------- --------------
ID NOT NULL NUMBER
NAME VARCHAR2(50)
AGE NUMBER(2)
将表换一个表空间
主数据库
SQL> SELECT table_name,tablespace_name FROM user_tables
2 WHERE table_name='TTT';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TTT USERS
SQL> ALTER TABLE TTT MOVE TABLESPACE tbs_stream;
Table altered
SQL> SELECT table_name,tablespace_name FROM user_tables
WHERE table_name='TTT';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TTT TBS_STREAM
从数据库
SQL> SELECT table_name,tablespace_name FROM user_tables
WHERE table_name='TTT';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TTT TBS_STREAM
表上Name列建一索引
主数据库
SQL> CREATE INDEX ttt_name_idx ON TTT(name);
Index created
从数据库
SQL> SELECT table_name, index_name FROM user_indexes WHERE table_name = 'TTT';
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
TTT TTT_NAME_IDX
TTT SYS_C005721
Rebuild索引测试
主数据库
SQL> ALTER INDEX ttt_name_idx REBUILD;
Index altered
从数据库
SQL> SELECT table_name, index_name FROM user_indexes WHERE table_name = 'TTT';
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
TTT TTT_NAME_IDX
TTT SYS_C005721
索引换一个表空间测试
主数据库
SQL> ALTER INDEX ttt_name_idx REBUILD TABLESPACE tbs_stream;
Index altered
从数据库
SQL> SELECT table_name,index_name,tablespace_name FROM user_indexes
WHERE table_name = 'TTT';
TABLE_NAME INDEX_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
TTT TTT_NAME_IDX TBS_STREAM
TTT SYS_C005721 USERS
删除索引测试
主数据库
SQL> DROP INDEX ttt_name_idx;
Index dropped
从数据库
SQL> SELECT table_name,index_name,tablespace_name FROM user_indexes
WHERE table_name = ‘TTT’;
TABLE_NAME INDEX_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
TTT SYS_C005721 USERS
删除表测试
主数据库
SQL> DROP TABLE ttt;
Table dropped
从数据库
SQL> DESC ttt;
Object ttt does not exist.
建一张带有LOB类型字段的表测试
主数据库
SQL> CREATE TABLE tttclob(id NUMBER PRIMARY KEY, memo CLOB);
Table created
从数据库
SQL> DESC tttclob;
Name Null? Type
----------- -------- --------------
ID NOT NULL NUMBER
MEMO CLOB
表中插入一行数据
主数据库
SQL> INSERT INTO tttclob VALUES(1,'clob_test');
1 row inserted
SQL> commit;
Commit complete
从数据库
SQL> SELECT * FROM tttclob;
ID MEMO
---------- --------------------------------------------------------------------------------
1 clob_test
创建Type测试
主数据库
SQL> CREATE or REPLACE TYPE ttttype;
2 /
Type created
从数据库
SQL> SELECT * FROM user_types WHERE type_name='TTTTYPE';
TYPE_NAME TYPE_OID TYPECODE ATTRIBUTES METHODS PREDEFINED INCOMPLETE FINAL INSTANTIABLE SUPERTYPE_OWNER SUPERTYPE_NAME LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID
------------------------------ -------------------------------- ------------------------------ ---------- ---------- ---------- ---------- ----- ------------ ------------------------------ ------------------------------ ---------------- ------------- --------------------------------
TTTTYPE 1B36AAF10DA8301DE040A8C0289A77B4 OBJECT 0 0 NO YES YES YES
删除Type测试
主数据库
SQL> DROP TYPE ttttype;
Type dropped
从数据库
SQL> SELECT * FROM user_types WHERE type_name='TTTTYPE';
TYPE_NAME TYPE_OID TYPECODE ATTRIBUTES METHODS PREDEFINED INCOMPLETE FINAL INSTANTIABLE SUPERTYPE_OWNER SUPERTYPE_NAME LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID
------------------------------ -------------------------------- -
问题诊断
如何知道捕捉(Capture)进程是否运行正常?
以strmadmin身份,登录主数据库,执行如下语句:
SQL> SELECT CAPTURE_NAME,
2 QUEUE_NAME,
3 RULE_SET_NAME,
4 NEGATIVE_RULE_SET_NAME,
5 STATUS
6 FROM DBA_CAPTURE;
结果显示如下:
CAPTURE_NAME QUEUE_NAME
------------------------------ ------------------------------
RULE_SET_NAME NEGATIVE_RULE_SET_NAME STATUS
------------------------------ ------------------------------ --------
CAPTURE_PROD PROD_QUEUE
RULESET$_14 ENABLED
ENABLED
如果STATUS状态是ENABLED,表示Capture进程运行正常;
如果STATUS状态是DISABLED,表示Capture进程处于停止状态,只需重新启动即可;
如果STATUS状态是ABORTED,表示Capture进程非正常停止,查询相应的ERROR_NUMBER、ERROR_MESSAGE列可以得到详细的信息;同时,Oracle会在跟踪文件中记录该信息。
如何知道Captured LCR是否有传播GAP?
以strmadmin身份,登录主数据库,执行如下语句:
SQL> SELECT CAPTURE_NAME, QUEUE_NAME, STATUS, CAPTURED_SCN, APPLIED_SCN
2 FROM DBA_CAPTURE;
结果显示如下:
CAPTURE_NAME QUEUE_NAME STATUS
------------------------------ ------------------------------ --------
CAPTURED_SCN APPLIED_SCN
------------ -----------
CAPTURE_PROD PROD_QUEUE ENABLED
17023672 17023672
如果APPLIED_SCN小于CAPTURED_SCN,则表示在主数据库一端,要么LCR没有被dequeue,要么Propagation进程尚未传播到从数据库一端。
如何知道Appy进程是否运行正常?
以strmadmin身份,登录从数据库,执行如下语句:
SQL> SELECT apply_name, apply_captured, status FROM dba_apply;
结果显示如下:
APPLY_NAME APPLY_ STATUS
---------------------- ------ ----------------
APPLY_H10G YES ENABLED
如果STATUS状态是ENABLED,表示Apply进程运行正常;
如果STATUS状态是DISABLED,表示Apply进程处于停止状态,只需重新启动即可;
如果STATUS状态是ABORTED,表示Apply进程非正常停止,查询相应的ERROR_NUMBER、ERROR_MESSAGE列可以得到详细的信息;同时,可以查询DBA_APPLY_ERROR视图,了解详细的Apply错误信息。
通过如上的测试可以看出stream的功能还是十分强大的,通过配置Oracle Stream可以更大的提升数据库的可用性和安全性,如此一个好用且不用花费高昂额外费用的功能还是很值得一用的。
发表评论
-
ORACLE 内存结构
2012-07-29 22:25 1179System Global Area (SGA) ... -
OC4J Configuration issue
2012-07-01 23:51 1408问题: 今天在虚拟机上启动OEM时,报错: 解决 ... -
启用xhost
2012-07-01 22:52 1304实用技巧:在Linux下设置xhost方法步骤 第一步:用r ... -
Oracle Hint
2012-06-28 22:24 1976Hint 是Oracle 提供的一种SQL语法,它允许用户 ... -
Oracle over函数
2012-06-28 22:08 884SQL code: sql over的作用及用法RANK ( ... -
oracle 管道表函数
2012-06-28 22:06 1022表函数可接受查询语句或游标作为输入参数,并可输出多行数据。该函 ... -
PL/SQL编写留意(一)
2012-06-28 22:04 1423一,PL/SQL数值型数据的选择 PL/SQL的数 ... -
Oracle 索引之——位图索引
2012-05-25 15:28 1054当用于低基数列时,位图索引比 B 树索引更紧凑。 由于位图使用 ... -
Oracle 数据库中查询当前有哪些用户连接。
2011-07-27 18:21 1746DBA有时用的到的。 SELECT s.Osuser ...
相关推荐
### Step by step配置Oracle Stream #### 1. 引言 在现代企业的IT环境中,确保数据的高度可用性和一致性至关重要。Oracle Stream作为一种强大的工具,能够帮助实现数据库间的高效同步,不仅适用于灾难恢复方案,还...
### 一步一步配置Oracle Stream #### 引言 Oracle Streams 是一种强大的工具,它提供了一种在数据库之间同步数据的方法,可以实现数据复制、合并、分区等功能。本文将详细介绍如何逐步配置 Oracle Streams,确保...
创建Stream管理用户是配置Oracle Stream的另一个重要步骤。在主数据库环境中创建Stream专用的表空间和用户,以便于管理Stream复制过程中的各种资源和对象。通过以sysdba身份登录到数据库,使用CREATE TABLESPACE语句...
Oracle Stream是一种高级数据库同步工具,它在Oracle 9i及后续版本中被引入,以前称为Advanced Replication。Streams利用了Oracle的高级队列技术,通过解析归档日志,将数据库的DDL(数据定义语言)和DML(数据操纵...
在配置ORACLE STREAM时,需要启用追加日志(SUPPLEMENTAL LOG)来确保数据的一致性和完整性。这可以通过两种方式实现: 1. **基于DATABASE级别的追加日志**:适用于所有表。 ```sql ALTER DATABASE ADD ...
以上步骤详细介绍了如何在Oracle数据库中配置Oracle Streams,包括环境准备、参数设置、开启归档模式、创建表空间、创建用户、配置数据库全局名称、配置数据库链接以及设置补充日志等内容。这些步骤对于成功部署和...
"[itpub.net]Step by step配置Oracle Stream.pdf"提供了一步一步的配置教程,对于初学者尤其有帮助。它详细阐述了每一步的操作,帮助你理解并实施Oracle Streams的配置。 6. **SQL脚本** "主数据库.sql"和"从...
配置Simple Oracle Stream涉及多个步骤,包括准备操作系统和数据库环境、创建专门的用户和表空间、设置权限、配置网络连接(如tnsnames.ora文件)、建立数据库链接,以及调整必要的数据库参数。特别是在启用Stream...
本文将深入探讨 Oracle Stream 的核心概念、工作流程以及配置实践。 Oracle 高可用性(high Availability)的几种技术架构包括物理 standby、logical standby、GoldenGate、Data Guard 以及 Stream。Stream 提供了一...
本文将深入探讨Oracle Stream的相关概念、架构及其配置实例。 首先,Oracle高可用性(High Availability)是确保数据库持续运行并快速从故障中恢复的技术策略。在Oracle中,多种技术如RAC(Real Application ...
根据提供的标题、描述、标签及部分内容,我们可以提炼出关于Oracle Streams配置的相关知识点。下面将详细介绍这些知识点,并确保信息准确无误。 ### Oracle Streams 配置概述 #### 1. Oracle Streams简介 Oracle ...
使用nginx代理oracle或者网站,实现地址的跳转以及网站的统一门户和负载均衡。
### 流批一体Streamsets Data Collector(SDC)管道Oracle CDC实时同步配置详解 #### 一、概述 在大数据处理领域,Streamsets Data Collector (SDC)作为一种强大的数据集成工具,被广泛应用于各种复杂的数据流场景中...
Oracle Streams 是 Oracle 数据库...理解其核心概念、正确配置和操作组件,以及熟练进行故障排查,对于确保数据的一致性和可用性至关重要。在实际环境中,应根据具体需求进行详细规划和测试,以实现最佳性能和可靠性。
### Oracle Stream + AQ + JMS 搭建详解 #### 一、背景及目标 在当前数据密集型应用环境中,数据库变更数据的实时捕获与处理变得尤为重要。Oracle Stream技术结合Oracle的高级队列(Advanced Queuing, AQ)以及...
到了Oracle 10g,有了DBMS_STREAMS_ADM之后,Stream流复制已经很好配置了 下面的只是一个最简单的stream流复制,不涉及复杂的rule配置 环境: OS:Redhat Linux Oracle 10.2.0.2 source:stream1 destnation:stream2
"Oracle Stream Concepts Administration" 主要涉及如何管理和配置Streams以实现高效、可靠的数据流管理。 首先,我们需要理解Oracle Streams的基本概念。它主要由三部分组成:Producers(生产者)、Consumers...
ORACLE 10G 数据库通过STREAM技术实现的双向同步,为数据一致性与高可用性提供了强有力的支持。以下是对这一技术的深入解析: ### ORACLE 10G 数据库与STREAM技术 ORACLE 10G作为Oracle公司推出的第十代数据库产品...