sql >> Databáze >  >> RDS >> Oracle

Příklad replikace Oracle Streams krok za krokem

Co je systém zálohování Oracle v reálném čase?

Replikace Oracle Streams je proces, který umožňuje replikaci schématu databáze Oracle do jiné databáze Oracle, která může být umístěna na libovolném místě. Kdykoli dojde k transakci v primární databázi DML nebo DDL, okamžitě se provede v cílové databázi, aby se zachovala živá záložní kopie. Níže vysvětluji a poskytuji skripty pro příklad replikace Oracle Streams krok za krokem.

Nastavení replikace streamů Oracle

V tomto příspěvku popisuji kroky k vytvoření replikace databáze Oracle pomocí funkce Oracle Streams, pro pohotovostní databázi nebo databázi, kterou lze použít pro účely sestavování a analýzy nebo pro jakékoli jiné účely. Tato funkce Oracle Streams je podporována v Oracle 11g Enterprise Edition a 10gR2 a 9iR2. Oracle Streams již není podporován v 12c; nyní Oracle pro tuto funkci používá Oracle Golden Gate. Níže jsem popsal jednoduché kroky k vytvoření replikace do jiné databáze Oracle, pro každý krok poskytuji SQL skript, který můžete zkopírovat a uložit jako krok 1, krok 2 atd. , poté spusťte skripty jeden po druhém, abyste nastavili replikaci. Před spuštěním skriptů však změňte hodnoty na své hodnoty, které jsou v hranatých závorkách [ ] a nahraďte je opatrně, všechny hodnoty v hranatých závorkách mají význam plných jmen, takže změňte podle toho.

Důležité! Vytvořte záznam v tnsname.ora pro zdrojové i cílové databáze pro každé další připojení.

Krok 1 Konfigurace cílové nebo sekundární databáze

PŘIPOJIT [TARGET_SYS_CONNECTION] JAKO SYSDBA;ZMĚNIT SYSTÉMOVOU SADA AQ_TM_PROCESSES=3 SCOPE=BOTH;změnit systémovou sadu global_names=TRUE scope=BOTH;alter system set job_queue_processes=6 scope=BOTH;alter system set streams_pool_size=100M system set=100M undo_retention=3600 scope=BOTH;okamžité vypnutí;připojení po spuštění;změna otevřené databáze;

Krok 2 Konfigurace zdroje nebo primární databáze

PŘIPOJIT [SOURCE_SYS_CONNECTION1] JAKO SYSDBA;ZMĚNIT SYSTÉMOVOU SADA AQ_TM_PROCESSES=3 SCOPE=BOTH;změnit systémovou sadu global_names=TRUE scope=BOTH;změnit systémovou sadu job_queue_processes=6 scope=BOTH;změnit systémovou sadu streams_pool_size=48M rozsah=48M SMTP_OUT_SERVER='[MAIL_SERVER] [MAIL_PORT]' SCOPE=BOTH;--- UNDO_RETENTION=86400změnit systémovou sadu undo_retention=3600 scope=BOTH;--- UNDO_MANAGEMENT=AUTOZMĚNIT SYSTÉMOVOU sadu LOG_ARCHIVE_DESTARCHIVE_1pfATION]Alter System=DEST_1pfLOGATION;' Nastavit LOG_ARCHIVE_DEST_STATE_1=povolit Rozsah=Sfile;okamžité vypnutí;připojení po spuštění;změna archivního protokolu databáze;změna databáze otevřít;Změnit databázi Přidat doplňková data protokolu (primární klíč, jedinečný, cizí klíč) sloupce;Změnit vynucené protokolování databáze;Změnit aktuální protokol systémového archivu;

Krok-3 Vytvořte tabulkový prostor pro zdrojovou databázi

připojit [source_sys_connection1] jako sysdba;vytvořit tabulkový prostor [logminer_ts_name]datový soubor '[logminer_datafile]'velikost 100mznovu použít autoextend na maxsize neomezeno;spustit dbms_logmnr_d.set_tablespace('[název_logminer_ts_stream]'usesetsfile]'_streamsetfilatem tablese_space]_izets1 autoextend na maxsize neomezeno;

Krok-4 Vytvoření správce Oracle Streams pro zdrojovou databázi

připojit [source_sys_connection1] jako sysdba;

