Oracle
 sql >> Base de données >  >> RDS >> Oracle

Exemple de réplication étape par étape Oracle Streams

Qu'est-ce que le système de sauvegarde en temps réel d'Oracle ?

La réplication Oracle Streams est le processus qui permet au schéma de base de données Oracle de se répliquer vers une autre base de données Oracle, qui peut être située à n'importe quel emplacement. Chaque fois qu'une transaction se produit dans la base de données principale DML ou DDL, elle s'exécute immédiatement dans la base de données cible pour conserver une copie de sauvegarde en direct. Ci-dessous, j'explique et je fournis des scripts pour l'exemple de réplication étape par étape d'Oracle Streams.

Configuration de la réplication d'Oracle Streams

Dans cet article, je décris les étapes pour créer une réplication de base de données Oracle via la fonctionnalité Oracle Streams, pour une base de données de secours ou une base de données pouvant être utilisée à des fins de reporting et d'analyse ou à toute autre fin. Cette fonctionnalité Oracle Streams est prise en charge dans Oracle 11g Enterprise Edition et 10gR2 et 9iR2. Oracle Streams n'est plus pris en charge dans 12c; maintenant Oracle utilise Oracle Golden Gate pour cette fonctionnalité. J'ai décrit ci-dessous des étapes simples pour créer une réplication vers une autre base de données Oracle, pour chaque étape, je fournis un script SQL que vous pouvez copier et enregistrer en tant qu'étape 1, étape 2, etc. , puis exécutez les scripts un par un pour configurer la réplication. Mais avant d'exécuter les scripts, remplacez les valeurs par vos valeurs entre crochets [ ] et remplacez-les avec précaution, toutes les valeurs entre crochets ayant une signification des noms complets, alors changez par conséquent.

Important! Créez une entrée dans tnsname.ora pour les bases de données source et cible pour chaque autre connexion.

Étape 1 Configuration de la base de données cible ou secondaire

CONNECT [TARGET_SYS_CONNECTION] AS SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH;alter system set global_names=TRUE scope=BOTH;alter system set job_queue_processes=6 scope=BOTH;alter system set streams_pool_size=100M scope=BOTH;alter system set undo_retention=3600 scope=BOTH ; arrêt immédiat ; démarrage du montage ; modification de la base de données ouverte ;

Étape 2 Configuration de la base de données source ou primaire

CONNECT [SOURCE_SYS_CONNECTION1] AS SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH;alter system set global_names=TRUE scope=BOTH;alter system set job_queue_processes=6 scope=BOTH;alter system set streams_pool_size=48M scope=BOTH;ALTER SYSTEM SET SMTP_OUT_SERVER='[MAIL_SERVER] [MAIL_PORT]' SCOPE=BOTH ;--- UNDO_RETENTION=86400alter system set undo_retention=3600 scope=BOTH ;--- UNDO_MANAGEMENT=AUTOAlter System Set LOG_ARCHIVE_DEST_1 ='[ARCHIVELOG_DESTINATION]' Scope=Spfile;Alter System Set LOG_ARCHIVE_DEST_STATE_1=enable Scope=Spfile;shutdown immediate;startup mount;alter database archivelog;alter database open;Alter Database Add Supplemental Log Data(Primary Key, Unique, Foreign Key) Columns;Alter Database Force Logging;Alter System Archive Log Current;

Étape 3 Créer un tablespace pour la base de données source

connecter [source_sys_connection1] en tant que sysdba ; créer un espace de table [logminer_ts_name] fichier de données '[logminer_datafile]' taille 100mreuse extension automatique sur maxsize illimité ; exécuter dbms_logmnr_d.set_tablespace('[logminer_ts_name]'); créer un espace de table [stream_ts_name]fichier de données '[stream_datafile]' taille 100mreuse extension automatique sur maxsize illimité ;

Étape 4 Créer un utilisateur administrateur Oracle Streams pour la base de données source

connecter [source_sys_connection1] en tant que sysdba ;

