sql >> Database >  >> RDS >> Oracle

Oracle Streams stap voor stap replicatievoorbeeld

Wat is het realtime back-upsysteem van Oracle?

Oracle Streams-replicatie is het proces waarmee het Oracle-databaseschema kan worden gerepliceerd naar een andere Oracle-database, die zich op elke locatie kan bevinden. Telkens wanneer een transactie plaatsvindt in de primaire database DML of DDL, wordt deze onmiddellijk uitgevoerd naar de doeldatabase om een ​​live back-upkopie te behouden. Hieronder leg ik stap-voor-stap-replicatievoorbeelden uit en lever ik scripts voor Oracle Streams.

Oracle Streams-replicatie instellen

In dit bericht beschrijf ik stappen om een ​​Oracle-databasereplicatie te maken via de Oracle Streams-functie, voor een standby-database of database die kan worden gebruikt voor rapportage- en analysedoeleinden of voor andere doeleinden. Deze Oracle Streams-functie wordt ondersteund in Oracle 11g Enterprise Edition en 10gR2 en 9iR2. Oracle Streams wordt niet langer ondersteund in 12c; nu gebruikt Oracle Oracle Golden Gate voor deze functie. Ik heb hieronder eenvoudige stappen beschreven om een ​​replicatie naar een andere Oracle-database te maken, voor elke stap lever ik een SQL-script dat u kunt kopiëren en opslaan als stap-1, stap-2 enzovoort , voer vervolgens de scripts één voor één uit om de replicatie in te stellen. Maar voordat u de scripts uitvoert, wijzigt u de waarden in uw waarden die tussen vierkante haken staan ​​[ ] en vervangt u deze zorgvuldig door, alle waarden tussen vierkante haken hebben volledige namen, dus wijzig overeenkomstig.

Belangrijk! Maak een vermelding in tnsname.ora voor zowel de bron- als de doeldatabase voor elke andere verbinding.

Stap-1 Doel- of secundaire database configureren

CONNECT [TARGET_SYS_CONNECTION] AS SYSDBA;WIJZIG SYSTEEMSET AQ_TM_PROCESSES=3 SCOPE=BOTH;wijzig systeemset global_names=TRUE scope=BOTH;wijzig systeemset job_queue_processes=6 scope=BEIDE;wijzig systeemset streams_pool_size=100M systeemset=BOTH;wijzig systeemset undo_retention=3600 scope=BEIDE;onmiddellijk afsluiten;opstarten aankoppelen;database openen;

Stap-2 Bron- of primaire database configureren

CONNECT [SOURCE_SYS_CONNECTION1] ALS SYSDBA;SYSTEEMSET WIJZIGEN AQ_TM_PROCESSES=3 SCOPE=BOTH;systeemset wijzigen global_names=TRUE scope=BOTH;systeemset wijzigen job_queue_processes=6 scope=BOTH;systeemset wijzigen streams_pool_size=48M SYSTEEM=BEIDE; SMTP_OUT_SERVER='[MAIL_SERVER] [MAIL_PORT]' SCOPE=BOTH;--- UNDO_RETENTION=86400alter systeem set undo_retention=3600 scope=BOTH;--- UNDO_MANAGEMENT=AUTOAlter systeem set LOG_ARCHIVE_DEST_1 ='[ARCHIVELOG_DESTINATION]' Scope =Set LOG_ARCHIVE_DEST_STATE_1=enable Scope=Spfile;shutdown onmiddellijk;startup mount;database archivelog wijzigen;database open wijzigen; Database wijzigen Aanvullende loggegevens toevoegen (primaire sleutel, unieke, externe sleutel) kolommen; Database forceren logboekregistratie wijzigen; Wijzig systeemarchief logstroom;

Stap-3 Tabelruimte maken voor brondatabase

connect [source_sys_connection1] als sysdba;create tablespace [logminer_ts_name]datafile '[logminer_datafile]'size 100mreuse autoextend op maxsize unlimited;execute dbms_logmnr_d.set_tablespace('[logminer_ts_name]');create_tablespace_data_stream_mreuse automatisch verlengen op maxsize onbeperkt;

