Oracle+Stream+配置实验.docx
《Oracle+Stream+配置实验.docx》由会员分享,可在线阅读,更多相关《Oracle+Stream+配置实验.docx(16页珍藏版)》请在冰豆网上搜索。
Oracle+Stream+配置实验
一步一步配置OracleStream
1引言
OracleStream功能是为提高数据库的高可用性而设计的,在Oracle9i及之前的版本这个功能被称为AdvanceReplication。
OracleStream利用高级队列技术,通过解析归档日志,将归档日志解析成DDL及DML语句,从而实现数据库之间的同步。
这种技术可以将整个数据库、数据库中的对象复制到另一数据库中,通过使用Stream的技术,对归档日志的挖掘,可以在对主系统没有任何压力的情况下,实现对数据库对象级甚至整个数据库的同步。
解析归档日志这种技术现在应用的比较广泛,Quest公司的shareplex软件及DSG公司的realsync都是这样的产品,一些公司利用这样的产品做应用级的容灾。
但shareplex或是realsync都是十分昂贵的,因此你可以尝试用Stream这个Oracle提供的不用额外花钱的功能。
OracleStream对生产库的影响是非常小的,从库可以是与主库不同的操作系统平台,你可以利用OracleStream复制几个从库,从库可用于查询、报表、容灾等不同的功能。
本文不谈技术细节,只是以手把手的方式一步一步的带你把Stream的环境搭建起来,细节内容可以查联机文档。
2概述
主数据库:
操作系统:
Solaris9
IP地址:
192.168.10.35
数据库:
Oracle10.2.0.2
ORACLE_SID:
prod
Global_name:
prod
从数据库:
操作系统:
AIX5.2
IP地址:
192.168.10.43
数据库:
Oracle10.2.0.3
ORACLE_SID:
h10g
Global_name:
h10g
3环境准备
3.1设定初始化参数
使用pfile的修改init.ora文件,使用spfile的通过altersystem命令修改spile文件。
主、从数据库分别执行如下的语句:
Sqlplus‘/assysdba’
altersystemsetaq_tm_processes=2scope=both;
altersystemsetglobal_names=truescope=both;
altersystemsetjob_queue_processes=10scope=both;
altersystemsetparallel_max_servers=20scope=both;
altersystemsetundo_retention=3600scope=both;
altersystemsetnls_date_format='YYYY-MM-DDHH24:
MI:
SS'scope=spfile;
altersystemsetstreams_pool_size=25Mscope=spfile;
altersystemsetutl_file_dir='*'scope=spfile;
altersystemsetopen_links=4scope=spfile;
执行完毕后重启数据库。
3.2将数据库置为归档模式
设置log_archive_dest_1到相应的位置;设定log_archive_start为TRUE,即启用自动归档功能;设定log_archive_format指定归档日志的命令格式。
举例:
sqlplus‘/assysdba’
altersystemsetlog_archive_dest_1=’location=/yang/arch’scope=spfile;
altersystemsetlog_archive_start=TRUEscope=spfile;
altersystemsetlog_archive_format=’arch%t_%s_%r.arc’scope=spfile;
shutdownimmediate;
startupmount;
alterdatabasearchivelog;
alterdatabaseopen;
数据库置为归档模式后,可以按如下方式检验一下:
SQL>archiveloglist
DatabaselogmodeArchiveMode
AutomaticarchivalEnabled
Archivedestination/yang/arch
Oldestonlinelogsequence534
Nextlogsequencetoarchive536
Currentlogsequence536
观注标红的部分。
3.3创建stream管理用户
3.3.1创建主环境stream管理用户
#以sysdba身份登录
connect/assysdba
#创建主环境的Stream专用表空间
createtablespacetbs_streamdatafile'/yang/oradata/prod/tbs_stream01.dbf'
size100mautoextendonmaxsizeunlimitedsegmentspacemanagementauto;
#将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间
executedbms_logmnr_d.set_tablespace('tbs_stream');
#创建Stream管理用户
createuserstrmadminidentifiedbystrmadmin
defaulttablespacetbs_streamtemporarytablespacetemp;
#授权Stream管理用户
grantconnect,resource,dba,aq_administrator_roletostrmadmin;
begin
dbms_streams_auth.grant_admin_privilege(
grantee=>'strmadmin',
grant_privileges=>true);
end;
/
3.3.2创建从环境stream管理用户
#以sysdba身份登录
connect/assysdba
#创建Stream专用表空间,我的从库用了ASM,这一步也可以参见3.3.1
createtablespacetbs_streamdatafile'+VGDATA/h10g/datafile/tbs_stream01.dbf'
size100mautoextendonmaxsizeunlimitedsegmentspacemanagementauto;
#同样,将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间
executedbms_logmnr_d.set_tablespace('tbs_stream');
#创建Stream管理用户
createuserstrmadminidentifiedbystrmadmin
defaulttablespacetbs_streamtemporarytablespacetemp;
#授权Stream管理用户
grantconnect,resource,dba,aq_administrator_roletostrmadmin;
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级别,启用追加日志(SupplementalLog)。
在建立根据Schema粒度进行复制的OracleStream环境中,如果确认Schema下所有Table都有合理的主键(PrimaryKey),则不再需要启用追加日志。
#启用Database追加日志
alterdatabaseaddsupplementallogdata;
#启用Table追加日志
altertableaddsupplementloggrouplog_group_name(table_column_name)always;
3.6创建DBlink
根据Oracle10gR2Stream官方文档,针对主数据库建立的数据库链的名字必须和从数据库的global_name相同。
如果需要修改global_name,执行“alterdatabaserenameglobal_nametoxxx”。
3.6.1创建主数据库数据库链
#以strmadmin身份,登录主数据库。
connectstrmadmin/strmadmin
#建立数据库链
createdatabaselinkh10gconnecttostrmadminidentifiedbystrmadminusing'h10g';
3.6.2创建从数据库数据库链
#以strmadmin身份,登录从数据库。
connectstrmadmin/strmadmin
#建立数据库链
createdatabaselinkprodconnecttostrmadminidentifiedbystrmadminusing'prod';
3.7创建流队列
3.7.1创建Master流队列
#以strmadmin身份,登录主数据库。
connectstrmadmin/strmadmin
begin
dbms_streams_adm.set_up_queue(
queue_table=>'prod_queue_table',
queue_name=>'prod_queue');
end;
/
3.7.2创建Backup流队列
#以strmadmin身份,登录从数据库。
connectstrmadmin/strmadmin
begin
dbms_streams_adm.set_up_queue(
queue_table=>'h10g_queue_table',
queue_name=>'h10g_queue');
end;
/
3.8创建捕获进程
#以strmadmin身份,登录主数据库。
提醒一下,本文档以hr用户做示例。
connectstrmadmin/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的空用户。
expuserid=hr/hr@prodfile='/tmp/hr.dmp'object_consistent=yrows=y
impuserid=system/manager@h10gfile='/tmp/hr.dmp'ignore=ycommit=ylog='/tmp/hr.log'streams_instantiation=yfromuser=hrtouser=hr
3.10创建传播进程
#以strmadmin身份,登录主数据库。
connectstrmadmin/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;
/
3.11创建应用进程
#以strmadmin身份,登录从数据库。
connectstrmadmin/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身份,登录从数据库。
connectstrmadmin/strmadmin
#启动Apply进程
begin
dbms_apply_adm.start_apply(
apply_name=>'apply_h10g');
end;
/
#以strmadmin身份,登录主数据库。
connectstrmadmin/strmadmin
#启动Capture进程
begin
dbms_capture_adm.start_capture(
capture_name=>'capture_prod');
end;
/
3.13停止STREAM
#以strmadmin身份,登录主数据库。
connectstrmadmin/strmadmin
#停止Capture进程
begin
dbms_capture_adm.stop_capture(
capture_name=>'capture_prod');
end;
/
#以strmadmin身份,登录从数据库。
connectstrmadmin/strmadmin
#停止Apply进程
begin
dbms_apply_adm.stop_apply(
apply_name=>'apply_h10g');
end;
/
3.14清除所有配置信息
要清楚Stream配置信息,需要先执行3.13,停止Stream进程。
#以strmadmin身份,登录主数据库。
connectstrmadmin/strmadmin
execDBMS_STREAMS_ADM.remove_streams_configuration();
#以strmadmin身份,登录从数据库。
connectstrmadmin/strmadmin
execDBMS_STREAMS_ADM.remove_streams_configuration();
4测试场景
本文档建立了针对hr用户的Stream复制环境,如果没有特别声明,以下测试场景均以hr用户身份执行。
4.1建一张表测试
主数据库
SQL>CREATETABLETTT(idNUMBERPRIMARYKEY,
2nameVARCHAR2(50)
3)
4/
Tablecreated.
从数据库
SQL>descTTT
NameNull?
Type
-------------------------------
IDNOTNULLNUMBER
NAMEVARCHAR2(50)
4.2表中插入一行数据
主数据库
SQL>insertintotttvalues(1,'sdfsdfsdfsdf');
1rowcreated.
SQL>commit;
Commitcomplete.
SQL>
从数据库
SQL>select*fromTTT;
IDNAME
------------------------------
1sdfsdfsdfsdf
4.3变更一下表的结构,添加一列
主数据库
SQL>ALTERTABLETTTADD(ageNUMBER
(2));
Tablealtered
从数据库
SQL>descTTT
NameNull?
Type
---------------------------------
IDNOTNULLNUMBER
NAMEVARCHAR2(50)
AGENUMBER
(2)
4.4将表换一个表空间
主数据库
SQL>SELECTtable_name,tablespace_nameFROMuser_tables
2 WHEREtable_name='TTT';
TABLE_NAMETABLESPACE_NAME
------------------------------------------------------------
TTTUSERS
SQL>ALTERTABLETTTMOVETABLESPACEtbs_stream;
Tablealtered
SQL>SELECTtable_name,tablespace_nameFROMuser_tables
WHEREtable_name='TTT';
TABLE_NAMETABLESPACE_NAME
------------------------------------------------------------
TTTTBS_STREAM
从数据库
SQL>SELECTtable_name,tablespace_nameFROMuser_tables
WHEREtable_name='TTT';
TABLE_NAMETABLESPACE_NAME
------------------------------------------------------------
TTTTBS_STREAM
4.5表上Name列建一索引
主数据库
SQL>CREATEINDEXttt_name_idxONTTT(name);
Indexcreated
从数据库
SQL>SELECTtable_name,index_nameFROMuser_indexesWHEREtable_name='TTT';
TABLE_NAMEINDEX_NAME
------------------------------ ------------------------------
TTTTTT_NAME_IDX
TTTSYS_C005721
4.6Rebuild索引测试
主数据库
SQL>ALTERINDEXttt_name_idxREBUILD;
Indexaltered
从数据库
SQL>SELECTtable_name,index_nameFROMuser_indexesWHEREtable_name='TTT';
TABLE_NAMEINDEX_NAME
------------------------------ ------------------------------
TTTTTT_NAME_IDX
TTTSYS_C005721
4.7索引换一个表空间测试
主数据库
SQL>ALTERINDEXttt_name_idxREBUILDTABLESPACEtbs_stream;
Indexaltered
从数据库
SQL>SELECTtable_name,index_name,tablespace_nameFRO