sql >> Base de Datos >  >> RDS >> Oracle

Ejemplo de replicación paso a paso de Oracle Streams

¿Qué es el sistema de copia de seguridad en tiempo real de Oracle?

La replicación de Oracle Streams es el proceso que permite que el esquema de la base de datos de Oracle se replique en otra base de datos de Oracle, que se puede ubicar en cualquier ubicación. Cada vez que se produce una transacción en la base de datos principal DML o DDL, se ejecutará inmediatamente en la base de datos de destino para mantener una copia de seguridad activa. A continuación, explico y proporciono scripts para el ejemplo de replicación paso a paso de Oracle Streams.

Configuración de replicación de Oracle Streams

En esta publicación, describo los pasos para crear una replicación de la base de datos de Oracle a través de la función Oracle Streams, para una base de datos en espera o una base de datos que se puede usar para fines de informes y análisis o cualquier otro propósito. Esta función de Oracle Streams es compatible con Oracle 11g Enterprise Edition y 10gR2 y 9iR2. Oracle Streams ya no se admite en 12c; ahora Oracle está utilizando Oracle Golden Gate para esta característica. A continuación, describí pasos simples para crear una replicación en otra base de datos de Oracle, para cada paso proporciono un script SQL que puede copiar y guardar como paso 1, paso 2, etc. , luego ejecute los scripts uno por uno para configurar la replicación. Pero antes de ejecutar los scripts, cambie los valores a sus valores que están entre corchetes [] y reemplácelos con cuidado, todos los valores entre corchetes tienen nombres completos, así que cambie respectivamente.

¡Importante! Cree una entrada en tnsname.ora para las bases de datos de origen y de destino para cada conexión.

Paso-1 Configuración de la base de datos de destino o secundaria

CONECTAR [TARGET_SYS_CONNECTION] COMO SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH;alter system set global_names=TRUE scope=BOTH;alter system set job_queue_processes=6 scope=AMBOS;alter system set streams_pool_size=100M scope=AMBOS;alter system set undo_retention=3600 scope=BOTH;apagado inmediato;montaje de inicio;alter base de datos abierta;

Paso 2 Configuración de la fuente o la base de datos principal

CONECTAR [SOURCE_SYS_CONNECTION1] COMO SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH;alter system set global_names=TRUE scope=BOTH;alter system set job_queue_processes=6 scope=AMBOS;alter system set streams_pool_size=48M scope=BOTH;ALTER SYSTEM SET SMTP_OUT_SERVER='[MAIL_SERVER] [MAIL_PORT]' SCOPE=BOTH;--- UNDO_RETENTION=86400alter system set undo_retention=3600 scope=BOTH;--- UNDO_MANAGEMENT=AUTOAlter System Set LOG_ARCHIVE_DEST_1 ='[ARCHIVELOG_DESTINATION]' Scope=Spfile;Alter System Establezca LOG_ARCHIVE_DEST_STATE_1=habilitar ámbito=Spfile;apagar inmediatamente;montaje de inicio;alterar el registro de archivo de la base de datos;alterar la apertura de la base de datos;Alterar la base de datos Agregar columnas de datos de registro suplementarios (clave principal, única, clave externa);

Paso 3 Crear espacio de tablas para la base de datos de origen

conectar [source_sys_connection1] como sysdba; crear espacio de tablas [logminer_ts_name] archivo de datos '[logminer_datafile]' tamaño 100 m reutilizar extensión automática en tamaño máximo ilimitado; ejecutar dbms_logmnr_d.set_tablespace ('[logminer_ts_name]'); crear espacio de tablas [stream_ts_name] archivo de datos '[stream_datafile]' tamaño 100 m reutilizar autoextender en maxsize ilimitado;

Paso 4 Crear un usuario administrador de Oracle Streams para la base de datos de origen

conectar [source_sys_connection1] como sysdba;

