ヘッダーをスキップ
Oracle Streamsレプリケーション管理者ガイド
11g リリース1(11.1)
E05776-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

19 簡単な単一ソース・レプリケーションの例

この章では、Oracle Streamsを使用して構成できる簡単な単一ソース・レプリケーション環境の例を説明します。

この章の内容は次のとおりです。

簡単な単一ソース・レプリケーションの例の概要

この章の例では、Oracle Streamsを使用して2つのデータベース間の1つの表でデータをレプリケートする方法を示します。取得プロセスによって、str1.net Oracle Databaseでhrスキーマ内のjobs表に対して行われたデータ操作言語(DML)変更およびデータ定義言語(DDL)変更が取得され、これらの変更が伝播によってstr2.net Oracle Databaseへ伝播されます。次に、適用プロセスによってこれらの変更がstr2.netデータベースで適用されます。この例では、hr.jobs表がstr2.netデータベースで読取り専用であることを想定しています。

図19-1に、この環境の概要を示します。

図19-1 単一ソース・データベースからのデータを共有する簡単な例

図19-1の説明が続きます。
図19-1「単一ソース・データベースからのデータを共有する簡単な例」の説明

前提条件

この章の例を開始する前に、前提条件となる次の作業を完了する必要があります。

キューおよびデータベース・リンクの作成

次の手順を実行して、2つのOracle Databaseを含むOracle Streamsレプリケーション環境にキューおよびデータベース・リンクを作成します。

  1. 出力およびスプール結果の表示

  2. str1.netでのANYDATAキューの作成

  3. str1.netでのデータベース・リンクの作成

  4. str2.netでのANYDATAキューの設定

  5. スプール結果のチェック


注意:

このマニュアルをオンラインで参照している場合、この注意の後にある「BEGINNING OF SCRIPT」の行から次の「END OF SCRIPT」の行までのテキストをテキスト・エディタにコピーし、テキストを編集してご使用の環境用のスクリプトを作成できます。環境内のすべてのデータベースに接続可能なコンピュータで、SQL*Plusを使用してスクリプトを実行します。

/************************* BEGINNING OF SCRIPT ******************************

手順1: 出力およびスプール結果の表示

SET ECHO ONを実行し、スクリプトのスプール・ファイルを指定します。このスクリプトの実行後に、スプール・ファイルにエラーがないかをチェックします。

*/

SET ECHO ON
SPOOL streams_setup_simple.out

/*

手順2: str1.netでのANYDATAキューの作成

変更を取得するデータベースにOracle Streams管理者として接続します。この例では、データベースstr1.netに接続します。

*/

CONNECT strmadmin@str1.net

/*

SET_UP_QUEUEプロシージャを実行して、str1.netstreams_queueというキューを作成します。このキューはANYDATAキューとして動作し、他のデータベースに伝播される取得された変更を保持します。

SET_UP_QUEUEプロシージャを実行すると、次のアクションが実行されます。

*/

EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE();

/*

手順3: str1.netでのデータベース・リンクの作成

変更が取得されるデータベースから変更が伝播されるデータベースへのデータベース・リンクを作成します。この例では、変更が取得されるデータベースはstr1.netです。これらの変更は、str2.netに伝播されます。

*/

ACCEPT password PROMPT 'Enter password for user: ' HIDE

CREATE DATABASE LINK str2.net CONNECT TO strmadmin IDENTIFIED BY &password
   USING 'str2.net';

/*

手順4: str2.netでのANYDATAキューの設定

Oracle Streams管理者としてstr2.netに接続します。

*/

CONNECT strmadmin@str2.net

/*

SET_UP_QUEUEプロシージャを実行して、str2.netstreams_queueというキューを作成します。このキューはANYDATAキューとして動作し、このデータベースに適用される変更を保持します。

SET_UP_QUEUEプロシージャを実行すると、次のアクションが実行されます。

*/

EXEC  DBMS_STREAMS_ADM.SET_UP_QUEUE();

/*

手順5: スプール結果のチェック

streams_setup_simple.outスプール・ファイルをチェックして、このスクリプトの完了後にすべてのアクションが正常に終了していることを確認します。

*/

SET ECHO OFF
SPOOL OFF

