Oracle
 sql >> Database >  >> RDS >> Oracle

Esempio di replica passo dopo passo di Oracle Streams

Cos'è il sistema di backup in tempo reale Oracle?

La replica di Oracle Streams è il processo che consente allo schema del database Oracle di replicarsi su un altro database Oracle, che può essere posizionato in qualsiasi posizione. Ogni volta che si verifica una transazione nel DML o DDL del database primario, verrà eseguita immediatamente nel database di destinazione per mantenere una copia di backup live. Di seguito spiego e fornisco gli script per l'esempio di replica passo dopo passo di Oracle Streams.

Configurazione della replica di Oracle Streams

In questo post, descrivo i passaggi per creare una replica del database Oracle tramite la funzione Oracle Streams, per database o database in standby che possono essere utilizzati per scopi di reporting e analisi o per qualsiasi altro scopo. Questa funzione Oracle Streams è supportata in Oracle 11g Enterprise Edition e 10gR2 e 9iR2. Oracle Streams non è più supportato in 12c; ora Oracle sta usando Oracle Golden Gate per questa funzione. Di seguito ho descritto i semplici passaggi per creare una replica su un altro database Oracle, per ogni passaggio sto fornendo uno script SQL che puoi copiare e salvare come passaggio 1, passaggio 2 e così via , quindi esegui gli script uno per uno per impostare la replica. Ma prima di eseguire gli script, cambia i valori con i tuoi valori che sono tra parentesi quadre [ ] e sostituiscilo con attenzione, tutti i valori tra parentesi quadre hanno il significato di nomi completi, quindi cambia di conseguenza.

Importante! Crea una voce in tnsname.ora per entrambi i database di origine e di destinazione per ogni altra connessione.

Fase-1 Configurazione del database di destinazione o secondario

CONNECT [TARGET_SYS_CONNECTION] COME 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=ENTRAMBI;alter system set streams_pool_size=100M scope=BOTH;alter system set undo_retention=3600 scope=ENTRAMBI;spegnimento immediato;montaggio all'avvio;alterazione del database aperto;

Fase-2 Configurazione del database di origine o primario

CONNECT [SOURCE_SYS_CONNECTION1] COME 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=BOTH;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 Imposta LOG_ARCHIVE_DEST_STATE_1=abilita Scope=Spfile;spegnimento immediato;montaggio all'avvio;altera log archivio database;altera database aperto;Modifica database Aggiungi dati log supplementari (Chiave primaria, Univoca, Chiave esterna) Colonne;Modifica registrazione forzatura database;Modifica registro archivio di sistema corrente;

Fase-3 Crea tablespace per il database di origine

connetti [source_sys_connection1] come sysdba;crea tablespace [logminer_ts_name]datafile '[logminer_datafile]'dimensione 100mreuse autoextend on maxsize unlimited;esegui dbms_logmnr_d.set_tablespace('[logminer_ts_name]');crea tablespace [stream_ts_name]datafile '[stream_datafile]'dimensione 100mreuse autoextend su maxsize illimitato;

Fase-4 Crea un utente amministratore di Oracle Streams per il database di origine

connetti [source_sys_connection1] come sysdba;

