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.