sql >> Databasteknik >  >> RDS >> Oracle

Oracle Streams steg för steg replikeringsexempel

Vad är Oracles realtidsbackupsystem?

Oracle Streams replikering är den process som gör det möjligt för Oracles databasschema att replikera till en annan Oracle-databas, som kan lokaliseras till vilken plats som helst. Närhelst en transaktion sker i den primära databasen DML eller DDL, kommer den att köras omedelbart till måldatabasen för att upprätthålla en levande säkerhetskopia. Nedan förklarar och tillhandahåller jag skript för Oracle Streams steg för steg replikeringsexempel.

Oracle Streams Replikeringsinställningar

I det här inlägget beskriver jag steg för att skapa en Oracle-databasreplikering genom Oracle Streams-funktion, för standby-databas eller databas som kan användas för rapporterings- och analysändamål eller andra ändamål. Den här Oracle Streams-funktionen stöds i Oracle 11g Enterprise Edition och 10gR2 och 9iR2. Oracle Streams stöds inte längre i 12c; nu använder Oracle Oracle Golden Gate för denna funktion. Jag beskrev nedan enkla steg för att skapa en replikering till en annan Oracle-databas, för varje steg tillhandahåller jag SQL-skript som du kan kopiera och spara som steg-1, steg-2 och så vidare , kör sedan skripten ett efter ett för att ställa in replikeringen. Men innan du kör skripten, ändra värdena till dina värden som finns inom hakparenteser [ ] och ersätt det med försiktigt, alla värden inom hakparenteser betyder fullständiga namn, så ändra följaktligen.

Viktig! Skapa en post i tnsname.ora för både käll- och måldatabaser för varandras anslutningar.

Steg-1 Konfigurera mål eller sekundär databas

ANSLUTA [TARGET_SYS_CONNECTION] SOM SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH; ändra systemuppsättning global_names=TRUE scope=BOTH; ändra systemuppsättning job_queue_processes=6 scope=BOTH; ändra systemuppsättning streams_BOTH_size_size=system undo_retention=3600 scope=BOTH; omedelbar avstängning; startmontering; ändra databasen öppen;

Steg-2 Konfigurera källa eller primär databas

ANSLUTA [SOURCE_SYS_CONNECTION1] SOM SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH; ändra systemuppsättning global_names=TRUE scope=BOTH; ändra systemuppsättning job_queue_processes=6 scope=BOTH; ändra systemuppsättning streams_pool_omfång=BOTHMSET; 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_DESTINCHIVE;System Ställ in LOG_ARCHIVE_DEST_STATE_1=aktivera Scope=Spfile;avstängning omedelbar;startmontering; ändra databasens arkivlogg; ändra databasen öppen; Ändra databas Lägg till kompletterande loggdata (Primärnyckel, Unik, Utländsk nyckel) Kolumner; Ändra databas tvingande loggning; Ändra systemarkivlogg Aktuell;

Steg-3 Skapa tabellutrymme för källdatabas

anslut [source_sys_connection1] som sysdba;skapa tabellutrymme [logminer_ts_name]datafil '[logminer_datafil]s storlek 100mreuse autoextend på maxsize unlimited;kör dbms_logmnr_d.set_tablespace('[logminer_stream_ts_name] 0;0; autoextend på maxsize obegränsad;

Steg-4 Skapa Oracle Streams Admin-användare för källdatabas

anslut [source_sys_connection1] som sysdba;

