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.