苏州网络推广公司网站建设,如何使用万网主机建设网站,如何制作一个完整的网页,备案通过网站还是打不开Oracle Stream配置详细步骤 作者: 杨宝秋, 出处:IT168 1 引言 Oracle Stream功能是为提高数据库的高可用性而设计的#xff0c;在Oracle 9i及之前的版本这个功能被称为Advance Replication。Oracle Stream利用高级队列技术#xff0c;通过解析归档日志#xff0c;将归档日…Oracle Stream配置详细步骤 作者: 杨宝秋, 出处:IT168 1 引言 Oracle Stream功能是为提高数据库的高可用性而设计的在Oracle 9i及之前的版本这个功能被称为Advance Replication。Oracle Stream利用高级队列技术通过解析归档日志将归档日志解析成DDL及DML语句从而实现数据库之间的同步。这种技术可以将整个数据库、数据库中的对象复制到另一数据库中通过使用Stream的技术对归档日志的挖掘可以在对主系统没有任何压力的情况下实现对数据库对象级甚至整个数据库的同步。 解析归档日志这种技术现在应用的比较广泛Quest公司的shareplex软件及DSG公司的realsync都是这样的产品一些公司利用这样的产品做应用级的容灾。但shareplex或是realsync都是十分昂贵的因此你可以尝试用Stream这个Oracle提供的不用额外花钱的功能。Oracle Stream对生产库的影响是非常小的从库可以是与主库不同的操作系统平台你可以利用Oracle Stream复制几个从库从库可用于查询、报表、容灾等不同的功能。本文不谈技术细节只是以手把手的方式一步一步的带你把Stream的环境搭建起来细节内容可以查联机文档。 2 概述 主数据库 操作系统Solaris 9 IP地址192.168.10.35 数据库Oracle 10.2.0.2 ORACLE_SIDprod Global_nameprod 从数据库 操作系统AIX 5.2 IP地址192.168.10.43 数据库Oracle 10.2.0.3 ORACLE_SIDh10g Global_nameh10g 3 环境准备 3.1 设定初始化参数 使用pfile的修改init.ora文件使用spfile的通过alter system命令修改spile文件。主、从数据库分别执行如下的语句 以下是引用片段 Sqlplus ‘/ as sysdba’ alter system set aq_tm_processes2 scopeboth; alter system set global_namestrue scopeboth; alter system set job_queue_processes10 scopeboth; alter system set parallel_max_servers20 scopeboth; alter system set undo_retention3600 scopeboth; alter system set nls_date_formatYYYY-MM-DD HH24:MI:SS scopespfile; alter system set streams_pool_size25M scopespfile; alter system set utl_file_dir* scopespfile; alter system set open_links4 scopespfile; 执行完毕后重启数据库。 3.2 将数据库置为归档模式 设置log_archive_dest_1到相应的位置;设定log_archive_start为TRUE即启用自动归档功能;设定log_archive_format指定归档日志的命令格式。 举例 以下是引用片段 sqlplus ‘/ as sysdba’ alter system set log_archive_dest_1’location/yang/arch’ scopespfile; alter system set log_archive_startTRUE scopespfile; alter system set log_archive_format’ arch%t_%s_%r.arc’ scopespfile; shutdown immediate; startup mount; alter database archivelog; alter database open; 数据库置为归档模式后可以按如下方式检验一下 以下是引用片段 SQL 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 3.3 创建stream 管理用户 3.3.1 创建主环境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; / 3.3.2 创建从环境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; / 3.4 配置网络连接 3.4.1配置主环境tnsnames.ora 主数据库(tnsnames.ora)中添加从数据库的配置。 以下是引用片段 H10G (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.10.43)(PORT 1521)) ) (CONNECT_DATA (SID h10g) (SERVER DEDICATED) ) ) 3.4.2配置从环境tnsnames.ora 以下是引用片段 从数据库(tnsnames.ora)中添加主数据库的配置。 PROD (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.10.35)(PORT 1521)) ) (CONNECT_DATA (SID prod) (SERVER DEDICATED) ) ) 3.5 启用追加日志 可以基于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; 3.6 创建DBlink 根据Oracle 10gR2 Stream官方文档针对主数据库建立的数据库链的名字必须和从数据库的global_name相同。 如果需要修改global_name执行“alter database rename global_name to xxx”。 3.6.1创建主数据库数据库链 #以strmadmin身份登录主数据库。 connect strmadmin/strmadmin #建立数据库链 create database link h10g connect to strmadmin identified by strmadmin using h10g; 3.6.2创建从数据库数据库链 #以strmadmin身份登录从数据库。 connect strmadmin/strmadmin #建立数据库链 create database link prod connect to strmadmin identified by strmadmin using prod; 3.7 创建流队列 3.7.1创建Master流队列 以下是引用片段 #以strmadmin身份登录主数据库。 connect strmadmin/strmadmin begin dbms_streams_adm.set_up_queue( queue_table prod_queue_table, queue_name prod_queue); end; / 3.7.2创建Backup流队列 以下是引用片段 #以strmadmin身份登录从数据库。 connect strmadmin/strmadmin begin dbms_streams_adm.set_up_queue( queue_table h10g_queue_table, queue_name h10g_queue); end; / 3.8 创建捕获进程 以下是引用片段 #以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; / 3.9 实例化复制数据库 在主数据库环境中执行如下Shell语句。如果从库的hr用户不存在建立一个hr的空用户。 exp useridhr/hrprod file/tmp/hr.dmp object_consistenty rowsy imp useridsystem/managerh10g file/tmp/hr.dmp ignorey commity log/tmp/hr.log streams_instantiationy fromuserhr touserhr 3.10 创建传播进程 以下是引用片段 #以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_queueh10g, 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; / 3.11 创建应用进程 以下是引用片段 #以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; / 3.12 启动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; / 3.13 停止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; / 3.14 清除所有配置信息 要清楚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用户身份执行。 4.1 建一张表测试 主数据库 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) 4.2 表中插入一行数据 主数据库 SQL insert into ttt values (1,sdfsdfsdfsdf); 1 row created. SQL commit; Commit complete. SQL 从数据库 SQL select * from TTT; ID NAME ---------- -------------------- 1 sdfsdfsdfsdf 4.3 变更一下表的结构添加一列 主数据库 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) 4.4 将表换一个表空间 主数据库 SQL SELECT table_name,tablespace_name FROM user_tables 2 WHERE table_nameTTT; 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_nameTTT; TABLE_NAME TABLESPACE_NAME ------------------------------ ------------------------------ TTT TBS_STREAM 从数据库 SQL SELECT table_name,tablespace_name FROM user_tables WHERE table_nameTTT; TABLE_NAME TABLESPACE_NAME ------------------------------ ------------------------------ TTT TBS_STREAM 4.5 表上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 4.6 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 4.7 索引换一个表空间测试 主数据库 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 4.8 删除索引测试 主数据库 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 4.9 删除表测试 主数据库 SQL DROP TABLE ttt; Table dropped 从数据库 SQL DESC ttt; Object ttt does not exist. 4.10 建一张带有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 4.11 表中插入一行数据 主数据库 SQL INSERT INTO tttclob VALUES(1,clob_test); 1 row inserted SQL commit; Commit complete 从数据库 SQL SELECT * FROM tttclob; ID MEMO ---------- -------------------------------------------------------------------------------- 1 clob_test 4.12 创建Type测试 主数据库 SQL CREATE or REPLACE TYPE ttttype; 2 / Type created 从数据库 SQL SELECT * FROM user_types WHERE type_nameTTTTYPE; 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 4.13 删除Type测试 主数据库 SQL DROP TYPE ttttype; Type dropped 从数据库 SQL SELECT * FROM user_types WHERE type_nameTTTTYPE; TYPE_NAME TYPE_OID TYPECODE ATTRIBUTES METHODS PREDEFINED INCOMPLETE FINAL INSTANTIABLE SUPERTYPE_OWNER SUPERTYPE_NAME LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID ------------------------------ -------------------------------- - 5 问题诊断 5.1 如何知道捕捉(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会在跟踪文件中记录该信息。 5.2 如何知道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进程尚未传播到从数据库一端。 5.3 如何知道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错误信息。 6 结篇 通过如上的测试可以看出stream的功能还是十分强大的通过配置Oracle Stream可以更大的提升数据库的可用性和安全性,如此一个好用且不用花费高昂额外费用的功能还是很值得一用的。 转载于:https://www.cnblogs.com/jerryxing/archive/2013/03/13/2957000.html