vytvořit uživatele [source_stream_admin]  identifikovaného pomocí [source_stream_psw]  výchozí tabulkový prostor [stream_ts_name]  dočasný tabulkový prostor temp; -- 9 rolí pro [source_stream_admin]  udělit zdroj [source_stream_admin]; udělit datapump_imp_full_database [správci zdrojového_streamu]; udělit imp_full_database [správci zdrojového_streamu]; udělit datapump_exp_full_database [administrátorovi_zdrojového_streamu]; udělit exp_full_database [správci zdrojového_streamu]; udělit dba [správce zdrojového_streamu]; udělit připojení k [source_stream_admin]; udělit roli aq_administrator_role [správce zdrojového_streamu]; udělit roli select_catalog_role [správce zdrojového_streamu]; změnit uživatel [source_stream_admin] výchozí zdroj role, imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 systémových oprávnění pro [source_stream_admin]  beginys.dbms_rule_adm.grant_system_privilege(  privilegium    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[source_stream_rule_admin];', db. system privilegium;> 'dequeue_any',  příjemce grantu      => '[správce_zdrojového_streamu]',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilegium    => sys.dbms_rule_adm.stream], zdroj _oplepe> jakýkoli zdroj _oplepe=adm. grant_alter' true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilegium    => sys.dbms_rule_adm.create_rule_obj,  příjemce grantu      => '[source_stream_admin]', _stream_option => true_space [zdroj_zdroje neomezeno);end;/ udělit omezenou relaci [source_stream_admin]; startss.dbms_rule_adm.grant_system_privilege (privilege => sys.dbms_rule_adm.execute_any_rule_set, grantee => '[source_stream_admin]', grantu_option => true);> '[source_stream_admin]',  grant_option => true);end;/  udělit relaci vytvoření [source_stream_admin]; beginys.dbms_aqadm.grant_system_privilege (  privilegium    => 'enqueue_any',  příjemce grantu      => '[source_stream_admin]',  admin_option => true);end;/  beginys.dbms_rule_adm. syste, syste, syse privilege privilege =privilege sysle privilege =any_legledbm. [source_stream_admin]',  grant_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilegium    => sys.dbms_rule_adm.create_any_rule,  grantee      ==> '[m_stream_rule_adru_opmin.]; .grant_system_privilege(  privilegium    => sys.dbms_rule_adm.create_evaluation_context_obj,  příjemce grantu      => '[source_stream_admin]',  grant_option => true);end;/  beginys.dbms'[any_system privilegium] > lege [any_system privilege=>  ',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilegium    => sys.dbms_rule_adm.create_rule_set_obj,  příjemce grantu      => true '[source_stream_admin_admin];' =/>/

Krok 5 Vytvoření správce streamů pro cílovou databázi

připojit [target_sys_connection] jako sysdba;

