Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Schritt-für-Schritt-Replikationsbeispiel für Oracle Streams

Was ist das Echtzeit-Backup-System von Oracle?

Die Oracle Streams-Replikation ist der Prozess, der es dem Oracle-Datenbankschema ermöglicht, in eine andere Oracle-Datenbank zu replizieren, die sich an einem beliebigen Ort befinden kann. Immer wenn eine Transaktion in der primären Datenbank-DML oder -DDL auftritt, wird sie sofort in der Zieldatenbank ausgeführt, um eine Live-Sicherungskopie zu erhalten. Im Folgenden erkläre und stelle ich Skripte für Oracle Streams Schritt-für-Schritt-Replikationsbeispiel bereit.

Einrichtung der Oracle Streams-Replikation

In diesem Beitrag beschreibe ich Schritte zum Erstellen einer Oracle-Datenbankreplikation über die Oracle Streams-Funktion für Standby-Datenbanken oder Datenbanken, die für Berichts- und Analysezwecke oder andere Zwecke verwendet werden können. Diese Oracle Streams-Funktion wird in Oracle 11g Enterprise Edition und unterstützt 10gR2 und 9iR2. Oracle Streams wird in 12c nicht mehr unterstützt; jetzt verwendet Oracle Oracle Golden Gate für diese Funktion. Im Folgenden habe ich einfache Schritte zum Erstellen einer Replikation in eine andere Oracle-Datenbank beschrieben. Für jeden Schritt stelle ich ein SQL-Skript bereit, das Sie kopieren und als Schritt 1, Schritt 2 usw. speichern können , führen Sie dann die Skripte nacheinander aus, um die Replikation einzurichten. Ändern Sie jedoch vor dem Ausführen der Skripts die Werte in Ihre Werte, die in eckigen Klammern [ ] stehen, und ersetzen Sie sie sorgfältig durch alle Werte in eckigen Klammern, die vollständige Namen haben, also ändern entsprechend.

Wichtig! Erstellen Sie einen Eintrag in tnsname.ora für Quell- und Zieldatenbanken für jede andere Verbindung.

Schritt-1 Ziel- oder Sekundärdatenbank konfigurieren

CONNECT [TARGET_SYS_CONNECTION] AS SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH;ändern Sie den Systemsatz global_names=TRUE scope=BOTH;ändern Sie den Systemsatz job_queue_processes=6 scope=BOTH;ändern Sie den Systemsatz streams_pool_size=100M scope=BOTH;ändern Sie den Systemsatz undo_retention=3600 scope=BOTH;sofort herunterfahren;starten mounten;Datenbank ändern geöffnet;

Schritt-2 Konfigurieren der Quell- oder Primärdatenbank

CONNECT [SOURCE_SYS_CONNECTION1] AS SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH;alter system set global_names=TRUE scope=BOTH;änder system set job_queue_processes=6 scope=BOTH;änder system set streams_pool_size=48M scope=BOTH;ALTER SYSTEM SET SMTP_OUT_SERVER='[MAIL_SERVER] [MAIL_PORT]' SCOPE=BOTH;--- UNDO_RETENTION=86400Systemsatz ändern undo_retention=3600 scope=BOTH;--- UNDO_MANAGEMENT=AUTOSystemsatz ändern LOG_ARCHIVE_DEST_1 ='[ARCHIVELOG_DESTINATION]' Scope=Spfile;System ändern Set LOG_ARCHIVE_DEST_STATE_1=enable Scope=Spfile;sofort herunterfahren;Startup-Mount;Änderung des Datenbank-Archivprotokolls;Änderung der Datenbank öffnen;Änderung der Datenbank Hinzufügen zusätzlicher Protokolldaten (Primärschlüssel, Eindeutiger, Fremdschlüssel) Spalten;Änderung der Datenbank Protokollierung erzwingen;Änderung des aktuellen Systemarchivprotokolls;

Schritt-3 Tablespace für Quelldatenbank erstellen

connect [source_sys_connection1] as sysdba; Tablespace [logminer_ts_name]datafile '[logminer_datafile]'size 100mreuse autoextend on maxsize unlimited;execute dbms_logmnr_d.set_tablespace('[logminer_ts_name]');tablespace [stream_ts_name]datafile '[stream_datafile]'size 100mreuse Autoextend bei maxsize unbegrenzt;