Stap-4 Maak een Oracle Streams-beheerdersgebruiker voor de brondatabase

verbind [source_sys_connection1] als sysdba;

maak gebruiker [source_stream_admin] geïdentificeerd door [source_stream_psw] standaard tablespace [stream_ts_name]  tijdelijke tablespace-temp; -- 9 rollen voor [source_stream_admin] verleen bron aan [source_stream_admin]; verleen datapump_imp_full_database aan [source_stream_admin]; verleen imp_full_database aan [source_stream_admin]; verleen datapump_exp_full_database aan [source_stream_admin]; verleen exp_full_database aan [source_stream_admin]; dba verlenen aan [source_stream_admin]; verlenen verbinding met [source_stream_admin]; aq_administrator_role verlenen aan [source_stream_admin]; verleen select_catalog_role aan [source_stream_admin]; verander gebruiker [source_stream_admin] standaard rol resource, imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 systeemrechten voor [source_stream_admin]  startsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.alter_any_rule_set, grantee      => '[source_stream_admin]', grant);> 'dequeue_any',  grantee      => '[source_stream_admin]',  admin_option => true);end;/  startsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_grant_adm.,[ _any_e rule] true);end;/  startsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_obj,  grantee      => '[source_stream_admin]', grant_option => Grant stream tablespace;/ source verleen beperkte sessie aan [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;/  Grant create session to [source_stream_admin]; begintys.dbms_aqadm.grant_system_privilege (  privilege    => 'enqueue_any',  grantee      => '[source_stream_admin]',  admin_option => true);end;/  startsys.dbms_rule_adm.grant_system_privilege( =) [source_stream_admin]',  grant_option => true);end;/  startsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[source_stream admin]',stream_admin]', .grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_evaluation_context_obj, grantee      => '[source_stream_admin]', grant_option => true);end;/ beginys.dbms_system_aqadm. t>any' privilege '() ',  admin_option => true);end;/  startsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[source_stream_admin]',  grant); />/

Stap-5 Streams-beheerder maken voor de doeldatabase

verbind [target_sys_connection] als sysdba;

--- uitvoeren als sys-gebruiker bij de targetcreate-gebruiker [target_stream_admin] geïdentificeerd door [target_stream_psw]; -- 9 rollen voor strmadmin ken resource toe aan [target_stream_admin]; verleen datapump_imp_full_database aan [target_stream_admin]; verleen imp_full_database aan [target_stream_admin]; verleen datapump_exp_full_database aan [target_stream_admin]; verleen exp_full_database aan [target_stream_admin]; dba verlenen aan [target_stream_admin]; verlenen verbinding met [target_stream_admin]; aq_administrator_role verlenen aan [target_stream_admin]; verleen select_catalog_role aan [target_stream_admin]; verander gebruiker [target_stream_admin] standaard rol resource, imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 systeemrechten voor [target_stream_admin]  startsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.alter_any_rule_set, grantee      => '[target_stream_admin]', grant);> 'dequeue_any',  grantee      => '[target_stream_admin]',  admin_option => true);end;/  startsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule grant_adm.,[ _anye rule] true);end;/  startsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_obj,  grantee      => '[target_stream_admin]', grant_option => unlimitedstream tablespace] to; verleen beperkte sessie aan [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;/  Grant create session to [target_stream_admin]; begintys.dbms_aqadm.grant_system_privilege (  privilege    => 'enqueue_any',  grantee      => '[target_stream_admin]',  admin_option => true);end;/  startsys.dbms_rule_adm.grant_system_privilege( = > ) [target_stream_admin]',  grant_option => true);end;/  startsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[target_stream admin]',stream admin]', .grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_evaluation_context_obj, grantee      => '[target_stream_admin]', grant_option => true);end;/ beginys.dbms_system_adm. t>any'privilege ', t>any'privilege ', t> privilege' ',  admin_option => true);end;/  startsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[target_stream_admin]',  grant);

