
RACの下にディスクシェルフがなく、リアルタイムのOracleデータベースの復元力を提供する必要がある場合はどうすればよいですか? Oracle Data Streams(Oracle Streams)をカスタマイズします!
データストリームについて多くのことが書かれています。 たとえば、 ここ 、 ここ 、 ここ ( 公式文書を含む)。 この記事では、Oracle Standard Edition OneおよびOracle Standard Edition 11gR2エディションで動作するREDOログを使用しない構成オプションについて説明します(Enterpriseライセンスを使用すると、Enterprise Managerコンソールで直接構成が簡単になります。 制限を参照してください)。
そのため、HRスキーマのすべてのテーブルでDML操作を自動的にインターセプトし、双方向でデータを同期するよう努めています。

- データベースシステムパラメータの設定:
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;
- 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) ) )
- 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;
- 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');
- データベースリンクの作成:
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;
- データベースへの変更を保存するために使用される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; /
- アプリケーションプロセスの作成(適用プロセス):
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; /
- 追加のアプリケーションパラメータの設定( 詳細 ):
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; /
- テーブルの変更の同期キャプチャ(同期キャプチャ)のプロセスの作成:
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; /
- 伝播プロセス:
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; /
- 初期テーブル同期(必要な場合):
-- 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
- ブレークポイントの設定(変更キャプチャレポートの開始に必要):
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; /
- アプリケーションと転送プロセスの起動:
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; /
- セットアップが完了しました。
- 例外の処理方法の説明は、「Streams ApplyエラーのトラブルシューティングORA-1403、ORA-26787またはORA-26786、競合解消(Doc ID 265201.1)」および「Streams競合解消(Doc ID 230049.1)」に記載されています。