Co to jest system tworzenia kopii zapasowych Oracle w czasie rzeczywistym?
Replikacja Oracle Streams to proces, który umożliwia replikację schematu bazy danych Oracle do innej bazy danych Oracle, która może znajdować się w dowolnej lokalizacji. Za każdym razem, gdy transakcja ma miejsce w podstawowej bazie danych DML lub DDL, zostanie natychmiast wykonana w docelowej bazie danych, aby zachować kopię zapasową na żywo. Poniżej wyjaśniam i dostarczam skrypty dla Oracle Streams, przykład replikacji krok po kroku.
Konfiguracja replikacji strumieni Oracle
W tym poście opisuję kroki, aby utworzyć replikację bazy danych Oracle za pomocą funkcji Oracle Streams, dla rezerwowej bazy danych lub bazy danych, która może być używana do celów raportowania i analizy lub do innych celów. Ta funkcja Oracle Streams jest obsługiwana w Oracle 11g Enterprise Edition i 10gR2 i 9iR2. Oracle Streams nie jest już obsługiwany w 12c; teraz Oracle używa Oracle Golden Gate do tej funkcji. Poniżej opisałem proste kroki, aby utworzyć replikację do innej bazy danych Oracle, dla każdego kroku dostarczam skrypt SQL, który możesz skopiować i zapisać jako krok-1, krok-2 i tak dalej , a następnie uruchom skrypty jeden po drugim, aby skonfigurować replikację.Ale przed uruchomieniem skryptów zmień wartości na swoje wartości, które są w nawiasach kwadratowych [ ] i zastąp je ostrożnie, wszystkie wartości w nawiasach kwadratowych mają znaczenie pełne nazwy, więc zmień je odpowiednio.Ważny! Utwórz wpis w tnsname.ora zarówno dla źródłowej, jak i docelowej bazy danych dla każdego innego połączenia.
Krok 1 Konfigurowanie docelowej lub pomocniczej bazy danych
CONNECT [TARGET_SYS_CONNECTION] AS SYSDBA;Zmień zestaw systemowy AQ_TM_PROCESSES=3 SCOPE=BOTH;zmień zestaw systemowy global_names=TRUE zakres=OBU;zmień zestaw systemowy job_queue_processes=6 scope=OBA;zmień zestaw systemowy streams_pool_size=100M zakres=BOTH;zmień zestaw systemowy undo_retention=3600 scope=BOTH;zamknięcie natychmiastowe;montowanie startowe;zmiana otwierania bazy danych;Krok 2 Konfiguracja źródłowej lub podstawowej bazy danych
CONNECT [SOURCE_SYS_CONNECTION1] AS SYSDBA;ZMIEŃ SYSTEM ZESTAWU AQ_TM_PROCESSES=3 ZAKRES=OBA;zmień zestaw systemowy global_names=PRAWDA zakres=OBA;zmień zestaw systemowy job_queue_processes=6 scope=OBA;zmień zestaw systemowy streams_pool_size=48M zakres=BOTH;Zmień zestaw systemowy SMTP_OUT_SERVER='[MAIL_SERVER] [MAIL_PORT]' SCOPE=BOTH;--- UNDO_RETENTION=86400alter zestaw systemowy undo_retention=3600 scope=BOTH;--- UNDO_MANAGEMENT=AUTOZmień zestaw systemowy LOG_ARCHIVE_DEST_1 ='[=ARCHIWIZACJA]'Plik Systemowy'; Ustaw LOG_ARCHIVE_DEST_STATE_1=włącz Scope=Spfile;zamknij natychmiastowe;uruchomienie montowania;alter archiwum dziennika bazy danych;alter otwarcie bazy danych;Alter bazy danych Dodaj dodatkowe kolumny danych dziennika (klucz podstawowy, unikalny, klucz obcy);Zmień rejestrowanie siły bazy danych;Zmień bieżący dziennik archiwum systemowego;Krok 3 Utwórz przestrzeń tabel dla źródłowej bazy danych
connect [source_sys_connection1] jako sysdba;utwórz obszar tabel [logminer_ts_name]datafile '[logminer_datafile]'size 100mreuse autoextend na maxsize unlimited;wykonaj dbms_logmnr_d.set_tablespace('[logminer_ts_name]');utwórz obszar tabel [stream_datafile]'[data_name] autoextend na maxsize nieograniczony;Krok 4 Utwórz administratora strumieni Oracle dla źródłowej bazy danych
połącz [source_sys_connection1] jako sysdba;
utwórz użytkownika [source_stream_admin] identyfikowany przez [source_stream_psw] domyślny obszar tabel [stream_ts_name] tymczasowy obszar tabel; -- 9 ról dla [source_stream_admin] przyznaje zasoby do [source_stream_admin]; przyznaj datapump_imp_full_database do [source_stream_admin]; przyznaj imp_full_database do [source_stream_admin]; przyznaj datapump_exp_full_database do [source_stream_admin]; przyznaj exp_full_database do [source_stream_admin]; przydziel dbać do [source_stream_admin]; grant connect to [source_stream_admin]; przyznaj aq_administrator_role do [source_stream_admin]; przyznaj select_catalog_role do [source_stream_admin]; zmiana domyślnego zasobu roli użytkownika [source_stream_admin], imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 uprawnień systemowych dla [administrator_strumienia_źródłowego] beginys.dbms_rule_adm.grant_system_privilege( przywilej => sys.dbms_rule_adm.alter_any_rule_set, grantee => '[administrator_strumienia_źródłowego]/>.> 'dequeue_any', grantee => '[source_stream_admin]', admin_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( przywilej => sys.dbms_rule_adm.alter_any> sys.dbms_rule_adm. true);end;/ beginys.dbms_rule_adm.grant_system_privilege( przywilej => sys.dbms_rule_adm.create_rule_obj, grantee => '[source_stream_admin]', grant_option => true); przyznaj sesję ograniczoną do [source_stream_admin]; beginsys.dbms_rule_adm.grant_system_privilege (uprzywilej => sys.dbms_rule_adm.execute_any_rule_set, grantee => '[źródło_stream_admin]', grant_option => true); end;/beginsys.dbms_rule_adm.grant_sYSTEM_PrivileGe (privileGe)> SYS.RULE_ESPLE_SESY_SETY_ESE_SESY_SETY_ESY_SETE_RECE_RULE_ESP.> '[source_stream_admin]', grant_option => true);end;/ grant create session to [source_stream_admin]; beginys.dbms_aqadm.grant_system_privilege ( przywilej => 'enqueue_any', grantee => '[admin_strumienia_źródłowego]', admin_option => true);end;/ beginys.dbms_rule_adm. [source_stream_admin]', grant_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( przywilej => sys.dbms_rule_adm.create_any_rule, grantee => '[source_stream_starty_adm. .grant_system_privilege( przywilej => sys.dbms_rule_adm.create_evaluation_context_obj, grantee => '[stream_stream_admin]', grant_option => true); ', admin_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( przywilej => sys.dbms_rule_adm.create_rule_set_obj, grantee => '[prawda_strumienia_źródłowego];grant; />/
Krok 5 Tworzenie administratora strumieni dla docelowej bazy danych
połącz [target_sys_connection] jako sysdba;
--- uruchom jako użytkownik sys u użytkownika targetcreate [target_stream_admin] zidentyfikowanego przez [target_stream_psw]; -- 9 ról dla strmadmin przyznaje zasoby do [target_stream_admin]; przyznaj datapump_imp_full_database do [target_stream_admin]; przyznaj imp_full_database do [target_stream_admin]; przyznaj datapump_exp_full_database do [target_stream_admin]; przyznaj exp_full_database do [target_stream_admin]; nadaj dba do [target_stream_admin]; grant connect to [target_stream_admin]; przyznaj aq_administrator_role do [target_stream_admin]; przyznaj select_catalog_role do [target_stream_admin]; zmiana domyślnego zasobu roli użytkownika [target_stream_admin], imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 uprawnień systemowych dla [admin_docelowego_strumienia] beginys.dbms_rule_adm.grant_system_privilege( uprawnienia => sys.dbms_rule_adm.alter_any_rule_set, grantee => '[docelowy_strumień_opcja;ad.> 'dequeue_any', grantee => '[target_stream_admin]', admin_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( uprawnienie => sys.dbms_rule_adm => _stream_rule_adm. true);end;/ beginys.dbms_rule_adm.grant_system_privilege( przywilej => sys.dbms_rule_adm.create_rule_obj, grantee => '[target_stream_admin]', grant_option => true; admin_tabela_przestrzeń do [min grant] przyznaj sesję ograniczoną do [target_stream_admin]; beginsys.dbms_rule_adm.grant_system_privilege (uprzywilej => 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.RESY_ESE_SETE_SESY_SETE_SETY_SETE_SETE_SETE_ESP.> '[target_stream_admin]', grant_option => true);end;/ grant create session to [target_stream_admin]; beginys.dbms_aqadm.grant_system_privilege ( przywilej => 'enqueue_any', grantee => '[target_stream_admin]', admin_option => true); [target_stream_admin]', grant_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( przywilej => sys.dbms_rule_adm.create_any_rule, grantee => '[target', start_adm. .grant_system_privilege( przywilej => sys.dbms_rule_adm.create_evaluation_context_obj, grantee => '[target_stream_admin]', grant_option => true); ', admin_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( przywilej => sys.dbms_rule_adm.create_rule_set_obj, grantee => '[true_stream_admin;_opcja]',> przyznajKrok 6 Tworzenie łącza do bazy danych źródłowej bazy danych
połącz [połączenie_strumienia_źródłowego]
--- link do docelowej bazy danych... utwórz link do bazy danych [source_dblink] połącz z [target_stream_admin] zidentyfikowanym przez [target_stream_psw] za pomocą '[target_connect_string]';Krok 7 Tworzenie łącza bazy danych dla docelowej bazy danych
połącz [połączenie_strumienia_docelowego]
utwórz łącze do bazy danych [target_dblink] połącz się z [source_stream_admin] zidentyfikowanym przez [source_stream_psw] przy użyciu „[source_connect_string]”;Krok 8 Tworzenie katalogu Datapumb w docelowej bazie danych
połącz [połączenie_strumienia_docelowego]
utwórz lub zamień katalog[target_datapump_dir] jako „[target_dir_location]”;Krok 9 Tworzenie procesu przechwytywania w źródłowej bazie danych
wyłącz echo; ---accept strm_pwd_src monit „wprowadź hasło administratora strumieni „strmadmin” w źródle:„ukryj ---accept strm_pwd_dest monit „wprowadź hasło administratora strumieni „strmadmin” w miejscu docelowym:„hideconnect” [połączenie_strumienia_źródłowego]; zadeklaruj wybierz reguły wyboru vinet z dba_rulesets gdzie właściciel ='[source_stream_admin]';begin dla i w pętli vin zaczynaj dbms_rule_adm.drop_rule_set( rule_set_name => '[source_stream_admin].'||i.ruleset_name, delete_rules => true); wyjątek , gdy inne są wtedy puste; koniec; end loop;end;/begin dbms_streams_adm.set_up_queue( queue_table => '"streams_capture_qt"', nazwa_kolejki => '"streams_capture_q"', kolejka_użytkownika => '"[źródłowy_stream_adm_admin. => '"[schemat_źródła]"', streams_name => '"streams_propagation1"', source_queue_name => '"strmadmin"."streams_capture_q"', docelowy_kolejka'"."sstrm_ad_aplikacja_źródła => '"strmadmin". => true, include_ddl => true, source_database => '[źródło_database]', inclusion_rule => true); end;/commit; start dbms_streams_adm.add_schema_rules (Schema_Name => '"[Źródło_schema]"', strumień_type => 'capture_pure ', nazwa_strumienia => '"przechwytywanie_strumienia"', nazwa_kolejki => '"[administrator_strumienia_źródłowego]". n_rule => true);end;/-- powtórz powyższe 2 kroki dla każdego schematu;deklaruj kursor vin to select table_namefrom dba_streams_unsupportedwhere owner ='[source_schema]';beginfor c in vin loop dbms_streams_adm.add_source_name_rules> ( tabela .'||c.table_name, streams_type => 'capture', streams_name => 'streams_capture', queue_name => '[administrator_strumienia_źródłowego].streams_capture_q', include_dml => true, include_ddl => false, =>inclusion, rule> '[źródłowa_baza_danych]'; pętla zakończenia;zatwierdzenie;koniec;/Krok 10 Tworzenie procesu Apply w docelowej bazie danych
połącz [połączenie_strumienia_docelowego]
begin dbms_streams_adm.set_up_queue( queue_table => '"streams_apply_qt"', nazwa_kolejki => '"streams_apply_q"', użytkownik_kolejki => '"[target_stream_admin]" ' ]"', streams_type => 'apply', streams_name => '"streams_apply"', nazwa_kolejki => '"[docelowy_administrator_strumienia]". include_rule => true);end;/commit;begin dbms_apply_adm.set_parameter( apply_name => 'streams_apply', parametr => 'disable_on_error', wartość => 'n apply_name => 'streams_apply', parametr => 'disable_on_error', wartość => 'n apply_m. streams_apply', parametr => 'allow_duplicate_rows', wartość => 'y');end;/Krok 11 Tworzenie instancji docelowej bazy danych
połącz [połączenie_strumienia_docelowego]
ustaw serverout on;execute dbms_output.enable(50000);declare handle1 number; numer ind; liczba_procentu wykonania; stan_zadania varchar2(30); le ku$_logentry; js ku$_status pracy; jd ku$_jobdesc; sts ku$_status;begin zaczynać wykonaj natychmiastowe 'upuść użytkownika '||'[schemat_źródłowy]'||' kaskada'; wyjątek gdy inne wtedy null; koniec; handle1 :=dbms_datapump.open('import','schema', '[target_dblink]'); dbms_datapump.add_file(uchwyt1, 'streamimport_1349243553109.log', '[target_datapump_dir]', '', dbms_datapump.ku$_file_type_log_file); dbms_datapump.metadata_filter(uchwyt1, 'schema_expr', 'in (''[source_schema]'')'); --'in (''cdsl11'',''kra'')' dla wielu dbms_datapump.set_parameter(handle1, 'include_metadata', 1); dbms_datapump.start_job(uchwyt1); procent_wykonanych :=0; stan_zadania :='nieokreślony'; while (stan_zadania !='ukończono') i (stan_zadania !='zatrzymany') pętla dbms_datapump.get_status(uchwyt1, dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job_status + dbms,-1,stus_jobkup.; js :=sts.job_status; if js.percent_done !=procent_wykonanych then dbms_output.put_line('*** procent wykonanych zadań =' || to_char(js.percent_done)); procent_wykonanych :=js.procent_wykonanych; koniec jeśli; 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; koniec jeśli; koniec jeśli; jeśli plik nie jest pusty, wtedy ind :=le.first; podczas gdy ind nie jest pętlą zerową dbms_output.put_line(le(ind).logtext); ind :=le.next(ind); pętla końcowa; koniec jeśli; pętla końcowa; dbms_output.put_line('zadanie zakończone'); dbms_output.put_line('końcowy stan zadania =' || stan_zadania); dbms_datapump.detach (uchwyt1); end;/connect [source_stream_connection] Utwórz lub zamień wyzwalacz ddltrigger po utworzeniu na liczbie bazbasedEClare n; rozpocznij, jeśli ORA_DICT_OBJ_TYPE ='TABLE' i ORA_DICT_OBJ_OWNER ='[źródło_schema]', a następnie rozpocząć wybór 1 do dba_streams_Upported gdzie gdziekolwiek właściciel ='[schemat_źródła]' i nazwa_tabeli =ora_dict_obj_name; Jeśli n =1, to dbms_streams_adm.add_table_rules (tabela_name => '[źródło_schema]. true, include_ddl => false, inclusion_rule => false, źródło_database => '[źródło_database]'); koniec jeśli; wyjątek gdy inne wtedy brak; koniec; koniec jeśli;koniec;/Krok 12 Rozpoczęcie procesu aplikowania w docelowej bazie danych
połącz [połączenie_strumienia_docelowego]
ustaw serverout on;-- pobierz numer instancji zadeklaruj numer 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_s]',;beginselect decode(status, 'enabled', 1, 0) do v_started z dba_apply gdzie apply_name ='streams_apply'; if (v_started =0) then dbms_apply_adm.start_apply(apply_name => '"streams_apply"'); koniec jeśli;koniec;/Krok 13 Rozpoczęcie procesu przechwytywania źródła
połącz [połączenie_strumienia_źródłowego]
ustaw serverout on;declare v_started number;beginselect decode(status, 'enabled', 1, 0) do v_started z dba_capture gdzie capture_name ='streams_capture'; if (v_started =0) then dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** komunikat o postępie ===> rozpoczął proces przechwytywania streams_capture w źródłowej bazie danych estock i pomyślnie zastosował proces streams_apply w docelowej bazie danych. ***');end;/Twój konfiguracja jest teraz zakończona, aby sprawdzić, czy konfiguracja Steam działa poprawnie lub nie, użyj następujących poleceń, logując się przy użyciu poświadczeń administratora strumieni, które utworzyłeś dla źródłowej bazy danych.Wybierz * z V$STREAMS_CAPTURE;
Wybierz * Z DBA_CAPTURE;Wybierz * Z DBA_PROPAGATION;Wybierz * Z DBA_CAPTURE_PREPARED_TABLES;A dla docelowej bazy danych użyj następujących zapytań, logując się przy użyciu poświadczeń użytkownika strumieni w docelowej bazie danych.Wybierz * Z DBA_APPLY;
Wybierz * Od DBA_APPLY_CONFLICT_COLUMNS;Wybierz * Od DBA_APPLY_EXECUTE;Wybierz * Od DBA_APPLY_ERROR;Wybierz * Od DBA_APPLY_PROGRESS;Wybierz * Od DBA_APPLY_INSTANTIATED_OBJECTS;Wybierz * Od V$STREAMS_TRANSACTION_TRANSACTION_proces;wybierz cel V$STREAMS_TRANSACTION_PROGRESS; następujący skrypt:połącz [połączenie_strumienia_docelowego]
ustaw serverout on;declare v_started number;beginselect decode(status, 'enabled', 1, 0) do v_started z dba_apply gdzie apply_name ='streams_apply'; if (v_started =1) then dbms_apply_adm.stop_apply(apply_name => '"streams_apply"'); end if;end;/W przypadku, gdy chcesz zatrzymać proces przechwytywania źródłowej bazy danych, użyj następującego procesu:połącz [połączenie_strumienia_źródłowego]
ustaw serverout on;declare v_started number;beginselect decode(status, 'enabled', 1, 0) do v_started z dba_capture gdzie capture_name ='streams_capture'; if (v_started =0) then dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** komunikat o postępie ===> rozpoczął proces przechwytywania streams_capture w źródłowej bazie danych estock i pomyślnie zastosował proces streams_apply w docelowej bazie danych. ***');end;/Jeśli nie możesz modyfikować tych skryptów, możesz kupić to narzędzie, oparte na vb.net, sprawdź ten link Oracle Replication Software.