Está en la página 1de 5

El escenario esta montado como Oracle 10g como origen y Oracle 11gR2 como destin o. *.

- No se puede hacer como origen 11g y 10gR1 como destino (Bug. 553017.1) 1. Esta en modo archive en el origen. 2. Configurar los siguientes parametros (Origen y Destino): alter system set global_names=true; (Permite que cada BD de Oracle Streams sea reconocida como un identificador unico, con esto Oracle nos obliga que los dblinks se llamen igual al nombre del dbname, por default el dbname es el nombre de la bd + domain) alter system set undo_retention=3600; alter system set job_queue_processes=16; alter system set streams_pool_size=20M; 3. Crear el usuario de streams con su tablespace En Origen: create tablespace streams datafile '/u02/oradata/ORA11R1/streams01.dbf' siz e 500M autoextend on next 100M maxsize 2G; create user ustreams identified by oracle10g default tablespace streams tem porary tablespace TEMP; grant connect, resource, dba, aq_administrator_role to ustreams; execute dbms_streams_auth.grant_admin_privilege(grantee=>'ustreams',grant_p rivileges=>true); En Destino: create tablespace streams datafile '/u01/oradata/oas/streams01.dbf' size 50 0M autoextend on next 100M maxsize 2G; create user ustreams identified by oracle10g default tablespace streams tem porary tablespace TEMP; grant connect, resource, dba, aq_administrator_role to ustreams; execute dbms_streams_auth.grant_admin_privilege(grantee=>'ustreams',grant_p rivileges=>true); 4. Registrar entradas en el tnsnames de cada servidor para que se vea cada insta ncia: En Origen: ORA11R2a = ( DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.68.1.10)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORA11R2) ) ) En Destino: ORA10R2a = ( DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.68.1.10)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORA10R2)

) ) 5. En el origen: select * from global_name; (Ejecutar en el destino) (Este sera el nombre del DBLINK, sino da el error: ORA-02085) (Crearlo en el origen) connect ustreams/oracle10g create database link ORA11R2 connect to ustreams identified by oracle10g usin g 'ORA11R2a'; En el destino: connect ustreams/oracle10g create database link ORA10R2 connect to ustreams identified by oracle10g usin g 'ORA10R2a'; Ojo: Puede ser que necesitemos modificar el global_name de este modo: update global_name set global_name = valor; Siempre que usamos un dblink Oracle concatena al dblink el valor de glob al_name. 6. En ambos servidores agregar el supplemental, esto agrega informacion adiciona l a todas las columnas que no sean NULL y cuya tabla no tenga un PK o Unique Constraint. alter database add supplemental log data; alter database add supplemental log data (primary key, unique index) columns; 7. En ambos servidores, creamos la cola de mensajes: connect ustreams/oracle10g execute dbms_streams_adm.set_up_queue (queue_table=>'USTREAMS.QTEST_TABLA',qu eue_name=>'USTREAMS.QTEST'); 8. En el Origen, creamos las reglas: connect ustreams/oracle10g begin dbms_streams_adm.add_schema_rules( schema_name=>'TEST', streams_type=>'capture', streams_name=>'STEST_capture', queue_name=>'QTEST', include_dml=>true, include_ddl=>true, include_tagged_lcr=>false, source_database=>NULL, inclusion_rule=>true ); end; / select * from dba_streams_schema_rules; 9. Export del esquema TEST: exp file=/tmp/test.dmp userid=system/oracle10g owner=TEST object_consistent= y scp /tmp/test.dmp oraqas@10.56.1.118:/tmp/. Lo importamos en el destino: (Se asume que el usuario ya existe en este servidor) imp userid=system/oracle10g file=/tmp/test.dmp full=y ignore=y streams_insta ntiation=y

