技术开发 频道

stream replication初步研究

    Stream在10gR2的新特征

    在新推出的10gR2中,stream的增强与10gR1很相似,也集中在以下几个方面:stream性能增强、stream配置与管理增强、stream复制增强、stream监控增强、stream规则接口增强、stream信息提供增强等。

    实时远程捕获(Real-Time DownStream Capture)

    在9iR2中,stream不支持downstream capture,stream的捕获进程只能在本地处理归档;在10gR1中,stream支持Archvied Log-DownStream Capture,在远程数据库挖掘从源库传送过来的归档日志;在10gR2中,stream支持Real-Time DownStream Capture,可以在远程数据库的standby redo log中挖掘从源库传来的事务,即减轻了源库的压力,又降低了源库到目标库间数据同步的延迟。Real-Time DownStream Capture如下图所示:


图8实时远程捕获过程

    Stream Pool的变化

    较10gR1而言,stream pool主要有2个方面的改进。一是stream pool的自动共享内存管理,如果sga_target参数大于零,则stream pool从sga_target中动态分配,可避免因stream pool评估不足带来的问题;二是在oem中提供了配置与管理stream pool的GUI接口,可以在web browse中控制stream pool的大小。

    传播进程的变化

    在10gR1中,传播进程是由dbms_aqadm来调度的,实际没有启动及停止传播进程的接口;在10gR2中,由dbms_propagation_adm包提供了start_propagation与stop_propagation过程来启动与停止传播进程。

    stream复制配置的简化

    在10gR2中,stream的配置已经做了很大的简化,以前需要执行多个过程才可以搞定的事情,现在只需要执行很少的核心过程就可以搭建起复制环境,了解并研究这些过程的功能,可以使我们在实际项目选择合适的过程。

    包dbms_streams_adm新提供的用于简化复制环境配置的过程,其中maintain_*类过程主要利于10g中的expdp与impdp来同步初始数据,而*_instantiation_setup过程主要利用rman来同步初始数据。

    pre/post_instantiation_setup过程需配对使用,它们可以完成global(全库)与transportable tablespace(表空间)两种级别的复制配置;maintain_global、maintain_schemas、maintain_simple_tts、maintain_tables、maintain_tts等过程可以完成从库级、模式级、表空间级、表级等各种各样的复制配置。

    由于pre/post_instantiation_setup过程用rman进行同步初始数据,它们对于数据库的大小没有什么限制,通常数据库比较大,用pre/post_instantiation_setup过程就比较有优越性,因为rman可以减少数据同步时间,但pre/post_instantiation_setup过程在配置全库复制或表空间级复制时,不能初始化目标库的scn。

    由于maintain_global/schemas/tables/tts/simple_tts过程用expdp与impdp进行同步初始数据,一般来讲,如果数据库较小,那用maintain_global/schemas/tables/tts/simple_tts过程会比较简单一些,几乎只执行maintain_global/schemas/tables/tts/simple_tts中的一个过程就可以搞定全库、表空间、模式、表级复制中的某种类型的复制配置,而且这些过程在同步数据时,还可以完成初始化目标数据库的scn;如果你不是很熟悉rman,那maintain_*过程也可以帮我们完成想要的复制配置;如果仅仅从功能上讲,maintain_*过程更灵活一些,由于pre/post_instantiation_setup过程只可以完成全库与表空间级的复制,那表级、模式级复制就非maintain_*过程莫属。

    rman在stream中的应用

    在10gR2中,rman新的transport tablespace命令,源库的表空间在online的状态,可以设置表空间的instantiation,目标库可以用dbms_streams_tablespace_adm的attach_tablespaces过程添加该表空间,也可以impdp来添加该表空间;当复制环境中源库与目标库的处于不同的平台,但有相同的endian format时,rman的convert database命令可以为目标库设置instantiation状态。

    应用进程允许应用重复行

    在10gR2以前的版本,如果应用进程在应用LCRs时遇到表中有重复记录时,将会在dba_apply_error中记录一个异常;在10gR2中,应用进程的allow_duplicate_rows参数可以控制应用进程允许应用进程应用重复的LCRs,应用进程的参数查dba_apply_parameters字典表,修改该参数需用dbms_apply_adm的set_parameter过程;该参数默认是不允许应用进程应用重复的LCRs。