crear usuario [source_stream_admin]  identificado por [source_stream_psw]  tablespace predeterminado [stream_ts_name]  tablespace temporal; -- 9 roles para [source_stream_admin]  conceder recursos a [source_stream_admin]; otorgar datapump_imp_full_database a [source_stream_admin]; otorgar imp_full_database a [source_stream_admin]; otorgar datapump_exp_full_database a [source_stream_admin]; otorgar exp_full_database a [source_stream_admin]; otorgar dba a [source_stream_admin]; otorgar conexión a [source_stream_admin]; conceder aq_administrator_role a [source_stream_admin]; otorgar select_catalog_role a [source_stream_admin]; alterar el recurso de rol predeterminado del usuario [source_stream_admin], imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 privilegios del sistema para [source_stream_admin]  beginsys.dbms_rule_adm.grant_system_privilege(  privilegio    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_aqadm.grant_system_privilege (=> 'dequeue_any',  grantee      => '[source_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilegio    => sys.dbms_rule_adm.alter_any_rule,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilegio    => sys.dbms_rule_adm.create_rule_obj,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  otorga espacio de tabla ilimitado a [source_stream_admin]; otorgar sesión restringida a [source_stream_admin]; beginsys.dbms_rule_adm.grant_system_privilege (privilege => sys.dbms_rule_adm.execute_any_rule_set, otoree => '[fuente_stream_admin]', concesión_option => true); end;/beginsys.dbms_rule_adm.grant_system_privileGe (privilegio (privilegio> '[source_stream_admin]',  grant_option => true);end;/  otorgar sesión de creación a [source_stream_admin]; beginsys.dbms_aqadm.grant_system_privilege ( privilege    => 'enqueue_any', grantee      => '[source_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege( privilege    => sys.dbms_rule_adm.execute_any_rule '  =ee >rule ' [source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilegio    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm .grant_system_privilege(  privilegio    => sys.dbms_rule_adm.create_evaluation_context_obj,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_aqadm.grant_system_privilege (  privilegio    => 'manage_any', grant_stream _   ] ',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilegio    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[source_stream_admin]',  grant_option => true);end;
/

Paso 5 Creación de administrador de secuencias para la base de datos de destino

conectar [target_sys_connection] como sysdba;

--- ejecutar como usuario del sistema en el usuario targetcreate [target_stream_admin] identificado por [target_stream_psw]; -- 9 roles para strmadmin  otorgan recursos a [target_stream_admin]; otorgar datapump_imp_full_database a [target_stream_admin]; otorgar imp_full_database a [target_stream_admin]; otorgar datapump_exp_full_database a [target_stream_admin]; otorgar exp_full_database a [target_stream_admin]; otorgar dba a [target_stream_admin]; otorgar conexión a [target_stream_admin]; conceder aq_administrator_role a [target_stream_admin]; otorgar select_catalog_role a [target_stream_admin]; alterar el recurso de rol predeterminado del usuario [target_stream_admin], imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 privilegios del sistema para [target_stream_admin]  beginsys.dbms_rule_adm.grant_system_privilege(  privilegio    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[target_stream_admin]',  grant_option => true);> 'dequeue_any',  grantee      => '[target_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilegio    => sys.dbms_rule_adm.alter_any_rule,  grantee      => '[target_stream_admin]',  grant_option true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilegio    => sys.dbms_rule_adm.create_rule_obj,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  otorga espacio de tabla ilimitado a [target_stream_admin]; otorgar sesión restringida a [target_stream_admin]; beginsys.dbms_rule_adm.grant_system_privilege (privilege => sys.dbms_rule_adm.execute_any_rule_set, otoree => '[target_stream_admin]', concesión_option => true); end;/beginsys.dbms_rule_adm.grant_system_privileGe (privilegio (privilegio> '[target_stream_admin]',  grant_option => true);end;/  otorgar sesión de creación a [target_stream_admin]; beginsys.dbms_aqadm.grant_system_privilege (  privilegio    => 'enqueue_any',  grantee      => '[target_stream_admin]',  admin_option => verdadero); [target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilegio    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm .grant_system_privilege(  privilegio    => sys.dbms_rule_adm.create_evaluation_context_obj,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_aqadm.grant_system_privilege (  privilegio    => 'manage_any', grantee=_ ' ',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilegio    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[target_stream_admin]',  grant_option => true);end;/

Paso 6 Creación de un enlace de base de datos para la base de datos de origen

conectar [source_stream_connection]

--- enlace para la base de datos de destino... crear enlace de base de datos [source_dblink] conectar a [target_stream_admin] identificado por [target_stream_psw] usando '[target_connect_string]';

Paso 7 Creación de un enlace de base de datos para la base de datos de destino

conectar [target_stream_connection]

crear un enlace de base de datos [target_dblink] conectarse a [source_stream_admin] identificado por [source_stream_psw] usando '[source_connect_string]';

Paso 8 Creación del directorio Datapumb en la base de datos de destino

conectar [target_stream_connection]

crear o reemplazar directorio[target_datapump_dir] como '[target_dir_ubicación]';

Paso 9 Creación del proceso de captura en la base de datos de origen

desactivar el eco; ---aceptar el indicador strm_pwd_src 'ingresar la contraseña del administrador de flujos "strmadmin" en el origen:' ocultar ---aceptar el indicador strm_pwd_dest 'ingresar la contraseña del administrador de flujos "strmadmin" en el destino:' ocultar conectar [source_stream_connection]; declarar  el cursor vin es    seleccionar el nombre del conjunto de reglas from dba_rulesets where propietario ='[source_stream_admin]';begin for i in vin loop begin  dbms_rule_adm.drop_rule_set(    rule_set_name => '[source_stream_admin].'||i.ruleset_name,    delete_rules  => true); excepción cuando otros entonces nulo; fin; end loop;end;/begin  dbms_streams_adm.set_up_queue(    queue_table => '"streams_capture_qt"',    queue_name  => '"streams_capture_q"',    queue_user  => '"[source_stream_admin]"');end;/begin  dbms_streams_adm.add_schema_ propagation_rules => '"[source_schema]"',   streams_name           => '"streams_propagation1"',    source_queue_name      => '"strmadmin"."streams_capture_q"',    destination_queue_name => '"strmadmin"."streams_apply_q"@[source_dblink]',    include_dml verdadero, inclusive_ddl => true, fuente_database => '[fuente_database]', inclusion_rule => true); end;/commit; begin dbms_streams_adm.add_schema_rules (esquema_name => '"[fuente_schema]"', streams_type => 'Capture ',    streams_name       => '"streams_capture"',    queue_name         => '"[source_stream_admin]"."streams_capture_q"',    include_dml        => true,    include_ddl        => true,    include_tagged_lcr => false,    inclusio n_rule     => true);end;/-- repita los 2 pasos anteriores para cada esquemacommit;declare cursor vin is    select table_namefrom dba_streams_unsupportedwhere propietario ='[source_schema]';beginfor c in vin loop dbms_streams_adm.add_table_rules ( table_name => '[source_schema] .'||c.table_name, streams_type => 'capture', streams_name => 'streams_capture', queue_name => '[source_stream_admin].streams_capture_q', include_dml => true, include_ddl => false, inclusion_rule => false, source_database => '[source_database]' );finalizar ciclo;commit;fin;/

Paso 10 Creación del proceso Aplicar en la base de datos de destino

conectar [target_stream_connection]

begin  dbms_streams_adm.set_up_queue(    queue_table => '"streams_apply_qt"',    queue_name  => '"streams_apply_q"',    queue_user  => '"[target_stream_admin]"');end;/begin  dbms_streams_adm.add_schema_rules(    =chema_name ]"',    streams_type       => 'apply',    streams_name       => '"streams_apply"',    queue_name         => '"[target_stream_admin]"."streams_apply_q"',    include_dml        => true,    include_ddl         regla_inclusión     => true);end;/commit;begin  dbms_apply_adm.set_parameter(    apply_name  => 'streams_apply',    parámetro   => 'disable_on_error',    value       => 'n');end;/begin  dbms_apply_adm.set_parameter(    apply_name  => ' streams_apply',    parámetro   => 'allow_duplicate_rows',    valor       => 'y');fin;/

Paso 11 Instanciando la base de datos de destino

conectar [target_stream_connection]

establecer serverout en; ejecutar dbms_output.enable (50000); declarar número handle1; número de identificación; porcentaje_hecho número; estado_trabajo varchar2(30); le ku$_logentry; js ku$_estadodeltrabajo; jd ku$_jobdesc; sts ku$_status;begin  begin  ejecutar inmediatamente 'drop user'||'[source_schema]'||' cascada'; excepción  cuando otros entonces    null; fin; handle1 :=dbms_datapump.open('importar','esquema', '[target_dblink]'); dbms_datapump.add_file(handle1, 'streamimport_1349243553109.log', '[target_datapump_dir]', '',  dbms_datapump.ku$_file_type_log_file); dbms_datapump.metadata_filter(handle1, 'schema_expr', 'in (''[source_schema]'')'); --'in (''cdsl11'',''kra'')' para múltiples dbms_datapump.set_parameter(handle1, 'include_metadata', 1); dbms_datapump.start_job(manejar1); porcentaje_hecho :=0; estado_trabajo :='indefinido'; while (job_state !='completado') y (job_state !='detenido') loop  dbms_datapump.get_status(handle1, dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job_status + dbms_datapump.ku$_status_wip,-1,job_state,sts); js :=sts.estado_trabajo; if js.percent_done !=percent_done  then     dbms_output.put_line('*** porcentaje de trabajo terminado =' || to_char(js.percent_done)); porcentaje_hecho :=js.porcentaje_hecho; terminara si; if(bitand(sts.mask, dbms_datapump.ku$_status_wip) !=0)  then    le :=sts.wip; else     if(bitand(sts.mask,dbms_datapump.ku$_status_job_error) !=0)     then       le :=sts.error; else       le :=null; terminara si; terminara si; si archivo no es nulo  entonces    ind :=archivo.primero; while ind no es un bucle nulo      dbms_output.put_line(le(ind).logtext); ind :=archivo.siguiente(ind); bucle final; terminara si; bucle final; dbms_output.put_line('el trabajo se completó'); dbms_output.put_line('estado final del trabajo =' || estado_trabajo); dbms_datapump.detach (handle1); end;/conectar [fuente_stream_connection] Cree o reemplace el activador DDLTRIGGER después de crear en el número de DatabasedEclare n; comience si Ora_DicT_OBJ_TYPE ='Table' y Ora_DicT_Obj_owner ='[Source_Schema]' luego comience SELECT 1 INTRO DE DENTO DE DBA_DBA_UNSPORTES propietario ='[source_schema]' y table_name =ora_dict_obj_name; Si n =1 entonces dbms_streams_adm.add_table_rules (table_name => '[fuente_schema].' || ora_dict_obj_name, streams_type => 'captura', streams_name => 'streams_capture', queue_name => '[fuente_stream_admin] .Streams_Capture True, include_ddl => false, inclusion_rule => false, fuente_database => '[fuente_database]'); terminara si; excepción         cuando otros         entonces            nulo; fin; terminar si;terminar;/

Paso 12:Iniciar el proceso de aplicación en la base de datos de destino

conectar [target_stream_connection]

configurar serverout on;-- obtener número de instanciacióndeclarar número iscn; beginiscn :=dbms_flashback.get_system_change_number();dbms_apply_adm.set_schema_instantiation_scn(    source_schema_name   => '"[source_schema]"',source_database_name => '[source_database]',instantiation_scn    => iscn,recursive      =_ true ); fin;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_apply where apply_name ='streams_apply'; if (v_started =0) entonces  dbms_apply_adm.start_apply(apply_name => '"streams_apply"'); terminar si;terminar;/

Paso 13:Iniciar el proceso de captura de fuente

conectar [source_stream_connection]

configure serverout on; declare   v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_capture where capture_name ='streams_capture'; if (v_started =0) entonces  dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** mensaje de progreso ===> inició el proceso de captura streams_capture en el almacenamiento de la base de datos de origen y el proceso de aplicación streams_apply en la base de datos de destino con éxito. ***');end;/Su la configuración ahora está completa, para verificar que la configuración de Steam esté funcionando correctamente o no use los siguientes comandos iniciando sesión con las credenciales de administrador de transmisiones que creó para la base de datos de origen.

Seleccione * De V$STREAMS_CAPTURE;

Seleccione * De DBA_CAPTURE;Seleccione * De DBA_PROPAGATION;Seleccione * De DBA_CAPTURE_PREPARED_TABLES;Y para la base de datos de destino utilice las siguientes consultas iniciando sesión con credenciales de usuario de flujos en la base de datos de destino.

Seleccione * De DBA_APPLY;

Seleccione * De DBA_APPLY_CONFLICT_COLUMNS;Seleccione * De DBA_APPLY_EXECUTE;Seleccione * De DBA_APPLY_ERROR;Seleccione * De DBA_APPLY_PROGRESS;Seleccione * De DBA_APPLY_INSTANTIATED_OBJECTS;Seleccione * De V$STREAMS_TRANSACTION;Seleccione *De V$PROPAGATION_RECEIVER;En caso de que desee detener el uso del proceso de aplicación de destino el siguiente guion:

conectar [target_stream_connection]

configure serverout on;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_apply where apply_name ='streams_apply'; if (v_started =1) then  dbms_apply_adm.stop_apply(apply_name => '"streams_apply"'); end if;end;/En caso de que desee detener el proceso de captura de la base de datos de origen, utilice el siguiente proceso:

conectar [source_stream_connection]

configure serverout on; declare   v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_capture where capture_name ='streams_capture'; if (v_started =0) entonces  dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** mensaje de progreso ===> inició el proceso de captura streams_capture en el almacenamiento de la base de datos de origen y el proceso de aplicación streams_apply en la base de datos de destino con éxito. ***');end;/

Si no puede modificar estos scripts, puede comprar esta utilidad, basada en vb.net, consulte este enlace Oracle Replication Software.