créer l'utilisateur [source_stream_admin] identifié par [source_stream_psw] tablespace par défaut [stream_ts_name] tablespace temporaire temporaire ; -- 9 rôles pour [source_stream_admin] accordent des ressources à [source_stream_admin] ; accorder datapump_imp_full_database à [source_stream_admin] ; accordez imp_full_database à [source_stream_admin] ; accorder datapump_exp_full_database à [source_stream_admin] ; accordez exp_full_database à [source_stream_admin] ; accorder dba à [source_stream_admin] ; accorder la connexion à [source_stream_admin] ; accordez aq_administrator_role à [source_stream_admin] ; accordez select_catalog_role à [source_stream_admin] ; modifier la ressource de rôle par défaut de l'utilisateur [source_stream_admin], imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role ; -- 15 privilèges système pour [source_stream_admin]  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginys.dbms_aqadm.grant privilege (_system_privilege > 'dequeue_any',  bénéficiaire      => '[source_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.alter_any_rule,  bénéficiaire      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_obj,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  accorder un espace de table illimité à [source_stream_admin] ; accorder une session restreinte à [source_stream_admin] ; Beginatsys.dbms_rule_adm.grant_system_privilege (privilège => sys.dbms_rule_adm.execute_any_rule_set, bénéficiaire => '[source_stream_admin]', subvention_option => true); end; / début> '[source_stream_admin]',  grant_option => true);end;/  accorder la session de création à [source_stream_admin] ; beginsys.dbms_aqadm.grant_system_privilege (  privilège    => 'enqueue_any',  grantee      => '[source_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.exe'=> sys.dbms_rule_adm.exe'cute_any_rule, accord  [source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm .grant_system_privilege( privilège    => sys.dbms_rule_adm.create_evaluation_context_obj, bénéficiaire      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_aqadm.grant_system_privilege ( privilège    => 'manage_any', bénéficiaire      => ',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[source_stream_admin]',  grant_option => true);end;
/

Étape-5 Création de l'administrateur de flux pour la base de données cible

connecter [target_sys_connection] en tant que sysdba ;

--- exécuter en tant qu'utilisateur système sur l'utilisateur cible de création [target_stream_admin] identifié par [target_stream_psw] ; -- 9 rôles pour strmadmin accordent la ressource à [target_stream_admin] ; accorder datapump_imp_full_database à [target_stream_admin] ; accordez imp_full_database à [target_stream_admin] ; accorder datapump_exp_full_database à [target_stream_admin] ; accordez exp_full_database à [target_stream_admin] ; accorder dba à [target_stream_admin] ; accorder la connexion à [target_stream_admin] ; accordez aq_administrator_role à [target_stream_admin] ; accordez select_catalog_role à [target_stream_admin] ; modifier la ressource de rôle par défaut de l'utilisateur [target_stream_admin], imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role ; -- 15 privilèges système pour [target_stream_admin]  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.alter_any_rule_set,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_aqadm.grant_system_privilege ( privilege = privilege > 'dequeue_any',  bénéficiaire      => '[target_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.alter_any_rule,  bénéficiaire      => '[target_stream_admin]',  grant_option]> true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_obj,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  accorder un espace de table illimité à [target_stream_admin] ; accorder une session restreinte à [target_stream_admin] ; Beginatsys.dbms_rule_adm.grant_system_privilege (privilège => sys.dbms_rule_adm.execute_any_rule_set, bénéficiaire => '[cible_stream_admin]', subvention_option => true); end; / début> '[target_stream_admin]',  grant_option => true);end;/  accorder la session de création à [target_stream_admin] ; beginsys.dbms_aqadm.grant_system_privilege (  privilège    => 'enqueue_any',  bénéficiaire      => '[target_stream_admin]',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm. [target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_any_rule,  grantee      => '[target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm .grant_system_privilege( privilège    => sys.dbms_rule_adm.create_evaluation_context_obj, bénéficiaire      => '[target_stream_admin]',  grant_option => true);end;/  beginsys.dbms_aqadm.grant_system_privilege ( privilège    => 'manage_stream', bénéficiaire      ]  ',  admin_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_set_obj,  grantee      => '[target_stream_admin]',  grant_option => true);end;/

Étape 6 Création d'un lien de base de données pour la base de données source

connecter [source_stream_connection]

--- lien pour la base de données cible... créer un lien de base de données [source_dblink] se connecter à [target_stream_admin] identifié par [target_stream_psw] en utilisant '[target_connect_string]' ;

Étape-7 Création d'un lien de base de données pour la base de données cible

connecter [target_stream_connection]

créer un lien de base de données [target_dblink] se connecter à [source_stream_admin] identifié par [source_stream_psw] en utilisant '[source_connect_string]' ;

Étape 8 Création d'un répertoire Datapumb sur la base de données cible

connecter [target_stream_connection]

créer ou remplacer le répertoire [target_datapump_dir] par '[target_dir_location]' ;

Étape 9 Création du processus de capture dans la base de données source

désactiver l'écho ; ---accept strm_pwd_src prompt 'entrez le mot de passe de l'administrateur des flux "strmadmin" à la source :' hide ---accept strm_pwd_dest prompt 'entrez le mot de passe de l'administrateur des flux "strmadmin" à la destination :' 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); exception    lorsque d'autres alors nul ; finir; 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_schema_ rules(   name => '"[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, source_database => '[source_database]', inclusion_rule => true); end; / englober; begin dbms_streams_adm.add_schema_rules (schema_name => '"[source_schema]"', streams_type => 'capture ',    streams_name       => '"streams_capture"',    queue_name         => '"[source_stream_admin]"."streams_capture_q"',    include_dml        => vrai,    include_ddl        => vrai,    include_tagged_lcr => faux,    inclusio n_rule     => true);end;/-- répétez les 2 étapes ci-dessus pour chaque schémacommit ;déclarez cursor vin is    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]' );fin de boucle;commit;end;/

Étape 10 Création du processus d'application dans la base de données cible

connecter [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      ]"',    streams_type       => 'apply',    streams_name       => '"streams_apply"',    queue_name         => '"[target_stream_admin]"."streams_apply_q"',    include_dml        => true,    include_ddl     t => true,  => true inclusion_rule     => 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',    paramètre   => 'allow_duplicate_rows',    value       => 'y');end;/

Étape 11 Instanciation de la base de données cible

connecter [target_stream_connection]

définir serverout sur ;exécuter dbms_output.enable(50000);déclarer le numéro handle1 ; numéro d'identification ; nombre percent_done ; job_state varchar2(30); le ku$_logentry ; js ku$_jobstatus ; jd ku$_jobdesc; sts ku$_status;begin  begin  execute immediate 'drop user '||'[source_schema]'||' Cascade'; exception   lorsque d'autres alors     null ; finir; 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'')' pour plusieurs dbms_datapump.set_parameter(handle1, 'include_metadata', 1); dbms_datapump.start_job(handle1); pourcentage_fait :=0; job_state :='non défini'; 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('*** job percent done =' || to_char(js.percent_done)); percent_done :=js.percent_done; fin si; 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; sinon       le :=null ; fin si; fin si; si le n'est pas nul alors    ind :=le.first ; while ind is not null loop      dbms_output.put_line(le(ind).logtext); ind :=le.next(ind); boucle de fin ; fin si; boucle de fin ; dbms_output.put_line('le travail est terminé'); dbms_output.put_line('état final du travail =' || état_travail); dbms_datapump.detach (handle1); end; / connect [source_stream_connection] créer ou remplacer le déclencheur ddltrigger après créer sur databasedeclare n numéro; commencer si Ora_Dict_OBJ_TYPE ='Table' et Ora_DICT_OBJ_OWNER ='[Source_Schema]' Ensuite propriétaire ='[source_schema]' et table_name =ora_dict_obj_name ; Si n =1 alors dbms_streams_adm.add_table_rules (table_name => '[source_schema]. true, include_ddl => false, inclusion_rule => false, source_database => '[source_database]'); fin si; exception         lorsque d'autres         alors            null ; finir; fin si;fin;/

Étape 12 Démarrage du processus d'application dans la base de données arget

connecter [target_stream_connection]

set serverout on ;-- get instanciation numberdeclare iscn number ; 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           number ;;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_apply where apply_name ='streams_apply' ; if (v_started =0) then  dbms_apply_adm.start_apply(apply_name => '"streams_apply"'); fin si;fin;/

Étape 13 Démarrage du processus de capture de la source

connecter [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('*** message de progression ===> a démarré le processus de capture streams_capture à la base de données source estock et le processus d'application streams_apply à la base de données de destination avec succès. ***');end;/Votre La configuration est maintenant terminée, pour vérifier que votre configuration Steams fonctionne correctement ou non, utilisez les commandes suivantes en vous connectant avec les informations d'identification d'administrateur de flux que vous avez créées pour la base de données source.

Sélectionnez * De V$STREAMS_CAPTURE ;

Sélectionnez * De DBA_CAPTURE;Sélectionnez * De DBA_PROPAGATION;Sélectionnez * De DBA_CAPTURE_PREPARED_TABLES;Et pour la base de données cible, utilisez les requêtes suivantes en vous connectant avec les informations d'identification de l'utilisateur de flux sur la base de données cible.

Sélectionnez * De DBA_APPLY ;

Sélectionnez * De DBA_APPLY_CONFLICT_COLUMNS;Sélectionnez * De DBA_APPLY_EXECUTE;Sélectionnez * De DBA_APPLY_ERROR;Sélectionnez * De DBA_APPLY_PROGRESS;Sélectionnez * De DBA_APPLY_INSTANTIATED_OBJECTS;Sélectionnez * De V$STREAMS_TRANSACTION;Sélectionnez *De V$PROPAGATION_RECEIVER;Si vous souhaitez arrêter le processus d'application cible, utilisez le script suivant :

connecter [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;/Si vous souhaitez arrêter le processus de capture de la base de données source, utilisez le processus suivant :

connecter [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 ===> a démarré le processus de capture streams_capture dans la base de données source estock et le processus d'application streams_apply dans la base de données de destination avec succès. ***');end;/

Si vous n'êtes pas en mesure de modifier ces scripts, vous pouvez acheter cet utilitaire, basé sur vb.net, consultez ce lien Oracle Replication Software.