Stap-6 Databaselink maken voor brondatabase

verbind [source_stream_connection]

--- link voor doeldatabase... maak databaselink [source_dblink] verbind met [target_stream_admin] geïdentificeerd door [target_stream_psw] met behulp van '[target_connect_string]';

Stap-7 Databasekoppeling maken voor doeldatabase

verbinden [target_stream_connection]

maak databaselink [target_dblink] verbind met [source_stream_admin] geïdentificeerd door [source_stream_psw] met behulp van '[source_connect_string]';

Stap-8 Datapumb-map maken op doeldatabase

verbinden [target_stream_connection]

maak of vervang directory[target_datapump_dir] als'[target_dir_location]';

Stap-9 Opnameproces creëren in de brondatabase

zet echo uit; ---accept strm_pwd_src prompt 'voer wachtwoord van streams in admin "strmadmin" bij bron:' hide  ---accept strm_pwd_dest prompt 'voer wachtwoord van streams in admin "strmadmin" op bestemming:' hideconnect   [source_stream_connection];declare  cursor vin is    select ruleset_name from dba_rulesets waar 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,    delete_rules  => true); uitzondering    wanneer anderen dan null; einde; end loop;end;/begin  dbms_streams_adm.set_up_queue(    queue_table => '"streams_capture_qt"',    queue_name  => '"streams_capture_q"',    queue_user  => '"[source_stream_admin]begin"');endb;/ru => '"[source_schema]"',   streams_name           => '"streams_propagation1"',    source_queue_name      => '"strmadmin"."streams_capture_q"',    destination_queue_name => '"st_source_apply"q,  bestemmingsqueue_name => '"st_appmin"q." => true,    include_ddl            => true,    source_database        => '[source_database]',   include_rule           => true);end;/commit;begin  dbms_streams_adm.(add  _schema_rule) ',    streams_name       => '"streams_capture"',    queue_name         => '"[source_stream_admin]"."streams_capture_q"',    include_dml        => true,    include_ddl  >   n_rule     => true);end;/-- herhaal bovenstaande 2 stappen voor elke schemacommit;declare cursor vin is    select table_namefrom dba_streams_unsupportedwhere owner ='[source_schema]';beginfor c in vin loop dbms_streams_adm.add_table_namerules => '[table_source_namerules] .'||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_database =false, source> '[source_database]' );end loop;commit;end;/

Stap-10 Aanmaken van een toepassingsproces op de doeldatabase

verbinden [target_stream_connection]

begin  dbms_streams_adm.set_up_queue(    queue_table => '"streams_apply_qt"',    queue_name  => '"streams_apply_q"',    queue_name  => '"[target_stream_admin]"');end;/begin_stream _ schema _ schema ]"',    streams_type       => 'apply',    streams_name       => '"streams_apply"',    queue_name         => '"[target_stream_admin]"."streams_apply_q"',    include _ ml  include_rule     => true);end;/commit;begin  dbms_apply_adm.set_parameter(    apply_name  => 'streams_apply',    parameter   => 'disable_on_error',    value       => 'n');end;/begin_ applydmeter streams_apply',    parameter   => 'allow_duplicate_rows',    value       => 'y');end;/

Stap-11 Instantie van doeldatabase

verbinden [target_stream_connection]