Schritt-4 Oracle Streams-Admin-Benutzer für die Quelldatenbank erstellen

connect [source_sys_connection1] as sysdba;

Benutzer [source_stream_admin] erstellen, identifiziert durch [source_stream_psw], Standard-Tablespace [stream_ts_name], temporärer Tablespace temp; -- 9 Rollen für [source_stream_admin] gewähren Ressource an [source_stream_admin]; gewähren Sie datapump_imp_full_database [source_stream_admin]; Gewähre imp_full_database [source_stream_admin]; gewähren Sie datapump_exp_full_database [source_stream_admin]; exp_full_database an [source_stream_admin] gewähren; gewähren Sie [source_stream_admin] dba; Verbindung zu [source_stream_admin] gewähren; gewähren Sie [source_stream_admin] aq_administrator_role; Gewähre select_catalog_role [source_stream_admin]; alter user [source_stream_admin] Standardrollenressource, imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 Systemprivilegien für [source_stream_admin]  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_aqadm.grant_system_privilege (  privilege => 'dequeue_any',  grantee      => '[source_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.alter_any_rule,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.create_rule_obj,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  [source_stream_admin] unbegrenzten Tablespace gewähren; gewähren Sie [source_stream_admin] eine eingeschränkte Sitzung; beginsys.dbms_rule_adm.grant_system_privilege (privilege => sys.dbms_rule_adm.execute_any_rule_set, steriene => '[socal_stream_admin]', Grant_option => true);> '[source_stream_admin]',  grant_option => true);end;/  gewähren Sie [source_stream_admin] Sitzung erstellen; beginsys.dbms_aqadm.grant_system_privilege (  Privileg    => 'enqueue_any',  grantee      => '[source_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.execute_any_rule,  [source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm .grant_system_privilege( privileg    => sys.dbms_rule_adm.create_evaluation_context_obj,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_aqadm.grant_system_privilege ( privileg    =stream> 'manage_any',  grantee      =>] ',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[source_stream_admin]',  grant_option => true);end;
/

Schritt-5 Streams Admin für die Zieldatenbank erstellen

connect [target_sys_connection] as sysdba;

--- als sys-Benutzer unter dem targetcreate-Benutzer [target_stream_admin] ausführen, der durch [target_stream_psw] identifiziert wird; -- 9 Rollen für strmadmin Ressource gewähren an [target_stream_admin]; gewähren Sie datapump_imp_full_database an [target_stream_admin]; Gewähre imp_full_database [target_stream_admin]; gewähren Sie datapump_exp_full_database [target_stream_admin]; exp_full_database an [target_stream_admin] gewähren; Gewähre dba [target_stream_admin]; Verbindung zu [target_stream_admin] gewähren; gewähren Sie [target_stream_admin] eine aq_administrator_role; gewähren Sie select_catalog_role [target_stream_admin]; alter user [target_stream_admin] Standardrollenressource, imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; -- 15 Systemprivilegien für [target_stream_admin]  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_aqadm.grant_system_privilege (  Privileg  > 'dequeue_any',  grantee      => '[target_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.alter_any_rule,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.create_rule_obj,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  [target_stream_admin] unbegrenzten Tablespace gewähren; gewähren Sie [target_stream_admin] eine eingeschränkte Sitzung; beginsys.dbms_rule_adm.grant_system_privilege (privilege => sys.dbms_rule_adm.execute_any_rule_set, steryee => '[target_stream_admin]', Grant_option => true);> '[target_stream_admin]',  grant_option => true);end;/  create session to [target_stream_admin] gewähren; beginsys.dbms_aqadm.grant_system_privilege (  Privileg    => 'enqueue_any',  grantee      => '[target_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.execute_any_rule,  [target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm .grant_system_privilege( privileg    => sys.dbms_rule_adm.create_evaluation_context_obj,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_aqadm.grant_system_privilege ( privileg    =stream> 'manage_any',  grantee      => ] ',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  Privileg    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[target_stream_admin]',  grant_option => true);end;/

Schritt-6 Datenbankverknüpfung für Quelldatenbank erstellen

connect [source_stream_connection]

--- Link für Zieldatenbank ... Datenbanklink erstellen [source_dblink] Verbindung zu [target_stream_admin] herstellen, identifiziert durch [target_stream_psw] unter Verwendung von '[target_connect_string]';

Schritt-7 Erstellen eines Datenbanklinks für die Zieldatenbank

connect [target_stream_connection]

Datenbanklink erstellen [target_dblink] Verbindung zu [source_stream_admin] herstellen, identifiziert durch [source_stream_psw] unter Verwendung von '[source_connect_string]';

Schritt-8 Erstellen des Datapumb-Verzeichnisses in der Zieldatenbank

connect [target_stream_connection]

erstelle oder ersetze das Verzeichnis[target_datapump_dir] as'[target_dir_location]';

Schritt-9 Capture-Prozess in der Quelldatenbank erstellen

Echo ausschalten; --- strm_pwd_src-Eingabeaufforderung akzeptieren 'Passwort des Stream-Administrators "strmadmin" an der Quelle eingeben:' hide ---strm_pwd_dest-Eingabeaufforderung akzeptieren 'Passwort des Streams-Administrators "strmadmin" am Ziel eingeben:' hideconnect   [source_stream_connection];declare  cursor vin is    select ruleset_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,    delete_rules  => true); Ausnahme    wenn andere dann null sind; Ende; 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]"');end;/begin  dbms_streams_adm.add_schema_propagation_rules(   schema_propagation_rules(   schema_propagation_rules(   schema_propagation_rules). => '"[source_schema]"',   streams_name           => '"streams_propagation1"',    source_queue_name      => '"strmadmin"."streams_capture_q"',    destination_queue_name => '"strmadmin"."streams_apply_q"@[source_dblink]',    include_dml => true,    include_ddl            => true,    Quelldatenbank        => '[Quelldatenbank]',    Einschlussregel           => true);end;/commit;begin  dbms_streams_adm.add_schema_rules(    schema_name        => '"[source_ _  ]" ',    streams_name       => '"streams_capture"',    queue_name         => '"[source_stream_admin]"."streams_capture_q"',    include_dml        => true,    include_ddl        => true,    include_tagged_lcr => false,    inclusio n_rule     => true);end;/-- wiederholen Sie die obigen 2 Schritte für jedes Schemacommit;deklarieren Sie Cursor vin ist    select table_namefrom dba_streams_unsupportedwhere owner ='[source_schema]';beginfor c in vin loop dbms_streams_adm.add_table_rules ( table_name => '[source_schema] .'||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 => false, source_database => '[source_database]' );end loop;commit;end;/

Schritt-10 Apply-Prozess in der Zieldatenbank erstellen

connect [target_stream_connection]

begin  dbms_streams_adm.set_up_queue(    queue_table => '"streams_apply_qt"',    queue_name  => '"streams_apply_q"',    queue_user  => '"[target_stream_admin]"');end;/begin  dbms_streams_adm.add_schema_rules(    schema_name     ' [source=" ]"',    streams_type       => 'apply',    streams_name       => '"streams_apply"',    queue_name         => '"[target_stream_admin]"."streams_apply_q"',    include_dml        => true,    include_ddl          => true,    include_ddl          => true,    => include_lc, false_tagged, Einschlussregel     => true);end;/commit;begin  dbms_apply_adm.set_parameter(    apply_name  => 'streams_apply',    parameter   => 'disable_on_error',    value       => 'n');end;/begin  dbms_apply_adm.set_parameter(    apply_name  => ' streams_apply',    parameter   => 'allow_duplicate_rows',    value       => 'y');end;/

Schritt-11 Zieldatenbank instanziieren

connect [target_stream_connection]

setze serverout on; führe dbms_output.enable(50000) aus; deklariere Handle1 Nummer; ind-Nummer; percent_done Zahl; job_state varchar2(30); le ku$_logentry; js ku$_jobstatus; jd ku$_jobdesc; sts ku$_status;begin  begin  führe sofort aus 'drop user '||'[source_schema]'||' Kaskade'; Ausnahme   wenn andere dann     null; Ende; 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'')' für mehrere  dbms_datapump.set_parameter(handle1, 'include_metadata', 1); dbms_datapump.start_job(handle1); Prozent_erledigt :=0; job_state :='undefiniert'; while (job_state !='completed') and (job_state !='stopped') loop  dbms_datapump.get_status(handle1, dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job_status + dbms_datapump.ku$_status_wip,-1,job_state,sts); js :=sts.job_status; if js.percent_done !=percent_done  then     dbms_output.put_line('*** Jobprozentsatz erledigt =' || to_char(js.percent_done)); prozent_erledigt :=js.percent_done; Ende wenn; 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; sonst       le :=null; Ende wenn; Ende wenn; wenn le nicht null ist  dann    ind :=le.first; while ind ist keine Nullschleife      dbms_output.put_line(le(ind).logtext); ind :=le.next(ind); Endschleife; Ende wenn; Endschleife; dbms_output.put_line('Auftrag abgeschlossen'); dbms_output.put_line('final job state =' || job_state); dbms_datapump.detach (Handle1); End;/connect [socal_stream_connection] Erstellen oder Ersetzen von Trigger Ddltrigger nach der datenbankgestützten Nummer. Beginnen Sie, wenn ora_dict_obj_type ='table' und ora_dict_obj_owner ='[scree_schema]' table 1 Ins N inn n von DBA_Obj_Owner ='[scree_Schema]' starten 'the -inn -ora in nn von DBA_Stams_Mema'. Eigentümer ='[source_schema]' und Tabellenname =ora_dict_obj_name; Wenn n =1 dann dbms_streams_adm.add_table_rules (table_name => '[source_schema]. Richtig, include_ddl => false, inclusion_rule => false, Source_Database => '[source_database]'); Ende wenn; Ausnahme         wenn andere         dann            null; Ende; end if;ende;/

Schritt-12 Starten des Apply-Prozesses in der Zieldatenbank

connect [target_stream_connection]

set serverout on;-- Instanziierungsnummer abrufeniscn-Nummer deklarieren; 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    => iscn,recursive            => true);;beginselect decode(status, 'enabled', 1, 0) in v_started from dba_apply where apply_name ='streams_apply'; if (v_started =0) then  dbms_apply_adm.start_apply(apply_name => '"streams_apply"'); end if;ende;/

Schritt-13 Starten des Quellerfassungsprozesses

connect [source_stream_connection]

set serverout on;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_capture where 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('*** progress message ===> hat den Capture-Prozess streams_capture in der Quelldatenbank estock und den Apply-Prozess streams_apply in der Zieldatenbank erfolgreich gestartet. ***');end;/Your Das Setup ist jetzt abgeschlossen. Um zu überprüfen, ob Ihr Steams-Setup ordnungsgemäß funktioniert oder nicht, verwenden Sie die folgenden Befehle, indem Sie sich mit den Streams-Administratoranmeldeinformationen anmelden, die Sie für die Quelldatenbank erstellt haben.

Wählen Sie * Aus V$STREAMS_CAPTURE;

Wählen Sie * aus DBA_CAPTURE;Wählen Sie * aus DBA_PROPAGATION;Wählen Sie * aus DBA_CAPTURE_PREPARED_TABLES;Und verwenden Sie für die Zieldatenbank die folgenden Abfragen, indem Sie sich mit Streams-Benutzeranmeldeinformationen bei der Zieldatenbank anmelden.

Wählen Sie * Von DBA_APPLY;

aus * Aus DBA_APPLY_CONFLICT_COLUMNS auswählen; * Aus DBA_APPLY_EXECUTE auswählen; * Aus DBA_APPLY_ERROR auswählen; * Aus DBA_APPLY_PROGRESS auswählen; * Aus DBA_APPLY_INSTANTIATED_OBJECTS auswählen; * Aus V$STREAMS_TRANSACTION auswählen; * Aus V$PROPAGATION_RECEIVER auswählen; folgendes Skript:

connect [target_stream_connection]

set serverout on;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_apply where apply_name ='streams_apply'; if (v_started =1) then  dbms_apply_adm.stop_apply(apply_name => '"streams_apply"'); end if;end;/Falls Sie den Erfassungsprozess der Quelldatenbank beenden möchten, verwenden Sie den folgenden Prozess:

connect [source_stream_connection]

set serverout on;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_capture where 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('*** progress message ===> hat den Erfassungsprozess streams_capture in der Quelldatenbank estock und den Apply-Prozess streams_apply in der Zieldatenbank erfolgreich gestartet. ***');end;/

Wenn Sie diese Skripte nicht ändern können, können Sie dieses Dienstprogramm basierend auf vb.net kaufen. Klicken Sie auf diesen Link Oracle Replication Software.