/*************************** END OF SCRIPT ******************************/

1つの表に対する変更の取得、伝播および適用の構成

次の手順を実行して、DBMS_STREAMS_ADMパッケージを使用したhr.jobs表の取得、伝播および適用の定義を指定します。

  1. 出力およびスプール結果の表示

  2. str1.netでの伝播の構成

  3. str1.netでの取得プロセスの構成

  4. str2.netでのhr.jobs表に対するインスタンス化SCNの設定

  5. str2.netでの適用プロセスの構成

  6. str2.netでの適用プロセスの起動

  7. str1.netでの取得プロセスの起動

  8. スプール結果のチェック


注意:

このマニュアルをオンラインで参照している場合、この注意の後にある「BEGINNING OF SCRIPT」の行から次の「END OF SCRIPT」の行までのテキストをテキスト・エディタにコピーし、テキストを編集してご使用の環境用のスクリプトを作成できます。環境内のすべてのデータベースに接続可能なコンピュータで、SQL*Plusを使用してスクリプトを実行します。

/************************* BEGINNING OF SCRIPT ******************************

手順1: 出力およびスプール結果の表示

SET ECHO ONを実行し、スクリプトのスプール・ファイルを指定します。このスクリプトの実行後に、スプール・ファイルにエラーがないかをチェックします。

*/

SET ECHO ON
SPOOL streams_share_jobs.out

/*

手順2: str1.netでの伝播の構成

strmadminユーザーとしてstr1.netに接続します。

*/

CONNECT strmadmin@str1.net

/*

str1.netのキューからstr2.netのキューへのhr.jobs表に対するDML変更およびDDL変更の伝播を構成およびスケジュールします。

*/

BEGIN
  DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(
    table_name              => 'hr.jobs',
    streams_name            => 'str1_to_str2',
    source_queue_name       => 'strmadmin.streams_queue',
    destination_queue_name  => 'strmadmin.streams_queue@str2.net',
    include_dml             => TRUE,
    include_ddl             => TRUE,
    source_database         => 'str1.net',
    inclusion_rule          => TRUE,
    queue_to_queue          => TRUE);
END;
/

/*

手順3: str1.netでの取得プロセスの構成

str1.nethr.jobs表に対する変更を取得するように取得プロセスを構成します。この手順では、この表に対する変更が取得プロセスによって取得され、指定したキューにエンキューされるように指定します。

また、この手順では、hr.jobs表をインスタンス化のために準備し、この表のすべての主キー列、一意キー列、ビットマップ索引列および外部キー列のサプリメンタル・ロギングを有効にします。サプリメンタル・ロギングによって、表に対する変更の追加の情報がREDOログに記録されます。適用プロセスでは、一意の行の識別や競合解消など、一部の操作を実行するために、この追加情報が必要です。この環境では、str1.netでのみ変更が取得されるため、hr.jobs表に対してサプリメンタル・ロギングを有効化する必要があるのはこのデータベースのみです。

*/

BEGIN
  DBMS_STREAMS_ADM.ADD_TABLE_RULES(
    table_name     => 'hr.jobs',
    streams_type   => 'capture',
    streams_name   => 'capture_simp',
    queue_name     => 'strmadmin.streams_queue',
    include_dml    => TRUE,
    include_ddl    => TRUE,
    inclusion_rule => TRUE);
END;
/