serverout instellen op; uitvoeren dbms_output.enable(50000);declare handle1 nummer; ind nummer; procent_klaar nummer; job_state varchar2(30); de ku$_logentry; js ku$_jobstatus; jd ku$_jobdesc; sts ku$_status;begin  begin  voer onmiddellijk uit 'drop user '||'[source_schema]'||' cascade'; uitzondering   wanneer anderen dan     null; einde; 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 (''[source_schema]'')'); --'in (''cdsl11'',''kra'')' voor meerdere dbms_datapump.set_parameter(handle1, 'include_metadata', 1); dbms_datapomp.start_job (handvat1); procent_klaar :=0; job_state :='niet gedefinieerd'; while (job_state !='completed') en (job_state !='stopped') loop  dbms_datapump.get_status(handle1, dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job_status + dbms_datapump.,kuust_jobdatapump_,ku$_status_job_status + dbms_jobdatapump.,ku$_status_job_error + dbms_datapump.ku$_status_job_status + dbms_status_wip_,-1; 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; stop als; 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; anders       le :=null; stop als; stop als; als le niet null is  dan    ind :=le.first; terwijl ind geen null-lus is      dbms_output.put_line(le(ind).logtext); ind :=le.next(ind); eindlus; stop als; eindlus; dbms_output.put_line('taak is voltooid'); dbms_output.put_line('laatste taakstatus =' || taakstatus); dbms_datapump.detach (handle1); end;/connect [source_stream_connection] Creëer of vervang trigger ddltrigger na het maken op databasedeclare n nummer; begin of ora_dict_obj_type ='tabel' en ora_dict_obj_ower ='[source_schema]' owner ='[source_schema]' en table_name =ora_dict_obj_name; if n =1         then            dbms_streams_adm.add_table_rules                                          (table_name           => '[source_schema].'                                                                   || ora_dict_obj_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, source_database => '[source_database]'); stop als; uitzondering         wanneer anderen         then            null; einde; einde als; einde;/

Stap-12 Starten met het toepassen van proces in de arget-database

verbinden [target_stream_connection]

zet serverout op;-- get instantiation numberdeclare 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_database]',instantiation_>scn   , .;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_apply waar apply_name ='streams_apply'; if (v_started =0) then  dbms_apply_adm.start_apply(apply_name => '"streams_apply"'); einde als; einde;/

Stap 13 Source Capture-proces starten

verbind [source_stream_connection]

stel serverout in op;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_capture waarbij 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('*** voortgangsbericht ===> startte het capture-proces streams_capture bij brondatabase estock en het proces streams toepassen_apply bij de doeldatabase met succes. ***');end;/Your setup is nu voltooid, om te controleren of je steams-setup goed werkt of gebruik de volgende commando's niet door in te loggen met streams-beheerdersgegevens die je hebt gemaakt voor de brondatabase.

Selecteer * Van V$STREAMS_CAPTURE;

Selecteer * Van DBA_CAPTURE;Selecteer * Van DBA_PROPAGATION;Selecteer * Van DBA_CAPTURE_PREPARED_TABLES;En gebruik voor de doeldatabase de volgende query's door in te loggen met streams-gebruikersreferenties op de doeldatabase.

Selecteer * Van DBA_APPLY;

Selecteer * Van DBA_APPLY_CONFLICT_COLUMNS;Selecteren * Van DBA_APPLY_EXECUTE;Selecteren * Van DBA_APPLY_ERROR;Selecteren * Van DBA_APPLY_PROGRESS;Selecteren * Van DBA_APPLY_INSTANTIATED_OBJECTS;Selecteren * Van V$STREAMS_TRANSACTION;PAGATION wilt u het proces gebruiken;PAGATION het volgende script:

verbinden [target_stream_connection]

stel serverout in op;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_apply waar apply_name ='streams_apply'; if (v_started =1) then  dbms_apply_adm.stop_apply(apply_name => '"streams_apply"'); end if;end;/Als u het proces voor het vastleggen van de brondatabase wilt stoppen, gebruikt u het volgende proces:

verbind [source_stream_connection]

stel serverout in op;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_capture waarbij 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('*** voortgangsbericht ===> startte het capture-proces streams_capture bij brondatabase estock en het proces streams toepassen_apply bij de doeldatabase met succes. ***');end;/

Als u deze scripts niet kunt wijzigen, kunt u dit hulpprogramma kopen, gebaseerd op vb.net. Raadpleeg deze link Oracle Replication Software.

  1. Wat betekent %Type in Oracle sql?

  2. Hoe REGEXP_INSTR() werkt in MariaDB

  3. Hoe TIMESTAMPADD() werkt in MariaDB

  4. Hoe ontsnap ik % van de python mysql-query?