Oracleデータベース(Oracle Streams)の双方向同期のセットアップ





RACの下にディスクシェルフがなく、リアルタイムのOracleデータベースの復元力を提供する必要がある場合はどうすればよいですか? Oracle Data Streams(Oracle Streams)をカスタマイズします!



データストリームについて多くのことが書かれています。 たとえば、 ここここここ公式文書を含む)。 この記事では、Oracle Standard Edition OneおよびOracle Standard Edition 11gR2エディションで動作するREDOログを使用しない構成オプションについて説明します(Enterpriseライセンスを使用すると、Enterprise Managerコンソールで直接構成が簡単になります。 制限を参照してください)。



そのため、HRスキーマのすべてのテーブルでDML操作を自動的にインターセプトし、双方向でデータを同期するよう努めています。





  1. データベースシステムパラメータの設定:



    sqlplus / as sysdba ALTER SYSTEM SET global_names = true scope= both; ALTER SYSTEM SET shared_pool_size = 256M scope= both; ALTER SYSTEM SET streams_pool_size = 256M scope= both; ALTER SYSTEM SET java_pool_size = 100M scope= both; ALTER SYSTEM SET parallel_max_servers= 10 scope= both;
          
          



  2. Oracle Net Servicesの構成

    tnsnames.ora:
     ORCLA = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host_a)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcla.local) ) ) ORCLB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host_b)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orclb.local) ) )
          
          





  3. Streams Admin表領域の作成:



     mkdir C:\Oracle\app\oradata\strems sqlplus / as sysdba --    CREATE TABLESPACE streams_tbs DATAFILE 'C:\Oracle\app\oradata\strems\streams_tbs.dbf' SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
          
          



  4. Oracle Streams権限を持つストリーム管理者の作成:



     sqlplus / as sysdba --   Streams CREATE USER strmadmin IDENTIFIED BY "<>" DEFAULT TABLESPACE streams_tbs QUOTA UNLIMITED ON streams_tbs; --    GRANT CONNECT TO strmadmin; GRANT DBA TO strmadmin; BEGIN --   Streams DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE( grantee => 'strmadmin', grant_privileges => TRUE); END; / execute MGMT_USER.MAKE_EM_USER('STRMADMIN');
          
          



  5. データベースリンクの作成:



     sqlplus strmadmin@orcla CREATE DATABASE LINK orclb CONNECT TO strmadmin IDENTIFIED BY "<>" USING 'orclb'; sqlplus strmadmin@orclb CREATE DATABASE LINK orcla CONNECT TO strmadmin IDENTIFIED BY "<>" USING 'orcla'; --     SELECT * FROM ALL_DB_LINKS; --     SELECT * FROM DUAL@ORCLB; SELECT * FROM TAB@ORCLB;
          
          



  6. データベースへの変更を保存するために使用されるStreamsキューの作成:



     sqlplus strmadmin@orcla begin --   (4 ANYDATA queues at each database) dbms_streams_adm.set_up_queue@orcla( queue_table=> 'strmadmin.apply_queue_table_a', queue_name => 'strmadmin.apply_queue_a', queue_user => 'strmadmin'); dbms_streams_adm.set_up_queue@orcla( queue_table=> 'strmadmin.capture_queue_table_a', queue_name => 'strmadmin.capture_queue_a', queue_user => 'strmadmin'); dbms_streams_adm.set_up_queue@orclb( queue_table=> 'strmadmin.apply_queue_table_b', queue_name => 'strmadmin.apply_queue_b', queue_user => 'strmadmin'); dbms_streams_adm.set_up_queue@orclb( queue_table=> 'strmadmin.capture_queue_table_b', queue_name => 'strmadmin.capture_queue_b', queue_user => 'strmadmin'); end; /
          
          



  7. アプリケーションプロセスの作成(適用プロセス):



     sqlplus strmadmin@orcla begin --    dbms_apply_adm.create_apply@orcla( queue_name => 'strmadmin.apply_queue_a', apply_name => 'apply_a', source_database=> 'orclb', apply_captured => false); dbms_apply_adm.create_apply@orclb( queue_name => 'strmadmin.apply_queue_b', apply_name => 'apply_b', source_database=> 'orcla', apply_captured => false); end; /
          
          



  8. 追加のアプリケーションパラメータの設定( 詳細 ):



     sqlplus strmadmin@orcla begin --       dbms_apply_adm.set_parameter@orcla( apply_name => 'apply_a', parameter => 'disable_on_error', value => 'n'); dbms_apply_adm.set_parameter@orclb( apply_name => 'apply_b', parameter => 'disable_on_error', value => 'n'); --       dbms_apply_adm.set_parameter@orcla( apply_name => 'apply_a', parameter => 'compare_key_only', value => 'y'); dbms_apply_adm.set_parameter@orclb( apply_name => 'apply_b', parameter => 'compare_key_only', value => 'y'); end; /
          
          



  9. テーブルの変更の同期キャプチャ(同期キャプチャ)のプロセスの作成:



     sqlplus strmadmin@orcla SET SERVEROUTPUT ON DECLARE V_SN VARCHAR2(255); --      CURSOR GET_TABLES_CUR IS SELECT table_name FROM all_tables WHERE owner = '<   >' ORDER BY table_name; BEGIN DBMS_OUTPUT.ENABLE; --   V_SN := '<   >'; FOR V_GT IN GET_TABLES_CUR LOOP --        (Synchronous capture) dbms_streams_adm.add_table_rules@orcla( table_name => V_SN || '.' || V_GT.table_name, streams_type => 'sync_capture', streams_name => 'sca' || V_GT.table_name, queue_name => 'strmadmin.capture_queue_a', include_dml => true, include_ddl => false, source_database=> 'orcla'); dbms_streams_adm.add_table_rules@orclb( table_name => V_SN || '.' || V_GT.table_name, streams_type => 'sync_capture', streams_name => 'scb' || V_GT.table_name, queue_name => 'strmadmin.capture_queue_b', include_dml => true, include_ddl => false, source_database=> 'orclb'); END LOOP; COMMIT; END; /
          
          



  10. 伝播プロセス:



     sqlplus strmadmin@orcla SET SERVEROUTPUT ON DECLARE V_SN VARCHAR2(255); CURSOR GET_TABLES_CUR IS SELECT table_name FROM all_tables WHERE owner = '<   >' ORDER BY table_name; BEGIN DBMS_OUTPUT.ENABLE; --   V_SN := '<   >'; FOR V_GT IN GET_TABLES_CUR LOOP --    dbms_streams_adm.add_table_propagation_rules@orcla( table_name => V_SN || '.' || V_GT.table_name, streams_name => 'prop_a', source_queue_name => 'strmadmin.capture_queue_a', destination_queue_name => 'strmadmin.apply_queue_b@orclb', source_database => 'orcla', queue_to_queue => true); dbms_streams_adm.add_table_propagation_rules@orclb( table_name => V_SN || '.' || V_GT.table_name, streams_name => 'prop_b', source_queue_name => 'strmadmin.capture_queue_b', destination_queue_name => 'strmadmin.apply_queue_a@orcla', source_database => 'orclb', queue_to_queue => true); END LOOP; COMMIT; END; /
          
          



  11. 初期テーブル同期(必要な場合):



     --   drop table "repl_user"."<  >"@orclb cascade constraints; --       «b» create or replace directory b_dir as 'c:\oracle\app\oradata'; --  SCN   «a» select owner, directory_name, directory_path from all_directories; --     select dbms_flashback.get_system_change_number@orcla() from dual; impdp strmadmin/<>@orclb directory=b_dir network_link=orcla tables=<   >.< > flashback_scn=2025750
          
          



  12. ブレークポイントの設定(変更キャプチャレポートの開始に必要):



     sqlplus strmadmin@orcla SET SERVEROUTPUT ON DECLARE V_SN VARCHAR2(255); CURSOR GET_TABLES_CUR IS SELECT table_name FROM all_tables WHERE owner = '<   >' ORDER BY table_name; iscn_a number; iscn_b number; BEGIN DBMS_OUTPUT.ENABLE; --   V_SN := '<   >'; iscn_a := dbms_flashback.get_system_change_number@orcla(); iscn_b := dbms_flashback.get_system_change_number@orclb(); FOR V_GT IN GET_TABLES_CUR LOOP --  SCN   dbms_apply_adm.set_table_instantiation_scn@orcla( source_object_name => V_SN || '.' || V_GT.table_name, source_database_name => 'orclb', instantiation_scn => iscn_b); dbms_apply_adm.set_table_instantiation_scn@orclb( source_object_name => V_SN || '.' || V_GT.table_name, source_database_name => 'orcla', instantiation_scn => iscn_a); END LOOP; COMMIT; END; /
          
          



  13. アプリケーションと転送プロセスの起動:



     sqlplus strmadmin@orcla begin --    dbms_apply_adm.stop_apply@orcla( apply_name => 'apply_a'); dbms_propagation_adm.stop_propagation@orcla( propagation_name=> 'prop_a', force => false); dbms_apply_adm.stop_apply@orclb( apply_name => 'apply_b'); dbms_propagation_adm.stop_propagation@orclb( propagation_name=> 'prop_b', force => false); --    dbms_apply_adm.start_apply@orcla( apply_name => 'apply_a'); dbms_propagation_adm.start_propagation@orcla( propagation_name=> 'prop_a'); dbms_apply_adm.start_apply@orclb( apply_name => 'apply_b'); dbms_propagation_adm.start_propagation@orclb( propagation_name=> 'prop_b'); end; /
          
          



  14. セットアップが完了しました。
  15. 例外の処理方法の説明は、「Streams ApplyエラーのトラブルシューティングORA-1403、ORA-26787またはORA-26786、競合解消(Doc ID 265201.1)」および「Streams競合解消(Doc ID 230049.1)」に記載されています。



All Articles