crea l'utente [source_stream_admin]  identificato da [source_stream_psw]  tablespace predefinita [stream_ts_name]  tablespace temporanea; -- 9 ruoli per [source_stream_admin] concedono risorse a [source_stream_admin]; concedere datapump_imp_full_database a [source_stream_admin]; concedere imp_full_database a [source_stream_admin]; concedere datapump_exp_full_database a [source_stream_admin]; concedere exp_full_database a [source_stream_admin]; concedere dba a [source_stream_admin]; concedere la connessione a [source_stream_admin]; concedere aq_administrator_role a [source_stream_admin]; concedere select_catalog_role a [source_stream_admin]; altera user [source_stream_admin] risorsa del ruolo predefinito, imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 privilegi di sistema per [source_stream_admin]  beginys.dbms_rule_adm.grant_system_privilege( privilege    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginys.dbms_aqadm.grant_system_privilege  ( > 'dequeue_any',  grantee      => '[source_stream_admin]',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege( privilege    => sys.dbms_rule_adm.alter_any_rule,  grantee      => '[source_stream_admin] =>',  grant_option true);end;/  beginys.dbms_rule_adm.grant_system_privilege( privilege    => sys.dbms_rule_adm.create_rule_obj, concessionario      => '[source_stream_admin]', grant_option => true);end;/ concedi tablespace illimitato a [source_stream_admin]; concedere una sessione limitata a [source_stream_admin]; beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.execute_any_rule_set,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_any_rule_set,  grantee      => '[source_stream_admin]', grant_option => true);end;/ concedi la creazione della sessione a [source_stream_admin]; beginys.dbms_aqadm.grant_system_privilege ( privilege    => 'enqueue_any',  grantee      => '[source_stream_admin]',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege( privlege    ==> sys.dbms_rule_adm = esegui_'anyee [source_stream_admin]', grant_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege( privilege    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[source_stream_admin]', grant_option => true);end;/ iniziays.dbms_rule_adm .grant_system_privilege( privilege    => sys.dbms_rule_adm.create_evaluation_context_obj, concessionario      => '[source_stream_admin]', grant_option => true);end;/  beginys.dbms_aqadm.grant_system_privilege ( privilege     stream_=> 'manage_any'  _admin => 'manage_any'  _admin =assegnatario  ',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege( privilege    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[source_stream_admin]',  grant_option => true);end;
/

Fase-5 Creazione dell'amministratore dei flussi per il database di destinazione

connetti [target_sys_connection] come sysdba;

--- esegui come utente sys sull'utente targetcreate [target_stream_admin]  identificato da [target_stream_psw]; -- 9 ruoli per strmadmin concedono risorse a [target_stream_admin]; concedere datapump_imp_full_database a [target_stream_admin]; concedere imp_full_database a [target_stream_admin]; concedere datapump_exp_full_database a [target_stream_admin]; concedere exp_full_database a [target_stream_admin]; concedi dba a [target_stream_admin]; concedere la connessione a [target_stream_admin]; concedere aq_administrator_role a [target_stream_admin]; concedi select_catalog_role a [target_stream_admin]; alter user [target_stream_admin] risorsa del ruolo predefinito, imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 privilegi di sistema per [target_stream_admin]  beginys.dbms_rule_adm.grant_system_privilege( privilege    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[target_stream_admin]', grant_option => true);end;/  beginys.dbms_aqadm.grant_privilege =( privilegio_sistema => 'dequeue_any',  grantee      => '[target_stream_admin]',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege( privilege    => sys.dbms_rule_adm.alter_any_rule,  grantee      => '[target_stream_op] =>', grant_op true);end;/ inisys.dbms_rule_adm.grant_system_privilege( privilege    => sys.dbms_rule_adm.create_rule_obj, concessionario      => '[target_stream_admin]', grant_option => true);end;/ concedi tablespace illimitato a [target_stream_admin]; concedere una sessione limitata a [target_stream_admin]; BeginSys.dbms_rule_adm.Grant_system_privilege (privilege => sys.dbms_rule_adm.execute_anule_set, concessione => '[target_stream_admin]', sovvenzioni_option => true); end;/Beginsys.dbms_rule_adm.RUEE_ADME_ADMea_ES.DBMS =Prilitege => sys.dbms =privilege => sys.dbMs> '[target_stream_admin]', grant_option => true);end;/ concedi la creazione della sessione a [target_stream_admin]; beginys.dbms_aqadm.grant_system_privilege ( privilege    => 'enqueue_any',  grantee      => '[target_stream_admin]',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege( privlege    ==> sys.dbms_rule_adm =.execute_an [target_stream_admin]', grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege( privilege    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[target_stream_admin]', grant_option => true);end;/ iniziays.dbms_rule_adm .grant_system_privilege( privilege    => sys.dbms_rule_adm.create_evaluation_context_obj, concessionario      => '[target_stream_admin]', grant_option => true);end;/  beginys.dbms_aqadm.grant_system_privilege ( privilege    => 'manage_any' _  concessione] [target _ _ concessionaria] [target _ _ concessionaria] ',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege( privilege    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[target_stream_admin]', grant_option => true);end;/