--- spustit jako uživatel sys u uživatele targetcreate [target_stream_admin]  identifikovaného pomocí [target_stream_psw]; -- 9 rolí pro strmadmin  udělte zdroj [target_stream_admin]; udělit datapump_imp_full_database [admin_cílového_streamu]; udělit imp_full_database [admin_cílového_streamu]; udělit datapump_exp_full_database [admin_cílového_streamu]; udělit exp_full_database [admin_cílového_streamu]; udělit dba [admin_cílového_streamu]; udělit připojení k [target_stream_admin]; udělit roli aq_administrator_role [target_stream_admin]; udělit roli select_catalog_role [adminovi_cílového_streamu]; změnit uživatel [target_stream_admin] výchozí zdroj role, imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 systémových oprávnění pro [target_stream_admin]  beginys.dbms_rule_adm.grant_system_privilege(  privilegium    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[target_stream_rule_admin]=ddbm. =true> 'dequeue_any',  příjemce grantu      => '[target_stream_admin]',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilegium  '  => sys.dbms_rule_stream_,>any  [get_stream_stream_>any    grant_adm. true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilegium    => sys.dbms_rule_adm.create_rule_obj,  příjemce grantu      => '[target_stream_admin]', target grant_option => ad_min grant neomezený); udělit omezenou relaci [target_stream_admin]; startss.dbms_rule_adm.grant_system_privilege (privilege => sys.dbms_rule_adm.execute_any_rule_set, grantee => '[Target_stream_admin]', Grant_OPTION => True);> '[target_stream_admin]',  grant_option => true);end;/  udělit relaci vytvoření [target_stream_admin]; beginys.dbms_aqadm.grant_system_privilege (  privilegium    => 'enqueue_any',  příjemce grantu      => '[target_stream_admin]',  admin_option => true);end;/  beginys.dbms_rule_adm_se's'ruce syste, cu  privilege => priledledbsystem. [target_stream_admin]',  grant_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilegium    => sys.dbms_rule_adm.create_any_rule,  grantee      => mdble. začíná true]; .stream_system_privilege(  privilegium    => sys.dbms_rule_adm.create_evaluation_context_obj,  příjemce grantu      => '[target_stream_admin]',  ' grant_option => true);end;/ privilegium začíná  .  man_vilege legge lege >  ',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilegium    => sys.dbms_rule_adm.create_rule_set_obj,  příjemce grantu      => '[target_stream_admin]option;' =

Krok-6 Vytvoření databázového propojení pro zdrojovou databázi

připojit [source_stream_connection]

--- odkaz na cílovou databázi...vytvořit odkaz na databázi [source_dblink] připojit se k [target_stream_admin] identifikovanému [target_stream_psw] pomocí '[target_connect_string]';

Krok-7 Vytvoření databázového propojení pro cílovou databázi

připojit [target_stream_connection]

vytvořit odkaz na databázi [target_dblink] připojit se k [source_stream_admin] identifikovaný [source_stream_psw] pomocí '[source_connect_string]';

Krok-8 Vytvoření adresáře Datapumb v cílové databázi

připojit [target_stream_connection]

vytvořit nebo nahradit adresář[cílová_datapump_dir] jako'[cílový_adresář_umístění]';

Krok-9 Vytvoření procesu zachycení ve zdrojové databázi

vypnout echo; ---accept strm_pwd_src prompt 'zadejte heslo správce streamů "strmadmin" na zdroji :' hide  ---accept strm_pwd_dest prompt 'zadejte heslo správce streamů "strmadmin" na cílovém místě :' hideconnect   [source_stream_connection];declare  select rules vinet_name from dba_rulesets where owner ='[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,   > true_rules); výjimka   , když ostatní potom null; konec; end loop;end;/begin  dbms_streams_adm.set_up_queue(    queue_table => '"streams_capture_qt"',    queue_name  => '"streams_capture_q"',    název_fronty uživatel _propagace _m_sché_proue_user  =>_stream_dbm => '"[source_schema]"',   název_streamu           => '"streams_propagation1"',    source_queue_name      => '"strmadmin"."streams_capture include_q"',    název_cílové_fronty_q], _qadmin název_fronty => '"db_ml => '"db_ml => true, include_ddl => true, source_database => '[source_database]', inclusion_rule => true); end;/commit; začátek dbms_streams_adm.add_schema_rules (schema_name => '"[zdroj_schema]"', streams_type => ' ',    streams_name       => '"streams_capture"',    queue_name         => '"[source_stream_admin]"."streams_capture_q"',    include_dml        => true,    lus_dml =true,    lus_dml n_rule     => true);end;/-- opakujte výše uvedené 2 kroky pro každý schemacommit;declare cursor vin is    select table_namefrom dba_streams_unsupportedwhere owner ='[source_schema]';beginfor c in vin loop dbms_streams_adm.add_table_les (název_tabulky_adm_adm.add]ru .'||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_source => false, zdroj_databází> '[source_database]' );end loop;commit;end;/

Krok-10 Vytvoření procesu Apply v cílové databázi

připojit [target_stream_connection]

Začátek dbms_streams_adm.set_up_queue (queue_table => '"Streams_apply_qt"', queue_name => '"Streams_apply_q", queue_user =>' "[Target_stream_admin]; end;/začátek dbms_streams_adm. ] "', Streams_type =>' Applic ', streamps_name =>'" Streams_apply "', queue_name =>'" [Target_stream_admin] ". inclusion_rule     => true);end;/commit;begin  dbms_apply_adm.set_parameter(    apply_name  => 'streams_apply',    parametr   => 'disable_on_error',    value      ly => 'n. apply name _ m ='n_apply;end; streams_apply',    parametr   => 'allow_duplicate_rows',    hodnota       => 'y');end;/

Krok-11 Vytvoření instance cílové databáze

připojit [target_stream_connection]

set serverout on;execute dbms_output.enable(50000);declare  handle1 number; ind číslo; procento_hotové číslo; job_state varchar2(30); le ku$_logentry; js ku$_jobstatus; jd ku$_jobdesc; sts ku$_status;begin  begin  spustit okamžité 'vypustit uživatele '||'[source_schema]'||' kaskáda'; výjimka   když ostatní potom     null; konec; 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 (''[zdrojové_schéma]'')'); --'in (''cdsl11'',''kra'')' pro více  dbms_datapump.set_parameter(handle1, 'include_metadata', 1); dbms_datapump.start_job(handle1); procento_hotovo :=0; job_state :='undefined'; while (job_state !='completed') a (job_state !='stoppped') smyčka  dbms_datapump.get_status(handle1, dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job_status_data,p_1$,dbmswi_p) + dbms.; js :=sts.job_status; if js.percent_done !=percent_done  then     dbms_output.put_line('*** procento dokončené úlohy =' || to_char(js.percent_done)); procento_hotovo :=js.procento_hotovo; konec jestliže; 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; konec jestliže; konec jestliže; pokud le není null  then    ind :=le.first; zatímco ind není nulová smyčka      dbms_output.put_line(le(ind).logtext); ind :=le.next(ind); koncová smyčka; konec jestliže; koncová smyčka; dbms_output.put_line('úloha dokončena'); dbms_output.put_line('konečný stav úlohy =' || stav_úlohy); dbms_datapump.detach(handle1);end;/connect [source_stream_connection]create or replace trigger ddltrigger   after create on databasedeclare   n   number;begin   if ora_dict_obj_type ='table' and ora_dict_obj_owner ='[source_schema]'   then      begin         select 1           into n           from dba_streams_unsupported          where owner ='[zdrojové_schéma]' a název_tabulky =ora_dict_obj_name; Pokud n =1, pak dbms_streams_adm.add_table_rules (tabulka_name => '[source_schema].' || ora_dict_obj_name, streams_type => 'Capture', Streams_name => 'Streams_Capture', queue_name =>> '[source_Stream_AdMin]. true, include_ddl => false, inclusion_rule => false, source_database => '[source_database]'); konec jestliže; výjimka         když ostatní         pak            null; konec; end if;end;/