select apply_name,parameter,value from dba_apply_parameters APPLY_NAMEPARAMETER VALUE ------------------------------ ------------------------------------- ------------ APPLY$_TEST96_22 ALLOW_DUPLICATE_ROWS N

    监控长时间运行的事务

    在10gR2中,为了监控长时间运行的事务,stream提供了V$STREAMS_TRANSACTION字典表,不仅可以查看捕获进程或应用进程已经处理过的长时间运行的事务,而且可以查到该长事务处理了多少LCRS、开始时间与结束时间等。

select streams_name,streams_type,total_message_count from v$streams_transaction;

    应用进程的LCRs应用增强

    在10gR1及以前的版本中,应用进程只能应用row LCRs,而不能应用user-constructed LCRs;在10gR2中,应用进程可以应用队列中的row LCRs与user-constructed LCRs,极大地增强了应用进程的功能。

    10gR2中Stream的多源全库复制配置

在10gR2中,oracle简化了stream复制配置的过程,以前需要为stream的捕获、传播、应用进程配置的步骤已经被dbms_streams_adm新提供的过程替代,只需要一两个过程就可以完成stream复制配置啦,下文将以stream的多源全库复制配置为例,介绍dbms_streams_adm新提供的pre_instantiation_setup/post_instantiation_setup过程。

    源库与目标库初始化参数设置

alter system set aq_tm_processes=4 scope=spfile; alter system set job_queue_processes=5 scope=spfile; alter system set global_names=true scope=spfile; alter system set streams_pool_size=51m scope=spfile;

    说明:在生产库上,streams_pool_size参数最好大于200m,如果不设置streams_pool_size参数,streams_pool_size池将用shared_pool_size池十分之一的内存;在10gR2中,AWR可以监控streams_pool_size池的使用情况,也可从v$sgastat中查看streams_pool_size池的使用,根据监控的结果,为streams_pool_size设置合适的值。

    源库与目标库网络服务名设置

    确保源库与目标库的网络服务名配置正确,可以用tnsping测试通过。

TEST96 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.108.95)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = test))) TEST99 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.108.99)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = test)))

    源库与目标库复制管理员创建

create user strmadmin identified by &passwd default tablespace &tbs_name quota unlimited on &tbs_name; grant dba to strmadmin;

    说明:在9iR2,如果复制管理员不授予dba角色,所有的ddl操作因权限不足被忽略;在10gR2中,复制管理员的授权已经做了简化,不必象9iR2一样授予复制管理员一堆权限,只授予dba权限就够啦。

    源库与目标库数据库链的创建

connect strmadmin/strmadminpw@test96; create database link t99.net connect to strmadmin identified by &passwd using 'test99'; connect strmadmin/strmadminpw@test99; create database link t96.net connect to strmadmin identified by &passwd using 'test96';

    说明:必须确保源库与目标库的数据库链是连通的,否则在使用dbms_streams_adm的pre_instantiation_setup/post_instantiation_setup过程配置复制时会失败;database link的命名必须使用db_name.domain的格式,否则pre_instantiation_setup/post_instantiation_setup过程配置复制时会报错。

    源库与目标库数据库必须归档

shutdown immediate; startup mount; alter database archivelog; alter database open;

    执行pre_instantiation_setup过程

    首先介绍一下pre_instantiation_setup过程的参数:

    maintain_mode参数可取global与 transportable tablespaces,如果该参数取global时,表示stream进行全库复制,否则表示stream进行表空间复制,需要在tablespace_names参数中指定待复制的一个或多个表空间。

    perform_actions参数为true,stream配置脚本执行过程将记录在dba_recoverable_script字典表,如果pre_instantiation_setup执行时遇到错误,可以通过执行dbms_steams_adm的recover_operation过程在更正错误后继续执行stream复制配置。

    source_database/destination_database参数是指向源库与目标库的database link,该必须确保正确啊,否则pre_instantiation_setup过程将会失败,报ora-23621错误,解决办法就是清空dba_recoverable_*字典表,更正错误后再执行pre_instantiation_setup过程。

    bi_directional参数设置为true时,表示是stream是多源复制,即目标与源库双向复制对象与数据,否则只从源库向目标库复制对象与数据;exclude_schemas参数指出全库复制时不参与复制表空间,如果有多个表空间不参与复制的话,可以用逗号分开;start_processes参数指stream配置完成后启动捕获、传播及应用进程。