10. Propagacion, en el Origen: connect ustreams/oracle10g begin dbms_streams_adm.add_schema_propagation_rules( schema_name=>'TEST', streams_name=>'STEST_propagation', source_queue_name=>'USTREAMS.QTEST', destination_queue_name=>'USTREAMS.QTEST@ORA11R1', include_dml=>true, include_ddl=>true, include_tagged_lcr=>false, source_database=>'ORA10R2', inclusion_rule=>true ); end; / *.- El source_database hace mencion al global name del origen. 11. Apply Process (Destino) connect ustreams/oracle10g begin dbms_streams_adm.add_schema_rules( schema_name=>'TEST', streams_type=>'apply', streams_name=>'STEST_apply', queue_name=>'QTEST', include_dml=>true, include_ddl=>true, include_tagged_lcr=>false, source_database=>'ORA10R2', inclusion_rule=>true ); end; / *.- El source_database hace mencion al global name del origen. 12. Iniciamos el proceso de captura y envio en el Origen: connect ustreams/oracle10g; execute dbms_capture_adm.start_capture(capture_name=>'STEST_capture'); 13. Iniciamos la aplicacion de lo enviado en el destino. connect ustreams/oracle10g execute dbms_apply_adm.start_apply(apply_name=>'STEST_apply'); Extras *.- Cuando inicializamos los servidores posterior a la configuracion ya el Oracl e Streams esta replicando automaticamente. *.- Si se desea remover toda la configuracion de Oracle Streams: execute DBMS_STREAMS_ADM.REMOVE_STREAMS_CONFIGURATION; *.- Visualizando errores: select QUEUE_NAME, ERROR_MESSAGE from dba_apply_error; select * from (select ERROR_MESSAGE, to_char(ERROR_CREATION_TIME,'HH24:MI:SS') f rom dba_apply_error order by 2 desc) where rownum<2;

*.- Visualizando configuracion: select select select select select * from dba_rules; * from dba_propagation; * from dba_capture; APPLY_NAME, STATUS from dba_apply; * from v$buffered_queues;

SELECT s.SUBSCRIBER_NAME, q.QUEUE_SCHEMA, q.QUEUE_NAME, s.LAST_DEQUEUED_SEQ, s.NUM_MSGS, s.TOTAL_SPILLED_MSG FROM V$BUFFERED_QUEUES q, V$BUFFERED_SUBSCRIBERS s, DBA_APPLY a WHERE q.QUEUE_ID = s.QUEUE_ID AND s.SUBSCRIBER_ADDRESS IS NULL AND s.SUBSCRIBER_ NAME = a.APPLY_NAME; *.- Manejando conflictos de tipo update (existe tambien insert/delete pero tiene otro tratamiento - ejemplo podemos crear campos que conforman el PK de forma que siempre seran unico, ejemplo colocando e ste valor: SELECT SYS_GUID() OID FROM DUAL) declare cols dbms_utility.name_array; begin cols(1):='CAMPO1'; cols(2):='CAMPO2'; dbms_apply_adm.set_update_conflict_handler(object_name=>'TEST.TEST', method_name=>'OVERWRITE',resolution_column=>'CAMPO1',column_list=>cols); end; / El overwrite indica que la transaccion que viene reemplazara a la actual, existe tambien DISCARD (anula el actual valor que viene a modificarse dejando el actual como vigente). *.- Manejando Conflictos personalizados. create or replace procedure emp_dml_handler(in_any IN ANYDATA) IS lcr SYS.LCR$_ROW_RECORD; rc PLS_INTEGER; command VARCHAR2(30); old_values SYS.LCR$_ROW_LIST; v_col SYS.ANYDATA; vtotal number:=0; vaux number:=0; begin -- Accediendo al LCR rc := in_any.getobject(lcr); -- Consiguiendo el tipo de operacion command := lcr.get_command_type(); if command = 'INSERT' then /* Ejemplo de algunos SET lcr.set_command_type('INSERT'); lcr.set_object_name('TEST'); */ -- Consiguiendo el valor nuevo ingresado v_col:=lcr.get_value('NEW','CAMPO1'); rc:=v_col.getnumber(vaux); select count(1) as total into vtotal from test.test where campo1=vaux;

if (vtotal>0) then delete from test.test where campo1=vaux; commit; lcr.execute(true); end if; end if; end; / --lcr.execute(true) indica que el conflicto es manejado por el handle. begin DBMS_APPLY_ADM.SET_DML_HANDLER( object_name=>'TEST.TEST', object_type=> 'TABLE', operation_name=>'INSERT', error_handler=> false, user_procedure=>'USTREAMS.emp_dml_handler'); end; / --Con error_handle en false indica que solo se hace rollback a la tx fallida el resto de transacciones que estaban pendientes son movidos a una tabla de excepciones. *.- Borrando los errores encolados delete from SYS.apply$_error; commit;

También podría gustarte