/*

手順4: str2.netでのhr.jobs表に対するインスタンス化SCNの設定

この例では、hr.jobs表がstr1.netデータベースとstr2.netデータベースの両方に存在し、この表がこれらのデータベースで同期化されると想定しています。hr.jobs表はstr2.netにすでに存在するため、この例ではstr1.netDBMS_FLASHBACKパッケージのGET_SYSTEM_CHANGE_NUMBERファンクションを使用して、ソース・データベースの現行のSCNを取得します。このSCNは、str2.netDBMS_APPLY_ADMパッケージのSET_TABLE_INSTANTIATION_SCNプロシージャを実行するために使用されます。このプロシージャを実行して、str2.nethr.jobs表にインスタンス化SCNを設定します。

SET_TABLE_INSTANTIATION_SCNプロシージャを使用すると、適用プロセスで無視される表のLCRと、適用プロセスで適用される表のLCRを制御できます。ソース・データベースからの表に関するLCRのコミットSCNが、接続先データベースでその表のインスタンス化SCN以下であれば、接続先データベースの適用プロセスではLCRが廃棄されます。それ以外の場合は、適用プロセスによってLCRが適用されます。

この例では、str2.netの適用プロセスは、この手順で取得したSCNの後にコミットされたSCNを持つhr.jobs表にトランザクションを適用します。


注意:

この例では、str1.netstr2.nethr.jobs表の内容は、この手順の実行時に一貫性があると想定しています。インスタンス化SCNの設定中に、この表でのアクティビティがないことを確認します。一貫性を確保するために、この手順の実行中に各データベースの表をロックすることをお薦めします。接続先データベースに表が存在しない場合は、エクスポート/インポートを使用してインスタンス化できます。

*/

DECLARE
  iscn  NUMBER;         -- Variable to hold instantiation SCN value
BEGIN
  iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
  DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@STR2.NET(
    source_object_name    => 'hr.jobs',
    source_database_name  => 'str1.net',
    instantiation_scn     => iscn);
END;
/

/*

手順5: str2.netでの適用プロセスの構成

strmadminユーザーとしてstr2.netに接続します。

*/

CONNECT strmadmin@str2.net

/*

hr.jobs表に変更を適用するようにstr2.netを構成します。

*/

BEGIN
  DBMS_STREAMS_ADM.ADD_TABLE_RULES(
    table_name      => 'hr.jobs',
    streams_type    => 'apply',
    streams_name    => 'apply_simp',
    queue_name      => 'strmadmin.streams_queue',
    include_dml     => TRUE,
    include_ddl     => TRUE,
    source_database => 'str1.net',
    inclusion_rule  => TRUE);
END;
/

/*

手順6: str2.netでの適用プロセスの起動

エラーが発生した場合に適用プロセスが無効化されないように、disable_on_errorパラメータをnに設定して、str2.netで適用プロセスを起動します。

*/

BEGIN
  DBMS_APPLY_ADM.SET_PARAMETER(
    apply_name  => 'apply_simp',
    parameter   => 'disable_on_error',
    value       => 'N');
END;
/

BEGIN
  DBMS_APPLY_ADM.START_APPLY(
    apply_name  => 'apply_simp');
END;
/

/*

手順7: str1.netでの取得プロセスの起動

strmadminユーザーとしてstr1.netに接続します。

*/

CONNECT strmadmin@str1.net

/*

str1.netで取得プロセスを起動します。

*/

BEGIN
  DBMS_CAPTURE_ADM.START_CAPTURE(
    capture_name  => 'capture_simp');
END;
/

/*

手順8: スプール結果のチェック

streams_share_jobs.outスプール・ファイルをチェックして、このスクリプトの完了後にすべてのアクションが正常に終了していることを確認します。

*/

SET ECHO OFF
SPOOL OFF

/*************************** END OF SCRIPT ******************************/

hr.jobs表に対する変更および結果の表示

次の手順を実行して、str1.nethr.jobs表にDML変更およびDDL変更を行い、str1.netでそれらの変更が取得され、str1.netからstr2.netに伝播され、str2.nethr.jobs表に適用されることを確認します。


手順1: str1.netのhr.jobsの変更

hr.jobs表に次の変更を行います。

CONNECT hr@str1.net
Enter password: password

UPDATE hr.jobs SET max_salary=9545 WHERE job_id='PR_REP';
COMMIT;

ALTER TABLE hr.jobs ADD(duties VARCHAR2(4000));

手順2: str2.netでのhr.jobs表の問合せおよび定義の表示

前述の手順で行った変更が取得、伝播および適用されるまで待ってから、次の問合せを実行して、UPDATE変更が伝播されstr2.netで適用されていることを確認します。

CONNECT hr@str2.net
Enter password: password

SELECT * FROM hr.jobs WHERE job_id='PR_REP';

max_salary列の値が9545であるはずです。

次に、hr.jobs表の定義を表示して、ALTER TABLE変更が伝播されstr2.netで適用されていることを確認します。

DESC hr.jobs

duties列が最終列であるはずです。