SQL>connect strmadmin/strmadminpw@test96; declare v_tts dbms_streams_tablespace_adm.tablespace_set; begin dbms_streams_adm.pre_instantiation_setup( maintain_mode => 'global', tablespace_names => v_tts, source_database => 't96.net', destination_database => 't99.net', perform_actions => true, bi_directional => true, include_ddl => true, start_processes => true, exclude_schemas => 'wmsys,strmadmin,dbsnmp,tsmsys,outln', exclude_flags => dbms_streams_adm.exclude_flags_unsupported + dbms_streams_adm.exclude_flags_dml + dbms_streams_adm.exclude_flags_ddl); end; /

    执行pre_instantiation_setup过程出错处理

    在执行pre_instantiation_setup过程时可能会出错,比如报错ora-23621: Operation corresponding to script FC582A17725C1841E030007F01000822 is in progress等错误,更正引起pre_instantiation_setup过程出错的原因,然后调用dbms_streams_adm的recover_operation过程继续进行stream复制配置,也可用recover_operation过程清空dba_recoverable_*字典表,重新执行pre_instantiation_setup过程。

begin dbms_streams_adm.recover_operation( script_id => 'FC582A17725C1841E030007F01000822', operation_mode => 'FORWARD'); end; /

    说明:recover_operation过程是10gR2新增的功能,它不仅可用于pre_instantiation_setup过程中,还可以用于maintain_global/scheams/tables/tts/simple_tts等过程;recover_operation过程的operation_mode参数有三个取值:forward、rollback、purge,forward表示继续进行,rollback表示回滚操作,purge表示清除dba_recoverable_script字典表。

    用rman复制源库到目标库

    对源库用rman进行备份,并拷贝源库的备份集到目标库,同时将目标库down下来,启动nomount状态,用于目标库的恢复操作;备份完毕后,需求得源库当前的scn,用于目标库恢复到源库当前的scn;目标库恢复后需要重新创建database link,必须确保源库与目标库的database link可以连接,否则post_instantiation_setup过程将会失败。

$rman nocatalog target / $rman>backup database plus archivelog delete input; SQL>connect strmadmin/strmadminpw@test96; SQL>set serveroutput on size 1000 SQL>declare until_scn number; begin until_scn:= dbms_flashback.get_system_change_number; dbms_output.put_line('until scn: '||until_scn); end; / until scn: 429596 $rman nocatalog target / $rman> connect auxiliary sys/sys@test99; $rman> run { set until scn 429596; duplicate target database to 'TEST' nofilenamecheck open restricted; } SQL>alter database rename global_name to test99.net; SQL>connect strmadmin/strmadminpw@test99; SQL>drop database link t96.net; SQL>create database link t96.net connect to strmadmin identified by &passwd using 'test96';

    执行post_instantiation_setup过程

    用post_instantiation_setup过程与pre_instantiation_setup过程配置stream复制时,它们必须成对使用,而且只需要在源库执行即可,当post_instantiation_setup过程执行成功后,stream复制基本上已经成功,当执行post_instantiation_setup过程时,需要注意的参数是instantiation_scn,它的取值是我们从源库上获的scn的值减1(429595)。