skapa användare [source_stream_admin]  identifierad av [source_stream_psw]  standardtabellutrymme [stream_ts_name]  temporär tabellutrymmestemp; -- 9 roller för [source_stream_admin]  bevilja resurs till [source_stream_admin]; bevilja datapump_imp_full_database till [source_stream_admin]; bevilja imp_full_database till [source_stream_admin]; bevilja datapump_exp_full_database till [source_stream_admin]; bevilja exp_full_database till [source_stream_admin]; bevilja dba till [source_stream_admin]; bevilja anslutning till [source_stream_admin]; ge aq_administratörsroll till [source_stream_admin]; bevilja select_catalog_rolle till [source_stream_admin]; ändra användare [source_stream_admin] standardrollresurs, imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 systembehörigheter för [source_stream_admin]  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[source_stream_admin_] op._ system behörighet grant_admin]op.> 'dequeue_any',  grantee      => '[source_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.ule_y_stream = grant_option = grant_option,  grant_option,  grant_option] true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_obj,  grantee      => '[source_stream_admin]',  grant_option => true); bevilja begränsad session till [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;/  bevilja skapa session till [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 [source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[source_stream_ admin./ .grant_system_privilege(  privilegium    => sys.dbms_rule_adm.create_evaluation_context_obj,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_t_aqadm.   begynnsys.dbms_t_system_privilege ',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[source_stream_t_option]',  grantee =trueend_option]', />/

Steg-5 Skapa strömadministratörer för måldatabasen

anslut [target_sys_connection] som sysdba;

