Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Przykład replikacji strumieni Oracle krok po kroku

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]',> przyznaj

Krok 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.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 funkcje, które zwracają miesiąc z daty w Oracle

  2. Jak mogę utworzyć kopię tabeli Oracle bez kopiowania danych?

  3. Sprawdź, czy dwa wybory są równoważne

  4. Linq to Entities Group By (OUTER APPLY) oracle 11.2.0.3.0 nie obsługuje zastosowania

  5. Jak usunąć wszystkie tabele użytkowników?