SQL>connect strmadmin/strmadminpw@test96; SQL>declare v_tts dbms_streams_tablespace_adm.tablespace_set; begin dbms_streams_adm.post_instantiation_setup( maintain_mode => 'global', tablespace_names => v_tts, source_database => 't96.net', destination_database => 't99.net', perform_actions => true, bi_directional => true, include_ddl => true, start_processes => true, instantiation_scn => 429595, exclude_schemas => ' wmsys,strmadmin,dbsnmp,tsmsys,outln', exclude_flags => dbms_streams_adm.exclude_flags_unsupported + dbms_streams_adm.exclude_flags_dml + dbms_streams_adm.exclude_flags_ddl); end; / SQL>connect sys/sys@test99 as sysdba; SQL>alter system disable restricted session;

    说明:当post_instantiation_setup过程执行成功后,注意取消会话限制,然后要测试stream的双向复制配置是否成功,测试方法比较简单,在源库与目标库下各创建一个schema,并创建一表些并添加测试数据:

    ?  在test96上创建schema并在该schema下创建一些对象,可以在test99上看到

    ?  在test99上创建schema并在该schema下创建一些对象,可以在test96上看到

    stream双向复制中avoid change cycling

    关于多源复制中redo entry的递归应用问题,stream中有很好的消除机制,源库与目标库正常事务写入的redo entry的tag是00,而源库与目标库的apply进程应用LCRs产生的redo entry的tag标志是非00值,这样源库与目标库的捕获进程在捕获的redo entry中,过虑掉tag值非00的redo entry项,就可以消除多源复制的change cycling。

    查看源库与目标库应用进程的tag:

SQL>column apply_name heading 'apply process name' format a30 SQL>column apply_tag heading 'tag value' format a30 SQL>connect sys/sys@test96 as sysdba; SQL>select apply_name, apply_tag from dba_apply; Apply Process Name Tag Value APPLY$_TEST96_42 010781 SQL>column apply_name heading 'apply process name' format a30 SQL>column apply_tag heading 'tag value' format a30 SQL>connect sys/sys@test99 as sysdba; SQL>select apply_name, apply_tag from dba_apply; Apply Process Name Tag Value APPLY$_TEST99_15 010498

    10gR2中Stream的单源模式复制配置

上一节介绍了per/post_instantiation_setup过程进行多源全库复制(rman同步数据)的配置步骤;本节介绍maintain_global/schemas/tables等过程配置复制(expdp/impdp同步数据)的步骤,这些过程配置复制步骤是相似的,现以模式级复制为例,介绍maintain_schemas过程的配置复制的方法。

    关于maintain_global过程的测试案例,见http://blog.itpub.net/post/96/36365

    关于maintain_tables过程的测试案例,见http://blog.itpub.net/post/96/37044

    无论是用per/post_instantiation_setup过程还是maintain_schemas过程进行复制配置,它们前期的准备工作都是相似的,现写出maintain_schemas过程前期准备的步骤,可以将上一节中介绍的per/post_instantiation_setup过程的配置步骤拷贝过来用的:

    源库与目标库初始化参数设置

    源库与目标库网络服务名设置

    源库与目标库复制管理员创建

    源库与目标库数据库链的创建

    源库与目标库数据库必须归档

    源库与目标库数据库创建目录

    复制前期的准备工作就绪后,需要确定maintain_schemas过程参数的实参,特别要注意schema_names参数,它有两种格式:一种是dbms_utility.uncl_array类型的变量,一种是以逗号分隔开的字符串列表。

SQL>connect strmadmin/strmadminpw@test96; SQL>begin dbms_streams_adm.maintain_schemas( schema_names => 'yekai,xzh2000', source_directory_object => null, destination_directory_object => null, source_database => 'test96.net', destination_database => 'test99.net', perform_actions => true, bi_directiona=> false, include_ddl => true, instantiation => dbms_streams_adm.instantiation_schema_network); end; /

    说明:当perform_actions参数等于true时,就不必在源库与目标库创建上directory对象,source_directory_object/ destination_directory_object为空,perform_actions参数等于false时,必须在源库与目标库创建directory,并为source_directory_object/ destination_directory_object赋值,这时并不执行stream复制配置,它只是在相应的directory中产生了配置复制的脚本;bi_directional参数等于flase,表示schema级的复制是单源复制,它从源库复制yekai、xzh2000模式的改变到到目标库;include_ddl参数表示允许复制yekai、xzh2000这个模式中发生的ddl变化;instantiation参数的值表示通过expdp/impdp初始化目标库的数据时,直接通过network初始化目标库的scn的值;如果在执行maintain_schemas过程时出错,可以按照上节介绍的recover_operation过程来处理,recover_operation过程同样适用maintain_*等过程。

     

0
相关文章