--- kör som sys-användare hos targetcreate-användaren [target_stream_admin]  som identifieras av [target_stream_psw]; -- 9 roller för strmadmin tilldela resurs till [target_stream_admin]; bevilja datapump_imp_full_database till [target_stream_admin]; bevilja imp_full_database till [target_stream_admin]; bevilja datapump_exp_full_database till [target_stream_admin]; bevilja exp_full_database till [target_stream_admin]; bevilja dba till [target_stream_admin]; bevilja anslutning till [target_stream_admin]; ge aq_administrator_rolle till [target_stream_admin]; bevilja select_catalog_rolle till [target_stream_admin]; ändra användarens [target_stream_admin] standardrollresurs, imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 systembehörigheter för [target_stream_admin]  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[target_stream_admin] begynnelse_stream_admin_, qm behörighet begynnelse_admin; qm  behörighet admin;> 'dequeue_any',  grantee      => '[target_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm. alter_an ad adm. alter_an ad adm. true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_obj,  grantee      => '[target_stream_admin]',  grant_option = tablespace unlimited/_träning till tabellutrymme unlimited; bevilja begränsad session till [target_stream_admin]; beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.execute_any_rule_set,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_any_rule_set,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  bevilja skapa session till [target_stream_admin]; beginsys.dbms_aqadm.grant_system_privilege (  privilege    => 'enqueue_any',  grantee      => '[target_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant _system_ privilege y [target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[target_min. .grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_evaluation_context_obj,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_grane_system_privilege ',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[target_stream> true_admin]', 

Steg-6 Skapa databaslänk för källdatabas

anslut [source_stream_connection]

--- länk för måldatabas... skapa databaslänk [source_dblink] anslut till [target_stream_admin] identifierad av [target_stream_psw] med '[target_connect_string]';

Steg-7 Skapa databaslänk för måldatabas

anslut [target_stream_connection]

skapa databaslänk [target_dblink] anslut till [source_stream_admin] identifierad av [source_stream_psw] med '[source_connect_string]';

Steg-8 Skapa Datapumb-katalog på måldatabasen

anslut [target_stream_connection]

skapa eller ersätt katalog[target_datapump_dir] som'[target_dir_location]';

Steg-9 Skapa insamlingsprocess i källdatabasen

stäng av ekot; ---acceptera strm_pwd_src prompt 'ange lösenordet för streams admin "strmadmin" vid källan:'hide ---accept strm_pwd_dest prompt 'ange lösenordet för streams admin "strmadmin" på destinationen:'hideconnect   [source_stream_connection]; deklarera markören vinet_name är från dba_rulesets där ägare ='[source_stream_admin]';börja för i in vin loop begin  dbms_rule_adm.drop_rule_set(    rule_set_name => '[source_stream_admin].'||i.ruleset_name,    delete_rules  => true); undantag    när andra sedan null; slutet; end loop;end;/begin  dbms_streams_adm.set_up_queue(    queue_table => '"streams_capture_qt"',    queue_name  => '"streams_capture_q"',    queue_user  => '"[källa_stream_admin."_propp stream_admin._/ => '"[source_schema]"',   streams_name           => '"streams_propagation1"',    source_queue_name      => '"strmadmin"."streams_capture_q"',   destination_queue_name => '"@strmadmin_källan_", streamlänk inkludera_"b"sml] => true,    include_ddl            => true,    source_databas        => '[source_databas]',    inclusion_rule           => true);end;/commit;begin  dbms_streams_adm.add_name   dbms_streams_adm.add_name      dbms_streams_adm.add_name  stream _adm.add_name  " ',    streams_name       => '"streams_capture"',    queue_name         => '"[source_stream_admin]"."streams_capture_q"',   inkludera_dml        => true,    true,   inkludera i tagg,  cluster _dl    ,   inkludera _dl   _ n_rule     => true);end;/-- upprepa ovanstående 2 steg för varje schemacommit;declare cursor vin is    select table_namefrom dba_streams_unsupportedwhere owner ='[source_schema]';beginfor c in vin loop dbms_streams_adm.add_table_source_schema] ( table_source_rules) .'||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> '[källa_databas]' );end loop;commit;end;/

Steg-10 Skapa appliceringsprocess i måldatabasen

anslut [target_stream_connection]

börja  dbms_streams_adm.set_up_queue(    queue_table => '"streams_apply_qt"',    queue_name  => '"streams_apply_q"',    queue_user  => '"[target_stream_admin]"'_(källans schema begin]"'_);end;end; ]"',    streams_type       => 'apply',    streams_name       => '"streams_apply"',    queue_name         => '"[target_stream_admin]"."streams_apply_q"',    include l_d _,   include _d _ ,   include _d _ inclusion_rule     => true);end;/commit;begin  dbms_apply_adm.set_parameter(   applicera_namn  => 'streams_apply',    parameter   => 'disable_on_error',    värde       => 'n'_);end;/_app name streams_apply',    parameter   => 'allow_duplicate_rows',    value       => 'y');end;/

Steg-11 Instantiering av måldatabas

anslut [target_stream_connection]

ställ in serverout på;exekvera dbms_output.enable(50000);declare  handle1 nummer; ind nummer; procent_gjort antal; jobb_tillstånd varchar2(30); le ku$_logentry; js ku$_jobstatus; jd ku$_jobdesc; sts ku$_status;begin  börja  exekvera omedelbart 'släpp användare '||'[source_schema]'||' kaskad'; undantag   när andra sedan     null; slutet; 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 (''[källa_schema]'')'); --'in (''cdsl11'',''kra'')' för flera dbms_datapump.set_parameter(handle1, 'include_metadata', 1); dbms_datapump.start_job(handtag1); procent_klar :=0; job_state :='odefinierad'; while (job_state !='completed') och (job_state !='stopped') loop  dbms_datapump.get_status(handle1, dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job_status + dbms_datapump.ku$_status,job)_stat; js :=sts.job_status; if js.percent_done !=percent_done  then     dbms_output.put_line('*** job percent done =' || to_char(js.percent_done)); percent_done :=js.percent_done; sluta om; if(bitand(sts.mask, dbms_datapump.ku$_status_wip) !=0)  sedan    le :=sts.wip; else     if(bitand(sts.mask,dbms_datapump.ku$_status_job_error) !=0)     sedan       le :=sts.error; annat       le :=null; sluta om; sluta om; om le inte är null  då    ind :=le.first; medan ind inte är nollloop      dbms_output.put_line(le(ind).logtext); ind :=le.next(ind); ändslinga; sluta om; ändslinga; dbms_output.put_line('jobbet har slutförts'); dbms_output.put_line('final job state =' || job_state); dbms_datapump.detach (handtag1); slut;/anslut [källa_stream_connection] Skapa eller ersätta trigger ddltrigger efter att skapa på databaseCleare n nummer; börja om ORA_DICT_OBJ_TYPE ='TABLE' och ORA_DICT_OBJ_OWERER ='[Source_Schema]' Begin 1 Into n från dba_stream_streppe_Unppepp ägare ='[källa_schema]' och tabellnamn =ora_dict_obj_name; om n =1 då dbms_streams_adm.add_table_rules (tabell_name => '[source_schema].' || ora_dict_obj_name, streams_type => 'capture', streams_name => 'streams_capture', queue_name => '[source_t Det är sant, inkludera_ddl => falsk, inkludering_rule => falsk, source_database => '[source_database]'); sluta om; undantag         när andra         då            null; slutet; slut om;slut;/

Steg-12 Starta appliceringsprocessen i argetdatabasen

anslut [target_stream_connection]

ställ in serverout på;-- få instansieringsnummerdeklarera iscn-nummer; beginiscn :=dbms_flashback.get_system_change_number();dbms_apply_adm.set_schema_instantiation_scn(    source_schema_name   => '"[source_schema]"',source_database_name => '[source_databas]', instantiation _scn number = start _scn; de;beginselect decode(status, 'enabled', 1, 0) in v_started från dba_apply där application_name ='streams_apply'; if (v_started =0) then  dbms_apply_adm.start_apply(apply_name => '"streams_apply"'); slut om;slut;/

Steg-13 Starta källinsamlingsprocess

anslut [source_stream_connection]

ställ in serverout på;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) in v_started från dba_capture där capture_name ='streams_capture'; if (v_started =0) då  dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** förloppsmeddelande ===> startade fångstprocessen streams_capture vid källdatabasen estock och appliceringsprocessen streams_apply på destinationsdatabasen framgångsrikt. ***');end;/Your installationen är nu klar, för att kontrollera att din steams-installation fungerar korrekt eller inte använda följande kommandon genom att logga in med streams administratörsuppgifter som du skapade för källdatabasen.

Välj * Från V$STREAMS_CAPTURE;

Välj * Från DBA_CAPTURE;Välj * Från DBA_PROPAGATION;Välj * Från DBA_CAPTURE_PREPARED_TABLES;Och för måldatabasen använd följande frågor genom att logga in med användaruppgifter för streams på måldatabasen.

Välj * Från DBA_APPLY;

Välj * Från DBA_APPLY_CONFLICT_COLUMNS;Välj * Från DBA_APPLY_EXECUTE;Välj * Från DBA_APPLY_ERROR;Välj * Från DBA_APPLY_PROGRESS;Välj * Från DBA_APPLY_INSTANTIATED_OBJECTS;Välj * Från V$STREAMS_APPLY_EX följande manus:

anslut [target_stream_connection]

ställ in serverout på;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) in v_started from dba_apply där application_name ='streams_apply'; if (v_started =1) then  dbms_apply_adm.stop_apply(apply_name => '"streams_apply"'); end if;end;/Om du vill stoppa insamlingsprocessen för källdatabas, använd följande process:

anslut [source_stream_connection]

ställ in serverout på;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) in v_started från dba_capture där capture_name ='streams_capture'; if (v_started =0) då  dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** förloppsmeddelande ===> startade fångstprocessen streams_capture vid källdatabasen estock och appliceringsprocessen streams_apply på destinationsdatabasen framgångsrikt. ***');end;/

Om du inte kan ändra dessa skript kan du köpa det här verktyget, baserat på vb.net, kolla den här länken Oracle Replication Software.

  1. Hur man infogar resultaten av en lagrad procedur i en tillfällig tabell i SQL Server

  2. SQL Server Index Användningsstatistik

  3. Den officiella Microsoft Access Tech-bloggen är nu online!

  4. SQL Server Latches – Andra Latches att veta om