Fase-6 Creazione di un collegamento al database per il database di origine

connetti [source_stream_connection]

--- collegamento per il database di destinazione...crea un collegamento al database [source_dblink] connettiti a [target_stream_admin] identificato da [target_stream_psw] usando '[target_connect_string]';

Fase-7 Creazione di un collegamento al database per il database di destinazione

connetti [target_stream_connection]

creare un collegamento al database [target_dblink] connettersi a [source_stream_admin] identificato da [source_stream_psw] utilizzando '[source_connect_string]';

Fase-8 Creazione di una directory Datapumb sul database di destinazione

connetti [target_stream_connection]

crea o sostituisci la directory[target_datapump_dir] come'[target_dir_location]';

Fase-9 Creazione del processo di acquisizione nel database di origine

disattivare l'eco; ---accept strm_pwd_src prompt 'inserisci la password degli stream admin "strmadmin" alla fonte:'hide ---accept strm_pwd_dest prompt 'inserisci la password degli stream admin "strmadmin" alla destinazione:'hideconnect   [source_stream_connection];dichiara cursore vin è    seleziona ruleset_name da dba_ruleset dove proprietario ='[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); eccezione   quando altri poi nulla; fine; 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_males(   schema_rules(   schema_propagation_males(   => '"[source_schema]"',   streams_name           => '"streams_propagation1"',    source_queue_name      => '"strmadmin"."streams_capture_q"',    destination_queue_name => '"strmadmin"."streams_apply_q"@[source_dblink]',    include_dml => true,    include_ddl            => true,    source_database        => '[source_database]',    inclusion_rule           => true);end;/commit;begin  dbms_streams_adm.add_schema_rules(    schema_name          => '" 's _, stream_type] ',    streams_name       => '"streams_capture"',    queue_name         => '"[source_stream_admin]"."streams_capture_q"',    include_dml        => true,    include_ddl        => true,    include_tagged_lcr => false,   o n_rule     => true);end;/-- ripeti sopra i 2 passaggi per ogni schemacommit;dichiara cursor vin is    select table_namefrom dba_streams_unsupportedwhere owner ='[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 => '[database_origine]' );end loop;commit;end;/

Fase-10 Creazione del processo Applica al database di destinazione

connetti [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(    schema_name      "  _source ]"',   streams_type       => 'apply',    streams_name       => '"streams_apply"',    queue_name         => '"[target_stream_admin]"."streams_apply_q"',    include_dml        => true,    include_ddl     cr ==>,  => true,_l inclusion_rule     => true);end;/commit;begin  dbms_apply_adm.set_parameter(    apply_name  => 'streams_apply',    parameter   => 'disable_on_error',    value       => 'n');end;/begin  dbms_apply_adm.set_parameter(    apply_name  => ' streams_apply',    parametro   => 'allow_duplicate_rows',    valore       => 'y');end;/

Fase 11 Istanziazione del database di destinazione

connetti [target_stream_connection]

imposta serverout su; esegui dbms_output.enable(50000);dichiara numero handle1; numero ind; numero percentuale_fatto; job_state varchar2(30); le ku$_logentry; js ku$_jobstatus; jd ku$_jobdesc; sts ku$_status;begin comincia  esegui immediatamente 'drop user '||'[source_schema]'||' cascata'; eccezione   quando altri poi     nulla; fine; handle1 :=dbms_datapump.open('import','schema', '[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'')' per più dbms_datapump.set_parameter(handle1, 'include_metadata', 1); dbms_datapump.start_job(handle1); percentuale_fatto :=0; stato_lavoro :='non definito'; while (job_state !='completato') e (job_state !='fermato') 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.job_status; if js.percent_done !=percent_done allora     dbms_output.put_line('*** job percent done =' || to_char(js.percent_done)); percent_done :=js.percent_done; finisci se; 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)     allora       le :=sts.error; altrimenti       le :=null; finisci se; finisci se; se le non è null  allora    ind :=le.first; mentre ind non è ciclo nullo      dbms_output.put_line(le(ind).logtext); ind :=le.next(ind); ciclo finale; finisci se; ciclo finale; dbms_output.put_line('il lavoro è stato completato'); dbms_output.put_line('stato lavoro finale =' || stato_lavoro); dbms_datapump.detach (handle1); end;/connect [source_stream_connection] Crea o sostituisci trigger ddltrigger dopo aver creato su databasedeclare n numero; inizia se ORA_DICT_OBJ_TYPE ='TABLE' e ORA_DICT_OBJ_OWNERTER ='[sorgente_schema]' quindi inizia a selezionare 1 da DBA_ da DBA_streams proprietario ='[schema_sorgente]' e nome_tabella =ora_dict_obj_name; Se n =1 quindi dbms_streams_adm.add_table_rules (table_name => '[sorgente_schema].' || ora_dict_obj_name, streams_type => 'cattura', streams_name => 'freams_capture', queueue_name => '[source_admin] .streams_capture_streapture_streapture_. true, include_ddl => false, inclusion_rule => false, source_database => '[source_database]'); finisci se; eccezione         quando altri         allora            null; fine; fine se;fine;/

Fase-12 Avvio del processo di applicazione nel database arget

connetti [target_stream_connection]

imposta serverout su;-- ottieni il numero di istanzadichiara il numero 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        ed    => true);end;;beginselect decode(status, 'enabled', 1, 0) in v_started from dba_apply dove apply_name ='streams_apply'; if (v_started =0) allora dbms_apply_adm.start_apply(apply_name => '"streams_apply"'); fine se;fine;/

Fase-13 Avvio del processo di acquisizione della sorgente

connetti [source_stream_connection]

imposta serverout su;dichiara   v_started number;beginselect decode(status, 'enabled', 1, 0) in v_started from dba_capture dove capture_name ='streams_capture'; if (v_started =0) allora dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** progress message ===> ha avviato il processo di acquisizione streams_capture nel database di origine estock e il processo di applicazione streams_apply nel database di destinazione con successo. ***');end;/Il tuo l'installazione è ora completa, per verificare che la configurazione di Steam funzioni correttamente o non utilizzare i seguenti comandi accedendo con le credenziali di amministratore di stream che hai creato per il database di origine.

Seleziona * Da V$STREAMS_CAPTURE;

Seleziona * Da DBA_CAPTURE;Seleziona * Da DBA_PROPAGATION;Seleziona * Da DBA_CAPTURE_PREPARED_TABLES;E per il database di destinazione utilizzare le seguenti query effettuando l'accesso con le credenziali dell'utente stream sul database di destinazione.

Seleziona * Da DBA_APPLY;

Seleziona * Da DBA_APPLY_CONFLICT_COLUMNS;Seleziona * Da DBA_APPLY_EXECUTE;Seleziona * Da DBA_APPLY_ERROR;Seleziona * Da DBA_APPLY_PROGRESS;Seleziona * Da DBA_APPLY_INSTANTIATED_OBJECTS;Seleziona * Da V$STREAMS_TRANSACTION;Seleziona *Da V$PROPAGATION_RECEIVER;Se si desidera interrompere il processo di applicazione target, utilizzare il seguente script:

connetti [target_stream_connection]

imposta serverout su;dichiara   v_started number;beginselect decode(status, 'enabled', 1, 0) in v_started from dba_apply dove apply_name ='streams_apply'; if (v_started =1) allora dbms_apply_adm.stop_apply(apply_name => '"streams_apply"'); end if;end;/Se si desidera interrompere il processo di acquisizione del database di origine, utilizzare il processo seguente:

connetti [source_stream_connection]

imposta serverout su;dichiara   v_started number;beginselect decode(status, 'enabled', 1, 0) in v_started from dba_capture dove capture_name ='streams_capture'; if (v_started =0) allora dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** progress message ===> ha avviato il processo di acquisizione streams_capture nel database di origine estock e il processo di applicazione streams_apply nel database di destinazione con successo. ***');end;/

Se non sei in grado di modificare questi script, puoi acquistare questa utility, basata su vb.net controlla questo link Software di replica Oracle.