Krok-12 Spuštění procesu Apply v databázi cíle

připojit [target_stream_connection]

nastavit serverout on;-- získat číslo instance deklarovat číslo iscn; beginiscn :=dbms_flashback.get_system_change_number();dbms_apply_adm.set_schema_instantiation_scn(    source_schema_name   => '"[source_schema]"',source_database_name => '[resource_database_name], c true/source_database], c true/instantiation isn_sc číslo ;beginselect decode(status, 'povoleno', 1, 0) do v_started od dba_apply, kde název_použití ='použít_streamy'; if (v_started =0) then  dbms_apply_adm.start_apply(název_aplikace => '"streams_apply"'); end if;end;/

Krok-13 Spuštění procesu zachycení zdroje

připojit [source_stream_connection]

nastavit serverout on;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) do v_started from dba_capture kde capture_name ='streams_capture'; if (v_started =0) then  dbms_capture_adm.start_capture(název_zachycení => '"zachycení_streamů"'); end if;end;/begindbms_output.put_line('*** zpráva o průběhu ===> úspěšně spustil proces zachycení streams_capture ve zdrojové databázi a proces aplikace streams_apply v cílové databázi. ***');end;/Váš nastavení je nyní dokončeno, abyste zkontrolovali, zda vaše nastavení steamu funguje správně nebo zda nepoužíváte následující příkazy, přihlaste se pomocí přihlašovacích údajů správce streamů, které jste vytvořili pro zdrojovou databázi.

Vyberte * From V$STREAMS_CAPTURE;

Vyberte * Z DBA_CAPTURE;Vyberte * Z DBA_PROPAGATION;Vyberte * Z DBA_CAPTURE_PREPARED_TABLES;A pro cílovou databázi použijte následující dotazy přihlášením pomocí pověření uživatele proudů do cílové databáze.

Vyberte * Z DBA_APPLY;

Vyberte * z DBA_APPLY_CONFLICT_COLUMNS;Vyberte * z DBA_APPLY_EXECUTE;Vyberte * z DBA_APPLY_ERROR;Vyberte * z DBA_APPLY_PROGRESS;Vyberte * z DBA_APPLY_INSTANTIATED_OBJECTS;Vyberte * z V$STREAMS_TRANSFACTION použijete proces V$RECEIFFrom, který chcete použít;Vyberte $PAG. následující skript:

připojit [target_stream_connection]

nastavit serverout on;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) do v_started from dba_apply kde apply_name ='streams_apply'; if (v_started =1) then  dbms_apply_adm.stop_apply(apply_name => '"streams_apply"'); end if;end;/V případě, že chcete zastavit proces zachycení zdrojové databáze, použijte následující proces:

připojit [source_stream_connection]

nastavit serverout on;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) do v_started from dba_capture kde capture_name ='streams_capture'; if (v_started =0) then  dbms_capture_adm.start_capture(název_zachycení => '"zachycení_streamů"'); end if;end;/begindbms_output.put_line('*** zpráva o průběhu ===> úspěšně spustil proces zachycování streams_capture ve zdrojové databázi a proces aplikace streams_apply v cílové databázi. ***');end;/

Pokud nejste schopni upravit tyto skripty, můžete si zakoupit tento nástroj založený na vb.net, podívejte se na tento odkaz Oracle Replication Software.

  1. Dynamický oddíl tabulky Oracle

  2. Vzdálená připojení Mysql Ubuntu

  3. Spouštění dotazů analýzy velkých dat pomocí SQL a Presto

  4. 4 způsoby, jak zabránit přetížení výstrah pomocí monitorování serveru SQL