[English]
作者:
fuyuncat
来源:
www.HelloDBA.com
1. 创建并启动应用Connect STRMADMIN/STRMADMIN--创建应用/* Create the apply process using the following command */begindbms_apply_adm.create_apply(queue_name => 'strmadmin.queue_for_reptest',apply_name => 'apply_reptest',apply_captured => TRUE,apply_database_link => 'MSSQL');end;/--将创建好的规则加到应用进程上去,来指定复制的表/* Add rules to the apply process to specify which table changes *//* should be applied */beginDBMS_STREAMS_ADM.ADD_TABLE_RULES(Table_name=>'ORAREP.REP_TEST1',streams_type=>'apply',streams_name=>'APPLY_REPTEST',queue_name=> 'strmadmin.queue_for_reptest');end;/beginDBMS_STREAMS_ADM.ADD_TABLE_RULES(Table_name=>'ORAREP.REP_TEST2',streams_type=>'apply',streams_name=>'APPLY_REPTEST',queue_name=> 'strmadmin.queue_for_reptest');end;/--设置使应用进程在遇到错误时还能继续。/* Allow apply process to continue processing even if a data error occurs */execute dbms_apply_adm.set_parameter('apply_reptest','DISABLE_ON_ERROR','N') ;--启动应用进程/* Start the apply process */execute dbms_apply_adm.start_apply('apply_reptest') ;2. 设置表的实例化SCN(系统变化号)给应用Connect STRMADMIN/STRMADMINDECLAREiscn NUMBER; -- Variable to hold instantiation SCN valueBEGINiscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();dbms_apply_adm.set_table_instantiation_scn('ORAREP.REP_TEST1','ORA92',iscn, 'MSSQL');iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();dbms_apply_adm.set_table_instantiation_scn('ORAREP.REP_TEST2','ORA92',iscn, 'MSSQL');END;/3. 在Oracle端开始捕捉Connect STRMADMIN/STRMADMINexecute dbms_capture_adm.start_capture ('REPTEST_CAPTURE');--在Oracle端插入数据:conn orarep/orarepinsert into rep_test1 values (1, 'abcd');insert into rep_test2 values (1.0, 'abcd', sysdate);commit;--第一次捕捉可能最长需要等待10-15分钟“预热”时间(需要将两边的初始化数据字典信息传递给双方),通过查看视图v$streams_capture的captured_message_create_time是否是当前时间确定捕捉是否开始。select total_messages_captured,capture_message_create_time, total_messages_enqueued,enqueue_message_create_time, enqueue_message_number from v$streams_capture;--如果v$streams_apply_coordinator=v$streams_capture.enqueue_message_number则表示所有的变化都已经复制select total_received,total_assigned,total_applied, total_errors,hwm_message_number from v$streams_apply_coordinator;--检查streams的应用是否有错误:select * from dba_apply_error;--如果没有错误,则表示streams复制设置成功.一、设置Steams Replication复制到SQLServer的不同schema下
At apply-site create a transformation function when you want theapply process to apply changes to a different schema at SQL*Server.In the following example, the transformation function hs_trans_fun iscreated to apply changes from local 'TKHOUSER' schema to remote schema'sqluser'. This function changes the object owner to 'sqluser' beforeapplying the changes. When changing this code, remember that SQL*Serverobject names are case sensitive. Run the code below, then insert intoTKHOUSER.TKHRDT3. The values should be inserted into sqluser.TKHRDT3on SQL*Server instead of TKHOUSER.TKHRDT3 on SQL*Server.create or replace function hs_trans_fun(in_any IN sys.anydata) return sys.anydataislcr sys.lcr$_row_record;ret pls_integer;objnm varchar2(30);beginret := in_any.getobject(lcr);objnm := lcr.get_object_name;lcr.set_object_owner('"sqluser"');return sys.anydata.convertobject(lcr);end;/show errors;commit;execute dbms_rule_adm.drop_rule ('strmadmin.r_tran1');begindbms_rule_adm.create_rule_set(rule_set_name=>'strmadmin.hsapplyruleset',evaluation_context=>'sys.streams$_evaluation_context') ;end ;/declareaction_ctx sys.re$nv_list ;ac_name VARCHAR2(30) := 'STREAMS$_TRANSFORM_FUNCTION' ;beginaction_ctx := sys.re$nv_list(sys.re$nv_array()) ;action_ctx.add_pair(ac_name, sys.anydata.convertvarchar2('STRMADMIN.HS_TRANS_FUN')) ;dbms_rule_adm.create_rule(rule_name=>'strmadmin.r_tran1',condition=>':dml.get_object_owner() = ''TKHOUSER'' AND ' || ':dml.is_null_tag() = ''Y''',evaluation_context=>'sys.streams$_evaluation_context',action_context => action_ctx) ;dbms_rule_adm.add_rule(rule_set_name=>'strmadmin.hsapplyruleset',rule_name=>'strmadmin.r_tran1') ;end ;/commit ;select rs.rule_set_name, r.rule_owner, r.rule_name, r.rule_conditionfrom dba_rules r, dba_rule_set_rules rswhere rs.rule_name = r.rule_name andrs.rule_owner = r.rule_ownerorder by rs.rule_set_name, r.rule_name;execute dbms_apply_adm.alter_apply ('apply_to_SQLServer','strmadmin.hsapplyruleset');二、Debug Trace
通过在tg4msql.ora文件中设置以下行,可以打开透明网关的debug tracehs_fds_trace_level=debug通过视图dba_apply_error可以看streams复制中的错误信息。三、常见错误及解决办法
/********************************************************************/ORA-28509: unable to establish a connection to non-Oracle systemORA-02063: preceding line from TG4MSQL/********************************************************************/cause:This indicates a problem with the Oracle configuration files.Action:Make sure the HOST parameter in the tnsnames.ora file is correct.Make sure the PORT number is correct.Make sure the SID name is correct in both the TNSNAMES.ORA and LISTENER.ORA/********************************************************************/ORA-28500: connection from ORACLE to a non-Oracle system returned this message:[Transparent gateway for MS SQL Server] The environment variable<HS_FDS_CONNECT_INFO> is not set.ORA-02063: preceding 2 lines from TG4MSQL/********************************************************************/cause:Incorrect parameter settings in the HS init.ora file.Action:Check HS_FDS_CONNECT_INFO in the TG4MSQL init.ora file.It might be missing or TG4MSQL is not able to find the correctinitialisation file.Make sure the HS init.ora file exists in the ORACLE_HOME\tg4msql\admindirectory and has the same name as the SID in the LISTENER.ORA.Example: If SID=mssql in the listener.ora file, then the nit.ora filewould be named ORACLE_HOME\hs\admin\initmssql.ora/********************************************************************/ORA-00942: table or view does not exist[Transparent gateway for ODBC]DRV_OpenTable: [Mircosoft ][ODBC SQL ServerDriver][SQL Server]Invalid object name '%table%'. (SQL State: S0002; SQL Code:208)ORA-02063: preceding 2 lines from TG4MSQL/********************************************************************/cause:The init.ora file speciffies the wrong MS SQL Server database.A second cause could be, that MS SQL Server tables are case sensitiveand thus should be surrounded by double quotes.四、总结:
此次测试是使用的9205的streams replication和9205的transparent gateway(期间尝试过)实现的。配置过程中出现过各种问题,并且还发现了一个bug(已经在metalink上创建bug号5191525)。总体感觉要通过这种方式来实现异构数据库实时数据同步还不成熟。本来我们有项目打算采用这种方式来做,但整个测试做下来,觉得风险太大,最终还是采用自己写中间件的方式来做。不知道在10g后,是否会更成熟一些。