ヘッダーをスキップ
Oracle® Streams概要および管理
11gリリース2 (11.2)
B61351-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

15 Oracle Streams暗黙的取得の管理

取得プロセス同期取得は両方とも暗黙的取得を実行します。この章では、暗黙的取得の管理の手順を説明します。

次の各項では、Oracle Streams暗黙的取得の管理について説明します。

この章で説明する各タスクは、特に明記されていないかぎり、適切な権限を付与されているOracle Streams管理者が完了する必要があります。


関連項目:


取得プロセスの管理

取得プロセスは、REDOログの変更を取得して、取得した各変更を論理変更レコード(LCR)形式にフォーマットし、LCRをANYDATAキューにエンキューします。

次の各項では、取得プロセスの管理について説明します。


関連項目:

  • 「Oracle Streams取得プロセスによる暗黙的取得」

  • 取得プロセスの構成の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照

  • Enterprise Managerでの取得プロセスの管理の詳細は、Oracle Database 2日でデータ・レプリケーションおよび統合ガイドおよびEnterprise Managerのオンライン・ヘルプを参照


取得プロセスの起動

既存の取得プロセスを起動するには、DBMS_CAPTURE_ADMパッケージのSTART_CAPTUREプロシージャを実行します。たとえば、次のプロシージャでは取得プロセスstrm01_captureが起動されます。

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

注意:

新しい取得プロセスで新しいLogMinerデータ・ディクショナリが使用される場合は、新しい取得プロセスを初めて起動するときに、新しいLogMinerデータ・ディクショナリの移入に時間がかかる場合があります。新しいLogMinerデータ・ディクショナリは、取得プロセスの作成時にNULL以外の先頭SCN値を指定した場合に作成されます。


関連項目:

Oracle Enterprise Managerを使用した取得プロセスの起動については、Oracle Database 2日でデータ・レプリケーションおよび統合ガイドを参照

取得プロセスの停止

既存の取得プロセスを停止するには、DBMS_CAPTURE_ADMパッケージのSTOP_CAPTUREプロシージャを実行します。たとえば、次のプロシージャでは取得プロセスstrm01_captureが停止されます。

BEGIN
  DBMS_CAPTURE_ADM.STOP_CAPTURE(
    capture_name => 'strm01_capture');
END;
/

関連項目:

Oracle Enterprise Managerを使用した取得プロセスの停止方法については、Oracle Database 2日でデータ・レプリケーションおよび統合ガイドを参照

取得プロセスのルール・セットの管理

この項では、次のタスクの実行手順を説明します。

取得プロセスのルール・セットの指定

取得プロセスには、1つのポジティブ・ルール・セットおよび1つのネガティブ・ルール・セットを指定できます。ポジティブ・ルール・セットの1つ以上のルールTRUEと評価され、ネガティブ・ルール・セットのすべてのルールがFALSEと評価された場合、取得プロセスによって変更が取得されます。ネガティブ・ルール・セットは、ポジティブ・ルール・セットの前に評価されます。

取得プロセスのポジティブ・ルール・セットの指定

既存のルール・セットをポジティブ・ルール・セットとして既存の取得プロセスに指定するには、ALTER_CAPTUREプロシージャのrule_set_nameパラメータを使用します。このプロシージャは、DBMS_CAPTURE_ADMパッケージに含まれています。

たとえば、次のプロシージャでは、取得プロセスstrm01_captureのポジティブ・ルール・セットがstrm02_rule_setに設定されます。

BEGIN
  DBMS_CAPTURE_ADM.ALTER_CAPTURE(
    capture_name  => 'strm01_capture',
    rule_set_name => 'strmadmin.strm02_rule_set');
END;
/
取得プロセスのネガティブ・ルール・セットの指定

既存のルール・セットをネガティブ・ルール・セットとして既存の取得プロセスに指定するには、ALTER_CAPTUREプロシージャのnegative_rule_set_nameパラメータを使用します。このプロシージャは、DBMS_CAPTURE_ADMパッケージに含まれています。

たとえば、次のプロシージャでは、取得プロセスstrm01_captureのネガティブ・ルール・セットがstrm03_rule_setに設定されます。

BEGIN
  DBMS_CAPTURE_ADM.ALTER_CAPTURE(
    capture_name           => 'strm01_capture',
    negative_rule_set_name => 'strmadmin.strm03_rule_set');
END;
/

取得プロセスのルール・セットへのルールの追加

既存の取得プロセスルール・セットルールを追加するには、DBMS_STREAMS_ADMパッケージの次のいずれかのプロシージャを実行して既存の取得プロセスを指定します。

  • ADD_TABLE_RULES

  • ADD_SUBSET_RULES

  • ADD_SCHEMA_RULES

  • ADD_GLOBAL_RULES

ADD_SUBSET_RULESプロシージャ以外のこれらのプロシージャでは、取得プロセスのポジティブ・ルール・セットまたはネガティブ・ルール・セットにルールを追加できます。ADD_SUBSET_RULESプロシージャでは、取得プロセスのポジティブ・ルール・セットのみにルールを追加できます。

取得プロセスのポジティブ・ルール・セットへのルールの追加

次の例では、DBMS_STREAMS_ADMパッケージのADD_TABLE_RULESプロシージャを実行して、取得プロセスstrm01_captureのポジティブ・ルール・セットにルールを追加します。

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

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

  • 2つのルールが作成されます。一方のルールはhr.departments表に対するDML変更についてTRUEと評価され、他方のルールはhr.departments表に対するDDL変更についてTRUEと評価されます。ルール名は、システムによって生成されます。

  • inclusion_ruleパラメータがTRUEに設定されているため、これらの2つのルールは、取得プロセスに関連付けられたポジティブ・ルール・セットに追加されます。

  • DBMS_CAPTURE_ADMパッケージのPREPARE_TABLE_INSTANTIATIONプロシージャを実行することで、インスタンス化用にhr.departments表が準備されます。

  • hr.departments表の主キー、一意キー、ビットマップ索引および外部キー列のサプリメンタル・ロギングが有効になります。PREPARE_TABLE_INSTANTIATIONプロシージャの実行時に、supplemental_loggingパラメータにデフォルト値(keys)が指定されます。

取得プロセスによってダウンストリーム取得が実行される場合、そのダウンストリーム取得プロセスソース・データベースへのデータベース・リンクが使用される場合にのみ、表がインスタンス化のために準備され、キー列のサプリメンタル・ロギングが有効になります。ダウンストリーム取得プロセスでソース・データベースへのデータベース・リンクが使用されない場合、インスタンス化のために表を手動で準備し、手動でサプリメンタル・ロギングを有効にする必要があります。

取得プロセスのネガティブ・ルール・セットへのルールの追加

次の例では、DBMS_STREAMS_ADMパッケージのADD_TABLE_RULESプロシージャを実行して、取得プロセスstrm01_captureネガティブ・ルール・セットにルールを追加します。

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

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

  • 2つのルールが作成されます。一方のルールはhr.job_history表に対するDML変更についてTRUEと評価され、他方のルールはhr.job_history表に対するDDL変更についてTRUEと評価されます。ルール名は、システムによって生成されます。

  • inclusion_ruleパラメータがFALSEに設定されているため、これらの2つのルールは、取得プロセスに関連付けられたネガティブ・ルール・セットに追加されます。

取得プロセスのルール・セットからのルールの削除

取得プロセスでルールに指定された変更を取得しない場合には、取得プロセスのルール・セットからルールを削除します。たとえば、ルールdepartments3hr.departments表へのDML変更が取得されるように指定するとします。取得プロセスでhr.departments表への変更を取得しない場合は、ルール・セットからルールdepartments3を削除します。

DBMS_STREAMS_ADMパッケージのREMOVE_RULEプロシージャを実行して、既存の取得プロセスルール・セットからルールを削除します。たとえば、次のプロシージャでは、取得プロセスstrm01_captureポジティブ・ルール・セットからルールdepartments3が削除されます。

BEGIN
  DBMS_STREAMS_ADM.REMOVE_RULE(
    rule_name        => 'departments3',
    streams_type     => 'capture',
    streams_name     => 'strm01_capture',
    drop_unused_rule => TRUE,
    inclusion_rule   => TRUE);
END;
/

この例では、REMOVE_RULEプロシージャのdrop_unused_ruleパラメータがTRUEに設定されています。これはデフォルトの設定です。したがって、削除するルールが他のどのルール・セットにも含まれていなければ、そのルールはデータベースから削除されます。drop_unused_ruleパラメータがFALSEに設定されている場合、ルールはルール・セットから削除されますが、データベースからは削除されません。

inclusion_ruleパラメータがFALSEに設定されている場合、REMOVE_RULEプロシージャによって、取得プロセスのポジティブ・ルール・セットではなく、ネガティブ・ルール・セットからルールが削除されます。

取得プロセスのルール・セットからすべてのルールを削除するには、REMOVE_RULEプロシージャの実行時にrule_nameパラメータにNULLを指定します。

取得プロセスのルール・セットの削除

既存の取得プロセスからルール・セットを削除するには、DBMS_CAPTURE_ADMパッケージのALTER_CAPTUREプロシージャを使用します。このプロシージャでは、ポジティブ・ルール・セットまたはネガティブ・ルール・セット、あるいはその両方を削除できます。取得プロセスのポジティブ・ルール・セットを削除するには、remove_rule_setパラメータにTRUEを指定します。取得プロセスのネガティブ・ルール・セットを削除するには、remove_negative_rule_setパラメータにTRUEを指定します。

たとえば、次のプロシージャでは、取得プロセスstrm01_captureからポジティブ・ルール・セットとネガティブ・ルール・セットの両方が削除されます。

BEGIN
  DBMS_CAPTURE_ADM.ALTER_CAPTURE(
    capture_name             => 'strm01_capture',
    remove_rule_set          => TRUE,
    remove_negative_rule_set => TRUE);
END;
/

注意:

取得プロセスにポジティブ・ルール・セットまたはネガティブ・ルール・セットが存在しない場合、その取得プロセスでは、SYSスキーマ、SYSTEMスキーマおよびCTXSYSスキーマ内のデータベース・オブジェクトを除き、データベース内のすべてのオブジェクトに対するすべてのサポートされる変更が取得されます。

取得プロセスのパラメータの設定

取得プロセスのパラメータを設定するには、DBMS_CAPTURE_ADMパッケージのSET_PARAMETERプロシージャを使用します。取得プロセス・パラメータによって、取得プロセスの動作が制御されます。

たとえば、次のプロシージャでは、取得プロセスstrm01_captureparallelismパラメータが4に設定されます。

BEGIN
  DBMS_CAPTURE_ADM.SET_PARAMETER(
    capture_name => 'strm01_capture',
    parameter    => 'parallelism',
    value        => '4');
END;
/

注意:

  • parallelismパラメータを設定すると、取得プロセスが自動的に停止され、再起動されます。

  • valueパラメータは、パラメータ値が数値の場合にも、常にVARCHAR2値として入力されます。

  • valueパラメータがNULLに設定されているか、または指定されていない場合、パラメータはデフォルト値に設定されます。



関連項目:

  • Oracle Enterprise Managerを使用した取得プロセス・パラメータの設定については、Oracle Database 2日でデータ・レプリケーションおよび統合ガイドを参照

  • 「取得プロセスのサブコンポーネント」

  • 取得プロセス・パラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』DBMS_CAPTURE_ADM.SET_PARAMETERプロシージャに関する項を参照


取得プロセスの取得ユーザーの設定

取得ユーザーは、取得プロセスルール・セットを満たすすべてのDML変更およびDDL変更を取得するユーザーです。取得プロセスの取得ユーザーを設定するには、DBMS_CAPTURE_ADMパッケージのALTER_CAPTUREプロシージャでcapture_userパラメータを使用します。

取得ユーザーを変更するには、ALTER_CAPTUREプロシージャを起動するユーザーにDBAロールが付与されている必要があります。SYSユーザーのみが、capture_userSYSに設定できます。

たとえば、次のプロシージャでは、取得プロセスstrm01_captureの取得ユーザーがhrに設定されます。

BEGIN
  DBMS_CAPTURE_ADM.ALTER_CAPTURE(
    capture_name => 'strm01_capture',
    capture_user => 'hr');
END;
/

このプロシージャを実行すると、新しい取得ユーザーに、取得プロセスで使用するキューのエンキュー権限が付与され、そのユーザーがキュー保護キュー・ユーザーとして構成されます。また、取得ユーザーが次の権限を持っていることを確認する必要があります。

これらの権限は、取得ユーザーに直接付与するか、ロールを介して付与できます。

また、取得ユーザーには、取得プロセスで実行されるルールベースの変換で起動されるすべてのパッケージ(Oracle提供パッケージを含む)に対するEXECUTE権限を付与する必要があります。これらの権限は、取得ユーザーに直接付与する必要があります。これらの権限は、ロールを介して付与することはできません。


注意:

Oracle Database Vaultがインストールされている場合は、「Oracle StreamsおよびOracle Data Vault」に記載されている手順に従って、適切な権限やロールが付与されていることを確認してください。

取得プロセスのチェックポイント保存時間の管理

チェックポイント保存時間は、チェックポイント取得プロセスによって自動的にパージされるまでの保存期間です。

DBMS_CAPTURE_ADMパッケージのALTER_CAPTUREプロシージャのcheckpoint_retention_timeパラメータを使用して、取得プロセスのチェックポイント保存時間を設定します。

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

新しい値の取得プロセスのチェックポイント保存時間の設定

チェックポイント保存時間を設定する場合、小数値を使用して日数と時間を指定できます。たとえば、取得プロセスstrm01_captureによってチェックポイントが10日と12時間ごとに自動的に消去されるように指定するには、次のプロシージャを実行します。

BEGIN
  DBMS_CAPTURE_ADM.ALTER_CAPTURE(
    capture_name              => 'strm01_capture',
    checkpoint_retention_time => 10.5);
END;
/

無期限の取得プロセスのチェックポイント保存時間の設定

取得プロセスによってチェックポイントが自動的に消去されないように指定するには、チェックポイント保存時間をDBMS_CAPTURE_ADM.INFINITEに設定します。たとえば、次のプロシージャでは、取得プロセスstrm01_captureのチェックポイント保存時間が無期限に設定されます。

BEGIN
  DBMS_CAPTURE_ADM.ALTER_CAPTURE(
    capture_name              => 'strm01_capture',
    checkpoint_retention_time => DBMS_CAPTURE_ADM.INFINITE);
END;
/

取得プロセスへのアーカイブREDOログ・ファイルの明示的な追加

取得プロセスにアーカイブREDOログ・ファイルを手動で追加するには、次の文を使用します。

ALTER DATABASE REGISTER LOGICAL LOGFILE 
   file_name FOR capture_process;

ここでは、file_nameは追加するアーカイブREDOログ・ファイルの名前で、capture_processダウンストリーム・データベースのREDOログ・ファイルを使用する取得プロセスの名前です。capture_processは、logminer_session_nameと同じで、指定する必要があります。取得プロセスが実行されるサイトには、REDOログ・ファイルが存在する必要があります。

たとえば、取得プロセスstrm03_capture/usr/log_files/1_3_486574859.dbfアーカイブREDOログ・ファイルを追加するには、次の文を発行します。

ALTER DATABASE REGISTER LOGICAL LOGFILE '/usr/log_files/1_3_486574859.dbf' 
  FOR 'strm03_capture';

関連項目:

ALTER DATABASE文の詳細は、『Oracle Database SQL言語リファレンス』を参照、またREDOログ・ファイルの登録については、『Oracle Data Guard概要および管理』を参照

既存の取得プロセスの先頭SCNの設定

既存の取得プロセス先頭SCNを設定できます。

指定する先頭SCNは、次の要件を満たす必要があります。

  • 取得プロセスの現在の先頭SCNより大きい値である必要があります。

  • 取得プロセスの現行の適用済SCN以下であること。ただし、取得プロセスの現行の適用済SCNが0(ゼロ)である場合、この要件はあてはまりません。

  • 取得プロセスの必須チェックポイントSCN以下の値である必要があります。

データベース内の各取得プロセスの現行の先頭SCN、適用済SCNおよび必須チェックポイントSCNを特定するには、次の問合せを使用します。

SELECT CAPTURE_NAME, FIRST_SCN, APPLIED_SCN, REQUIRED_CHECKPOINT_SCN
   FROM DBA_CAPTURE;

取得プロセスの先頭SCNをリセットすると、新しい先頭SCN設定よりも値が小さい情報が、取得プロセスのLogMinerデータ・ディクショナリから自動的に消去されます。このため、取得プロセスの先頭SCNのリセット後は、その取得プロセスの開始SCNを新しい先頭SCNより小さい値に設定することはできません。また、新しい先頭SCNの設定前の情報を含むREDOログ・ファイルは、取得プロセスでは必要なくなります。

たとえば、次のプロシージャでは、DBMS_CAPTURE_ADMパッケージのALTER_CAPTUREプロシージャを使用して、取得プロセスstrm01_captureの先頭SCNが351232に設定されます。

BEGIN
  DBMS_CAPTURE_ADM.ALTER_CAPTURE(
    capture_name => 'strm01_capture',
    first_scn    => 351232);
END;
/

注意:

  • 指定した先頭SCNが取得プロセスの現行の開始SCNより大きい場合、開始SCNは、新しい先頭SCNの値に自動的に設定されます。

  • 過去のある時点でのREDOログ内の変更を取得する必要がある場合、取得プロセスを作成し、REDOログでの以前のデータ・ディクショナリ・ビルドに対応する先頭SCNを指定できます。DBMS_CAPTURE_ADMパッケージのBUILDプロシージャによって、REDOログでデータ・ディクショナリ・ビルドが実行されます。

  • DBA_LOGMNR_PURGED_LOGデータ・ディクショナリ・ビューを問い合せて、取得プロセスに不要なREDOログ・ファイルを特定できます。


既存の取得プロセスの開始SCNの設定

既存の取得プロセス開始SCNを設定できます。通常、取得プロセスから変更を受け取る宛先データベースのいずれかでPoint-in-Timeリカバリを実行する必要がある場合、取得プロセスの開始SCNをリセットします。

指定した開始SCNは、取得プロセスの先頭SCNよりも大きいか等しいことが必要です。また、取得プロセスの開始SCNをリセットするときは、必要なREDOログ・ファイルが取得プロセスで使用できることを確認してください。

データベース内の各取得プロセスの先頭SCNを判別するには、次の問合せを使用します。

SELECT CAPTURE_NAME, FIRST_SCN FROM DBA_CAPTURE;

たとえば、取得プロセスstrm01_captureの開始SCNを750338に設定するには、次の手順を実行します。

  1. 取得プロセスを停止します。方法については、「取得プロセスの停止」を参照してください。

  2. ALTER_CAPTUREプロシージャを実行して、開始SCNを設定します。

    BEGIN
      DBMS_CAPTURE_ADM.ALTER_CAPTURE(
        capture_name => 'strm01_capture',
        start_scn    => 750338);
    END;
    /
    
  3. 取得プロセスを起動します。方法については、「取得プロセスの起動」を参照してください。


関連項目:

  • 「取得プロセスに関連するSCN値」

  • Oracle Streams環境において、宛先データベースでPoint-in-Timeリカバリを実行する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照


ダウンストリーム取得でデータベース・リンクを使用するかどうかの指定

既存のダウンストリーム取得プロセスで、ソース・データベースへの管理用のデータベース・リンクを使用するかどうかを指定するには、DBMS_CAPTURE_ADMパッケージのALTER_CAPTUREプロシージャを使用します。ダウンストリーム取得プロセスでデータベース・リンクを使用するように指定するには、use_database_linkパラメータをTRUEに設定します。ダウンストリーム取得プロセスでデータベース・リンクを使用しないように指定するには、use_database_linkパラメータをFALSEに設定します。

現在データベース・リンクを使用していない取得プロセスでデータベース・リンクを使用するようにするには、use_database_linkパラメータをTRUEに設定します。この場合、ソース・データベースのグローバル名と同じ名前を持つデータベース・リンクが、ダウンストリーム・データベースに存在する必要があります。

現在データベース・リンクを使用している取得プロセスでデータベース・リンクを使用しないようにするには、use_database_linkパラメータをFALSEに設定します。この場合、取得プロセスの変更後に、いくつかの管理操作を手動で行う必要があります。たとえば、DBMS_STREAMS_ADMパッケージを使用して新しい取得プロセスのルールを追加する場合、ソース・データベースで、そのルールに関連付けられたオブジェクトのインスタンス化の準備を手動で行う必要があります。

use_database_linkパラメータをNULLに設定した場合、取得プロセスに対するこのパラメータの現行の値は変更されません。

ソース・データベースdbs1.example.comへのデータベース・リンクを作成し、この取得プロセスがデータベース・リンクを使用するように指定するには、次の手順を実行します。

  1. SQL*Plusで、ダウンストリーム・データベースにOracle Streams管理者として接続します。

    SQL*Plusでデータベースに接続する方法については、『Oracle Database管理者ガイド』を参照してください。

  2. ソース・データベースへのデータベース・リンクを作成します。データベース・リンクが、ソース・データベースのOracle Streams管理者に接続することを確認してください。次に例を示します。

    CREATE DATABASE LINK dbs1.example.com CONNECT TO strmadmin 
       IDENTIFIED BY password 
       USING 'dbs1.example.com';
    
  3. データベース・リンクを使用するように取得プロセスを変更します。次に例を示します。

    BEGIN
      DBMS_CAPTURE_ADM.ALTER_CAPTURE(
        capture_name       => 'strm05_capture',
        use_database_link  => TRUE);
    END;
    /
    

取得プロセスの削除

既存の取得プロセスを削除するには、DBMS_CAPTURE_ADMパッケージのDROP_CAPTUREプロシージャを実行します。たとえば、次のプロシージャでは、取得プロセスstrm02_captureが削除されます。

BEGIN
  DBMS_CAPTURE_ADM.DROP_CAPTURE(
    capture_name          => 'strm02_capture',
    drop_unused_rule_sets => TRUE);
END;
/

drop_unused_rule_setsパラメータがTRUEに設定されているため、このプロシージャでは、取得プロセスstrm02_captureで使用されているすべてのルール・セットも削除されます。ただし、他のOracle Streamsクライアントで使用されているルール・セットは削除されません。drop_unused_rule_setsパラメータがTRUEに設定されている場合は、取得プロセスのポジティブ・ルール・セットネガティブ・ルール・セットの両方が削除されることがあります。このプロシージャによってルール・セットが削除された場合、そのルール・セット内のルールのうち、他のルール・セットに含まれていないルールも削除されます。


注意:

取得プロセスを削除するには、状態がDISABLEDまたはABORTEDであることが必要です。ENABLEDの取得プロセスは削除できません。

同期取得の管理

同期取得では内部メカニズムを使用して、表へのデータ操作言語(DML)の変更を取得します。同期取得は、取得した各変更を論理変更レコード(LCR)形式に再フォーマットし、LCRをANYDATAキューにエンキューします。

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


関連項目:

  • 「同期取得による暗黙的取得」

  • 同期取得の構成の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照

  • 「同期取得の監視」

  • 同期取得を使用するレプリケーション環境の構成例については、Oracle Database 2日でデータ・レプリケーションおよび統合ガイドを参照


同期取得のルール・セットの管理

この項では、次のタスクの実行手順を説明します。

同期取得のルール・セットの指定

同期取得には、1つのポジティブ・ルール・セットを指定できます。ポジティブ・ルール・セットの1つ以上のルールTRUEと評価された場合、同期取得によって変更が取得されます。

既存のルール・セットをポジティブ・ルール・セットとして既存の同期取得に指定するには、ALTER_SYNC_CAPTUREプロシージャのrule_set_nameパラメータを使用します。このプロシージャは、DBMS_CAPTURE_ADMパッケージに含まれています。

たとえば、次のプロシージャでは、同期取得sync_captureのポジティブ・ルール・セットがsync_rule_setに設定されます。

BEGIN
  DBMS_CAPTURE_ADM.ALTER_SYNC_CAPTURE(
    capture_name  => 'sync_capture',
    rule_set_name => 'strmadmin.sync_rule_set');
END;
/

注意:

同期取得のルール・セットは削除できません。

同期取得のルール・セットへのルールの追加

既存の同期取得ルール・セットルールを追加するには、DBMS_STREAMS_ADMパッケージの次のいずれかのプロシージャを実行して既存の同期取得を指定できます。

  • ADD_TABLE_RULES

  • ADD_SUBSET_RULES

次の例では、DBMS_STREAMS_ADMパッケージのADD_TABLE_RULESプロシージャを実行して、同期取得sync_captureのポジティブ・ルール・セットにルールを追加します。

BEGIN
  DBMS_STREAMS_ADM.ADD_TABLE_RULES(
    table_name      =>  'hr.departments',
    streams_type    =>  'sync_capture',
    streams_name    =>  'sync_capture',
    queue_name      =>  'strmadmin.streams_queue',
    include_dml     =>  TRUE);
END;
/

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

  • ルールが1つ作成されます。このルールは、hr.departments表に対するDML変更についてTRUEと評価されます。ルール名はシステムによって生成されます。

  • ルールは、同期取得に関連付けられたポジティブ・ルール・セットに追加されます。

  • DBMS_CAPTURE_ADMパッケージのPREPARE_SYNC_INSTANTIATIONファンクションが実行され、インスタンス化用にhr.departments表が準備されます。


注意:

  • ADD_TABLE_RULESプロシージャまたはADD_SUBSET_RULESプロシージャを使用して、表のルールが同期取得のルール・セットに追加された場合のみ、同期取得によって表への変更が取得されます。DBMS_RULE_ADMパッケージのADD_RULEプロシージャを使用して、表ルールまたはサブセット・ルールがルール・セットに追加されると、同期取得によって表への変更は取得されません。また、同期取得では、グローバル・ルールやスキーマ・ルールなど、ルール・セットの表ルール以外およびサブセット・ルール以外のすべてのルールは無視されます。

  • ADD_TABLE_RULESプロシージャまたはADD_SUBSET_RULESプロシージャでルールが同期取得のルール・セットに追加される場合、プロシージャは指定した表の排他ロックを取得する必要があります。指定した表に処理中のトランザクションがある場合、プロシージャはロックを取得できるまで待機します。


同期取得のルール・セットからのルールの削除

同期取得でルールに指定された変更を取得しない場合、同期取得のルール・セットからルールを削除します。たとえば、ルールdepartments3hr.departments表へのDML変更が取得されるように指定するとします。同期取得でhr.departments表への変更を取得しない場合は、ルール・セットからルールdepartments3を削除します。

DBMS_STREAMS_ADMパッケージのREMOVE_RULEプロシージャを実行して、既存の同期取得のルール・セットからルールを削除します。たとえば、次のプロシージャでは、同期取得sync_captureポジティブ・ルール・セットからルールdepartments3が削除されます。

BEGIN
  DBMS_STREAMS_ADM.REMOVE_RULE(
    rule_name        => 'departments3',
    streams_type     => 'sync_capture',
    streams_name     => 'sync_capture',
    drop_unused_rule => TRUE);
END;
/

この例では、REMOVE_RULEプロシージャのdrop_unused_ruleパラメータがTRUEに設定されています。これはデフォルトの設定です。したがって、削除するルールが他のどのルール・セットにも含まれていなければ、そのルールはデータベースから削除されます。drop_unused_ruleパラメータがFALSEに設定されている場合、ルールはルール・セットから削除されますが、データベースからは削除されません。

同期取得のルール・セットからすべてのルールを削除するには、REMOVE_RULEプロシージャの実行時にrule_nameパラメータにNULLを指定します。

同期取得の取得ユーザーの設定

取得ユーザーは、同期取得ルール・セットを満たすすべてのDML変更を取得するユーザーです。同期取得の取得ユーザーを設定するには、DBMS_CAPTURE_ADMパッケージのALTER_SYNC_CAPTUREプロシージャでcapture_userパラメータを使用します。

取得ユーザーを変更するには、ALTER_SYNC_CAPTUREプロシージャを起動するユーザーにDBAロールが付与されている必要があります。SYSユーザーのみが、capture_userSYSに設定できます。

たとえば、次のプロシージャでは、同期取得sync_captureの取得ユーザーがhrに設定されます。

BEGIN
  DBMS_CAPTURE_ADM.ALTER_SYNC_CAPTURE(
    capture_name => 'sync_capture',
    capture_user => 'hr');
END;
/

このプロシージャを実行すると、新しい取得ユーザーに、同期取得で使用するキューのエンキュー権限が付与され、そのユーザーがキュー保護キュー・ユーザーとして構成されます。また、取得ユーザーが次の権限を持っていることを確認する必要があります。

これらの権限は、取得ユーザーに直接付与するか、ロールを介して付与できます。

また、取得ユーザーには、同期取得で実行されるルールベースの変換で起動されるすべてのパッケージ(Oracle提供パッケージを含む)に対するEXECUTE権限を付与する必要があります。これらの権限は、取得ユーザーに直接付与する必要があります。これらの権限は、ロールを介して付与することはできません。


注意:

Oracle Database Vaultがインストールされている場合は、「Oracle StreamsおよびOracle Data Vault」に記載されている手順に従って、適切な権限やロールが付与されていることを確認してください。

同期取得の削除

既存の同期取得を削除するには、DBMS_CAPTURE_ADMパッケージのDROP_CAPTUREプロシージャを実行します。たとえば、次のプロシージャでは、同期取得sync_captureが削除されます。

BEGIN
  DBMS_CAPTURE_ADM.DROP_CAPTURE(
    capture_name          => 'sync_capture',
    drop_unused_rule_sets => TRUE);
END;
/

drop_unused_rule_setsパラメータがTRUEに設定されているため、このプロシージャでは、同期取得sync_captureで使用されているすべてのルール・セットも削除されます(ただし、他のOracle Streamsクライアントで使用されているルール・セットは削除されません)。drop_unused_rule_setsパラメータがTRUEに設定されている場合は、同期取得のルール・セットが削除されることがあります。このプロシージャによってルール・セットが削除された場合、そのルール・セット内のルールのうち、他のルール・セットに含まれていないルールも削除されます。

取得LCRの追加属性の管理

1つ以上の追加属性を取得するように取得プロセスまたは同期取得に指示するには、DBMS_CAPTURE_ADMパッケージのINCLUDE_EXTRA_ATTRIBUTEプロシージャを使用します。また、このプロシージャを使用して、現在取得している追加属性を排除するように取得プロセスまたは同期取得に指示することもできます。

追加属性は次のとおりです。

  • row_id(行LCRのみ)

  • serial#

  • session#

  • thread#

  • tx_name

  • username

この項では、次のタスクの実行手順を説明します。


関連項目:


暗黙的に取得されたLCRへの追加属性の包含

取得プロセスまたは同期取得で取得されたLCRに追加属性を含めるには、INCLUDE_EXTRA_ATTRIBUTESプロシージャを実行して、includeパラメータをTRUEに設定します。たとえば、取得された各LCRにトランザクション名を含めるように取得プロセスまたは同期取得strm01_captureに指示するには、次のプロシージャを実行します。

BEGIN
  DBMS_CAPTURE_ADM.INCLUDE_EXTRA_ATTRIBUTE(
    capture_name   => 'strm01_capture',
    attribute_name => 'tx_name',
    include        => TRUE);
END;
/

暗黙的に取得されたLCRからの追加属性の排除

取得プロセスまたは同期取得で取得されたLCRから追加属性を排除するには、INCLUDE_EXTRA_ATTRIBUTESプロシージャを実行して、includeパラメータをFALSEに設定します。たとえば、取得された各LCRからトランザクション名を排除するように取得プロセスまたは同期取得strm01_captureに指示するには、次のプロシージャを実行します。

BEGIN
  DBMS_CAPTURE_ADM.INCLUDE_EXTRA_ATTRIBUTE(
    capture_name   => 'strm01_capture',
    attribute_name => 'tx_name',
    include        => FALSE);
END;
/

取得プロセスから同期取得への切替え

この項では、取得プロセスから同期取得への切替え方法について説明します。通常、同期取得は、比較的少数の表へのデータ操作言語(DML)変更を取得するために使用されます。現在、同期取得ではなく取得プロセスを使用して少数の表への変更を取得している場合は、この切替えを決定できます。

次のいずれかの条件に該当する場合は、取得プロセスから同期取得への切替えは行わないでください。

  • 取得プロセスで、少数の表への変更を取得するのではなく、データベース全体、1つ以上のスキーマまたは多数の表への変更を取得している場合で、引き続きこれらの変更を取得する場合。

  • 取得プロセスでデータ定義言語(DDL)変更を取得している場合で、引き続きDDL変更を取得する場合。同期取得では、DDL変更は取得できません。

  • 取得プロセスでネガティブ・ルール・セットを使用しており、引き続きネガティブ・ルール・セットを使用する場合。同期取得では、ネガティブ・ルール・セットは使用できません。

  • 取得プロセスがダウンストリーム取得プロセスの場合。同期取得では、ダウンストリーム取得は実行できません。

この項では例を用いて、取得プロセスから同期取得への切替え方法について説明します。表15-1に、サンプル環境での切替え前後のOracle Streamsコンポーネントを示します。

表15-1 取得プロセスから同期取得への切替えの例

Oracle Streamsコンポーネント 切替え前 切替え後

取得プロセス

cap_proc

なし

取得プロセス・ルール・セット

cap_rules

なし

同期取得

なし

sync_cap

同期取得ルール・セット

なし

cap_rules

伝播

cap_proc_prop

sync_cap_prop

伝播ルール・セット

prop_rules

prop_rules

ソース・キュー

cap_proc_source

sync_cap_source

宛先キュー

cap_proc_dest

sync_cap_dest

適用プロセス

apply_cap_proc

apply_sync_cap

適用プロセス・ルール・セット

apply_rules

apply_rules


表15-1では、Oracle Streams環境で切替え前と切替え後に同じルール・セットが使用されていることに注意してください。また、この項の例では、ソース・データベースdb1.example.comで、宛先データベースdb2.example.comであるとします。


注意:

この項の例では、Oracle Streams環境に2つのデータベースのみを含むものとします。有向ネットワークを使用して複数のデータベース経由で変更を送信している場合は、変更の新しい同期取得ストリーム用に追加の伝播およびキューを構成し、取得プロセスのストリームによって使用されていた追加の伝播およびキューを削除することが必要になる場合もあります。

取得プロセスから同期取得に切り替えるには、次の手順を実行します。

  1. SQL*Plusで、ソース・データベースにOracle Streams管理者としてログインします。

    この例では、各データベースのOracle Streams管理者はstrmadminであると想定しています。Oracle Streams管理者を作成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  2. 取得プロセスを停止します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_CAPTURE_ADM.STOP_CAPTURE(
        capture_name => 'cap_proc');
    END;
    /
    
  3. SQL*Plusで、宛先データベースにOracle Streams管理者としてログインします。

  4. 同期取得で取得された変更を適用する適用プロセスにコミット時間キューを作成します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_STREAMS_ADM.SET_UP_QUEUE(
        queue_table => 'strmadmin.sync_cap_dest_qt',
        queue_name  => 'strmadmin.sync_cap_dest');
    END;
    /
    
  5. 手順4で作成したキューの変更を適用する適用プロセスを作成します。apply_capturedパラメータをFALSEに設定します。また、rule_set_nameパラメータで、既存の適用プロセスで使用されているルール・セットが指定されていることを確認します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_APPLY_ADM.CREATE_APPLY(
        queue_name     => 'strmadmin.sync_cap_dest',
        apply_name     => 'apply_sync_cap',
        rule_set_name  => 'strmadmin.apply_rules',
        apply_captured => FALSE);
    END;
    /
    

    適用プロセスが環境に適切に構成されていることを確認します。具体的には、新しい適用プロセスが、次の項目について適切に構成されていることを確認します。

    • 適用ユーザー

    • 適用ハンドラ

    • 適用タグ

    必要に応じて、新しい適用プロセスが、これらの項目について既存の適用プロセスと同じように構成されていることを確認します。

    適用プロセスを作成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  6. SQL*Plusで、ソース・データベースにOracle Streams管理者としてログインします。

  7. 同期取得のコミット時間キューを作成します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_STREAMS_ADM.SET_UP_QUEUE(
        queue_table => 'strmadmin.sync_cap_source_qt',
        queue_name  => 'strmadmin.sync_cap_source');
    END;
    /
    

    キューを構成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  8. 手順7で作成したキューの変更を手順4で作成したキューに送信する伝播を作成します。rule_set_nameパラメータで、既存の伝播で使用されているルール・セットが指定されていることを確認します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_PROPAGATION_ADM.CREATE_PROPAGATION(
        propagation_name   => 'sync_cap_prop',
        source_queue       => 'strmadmin.sync_cap_source',
        destination_queue  => 'strmadmin.sync_cap_dest',
        destination_dblink => 'db2.example.com',
        rule_set_name      => 'strmadmin.prop_rules');
    END;
    /
    

    伝播を作成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  9. 同期取得を作成します。queue_nameパラメータに、手順7で作成したキューが指定されていることを確認します。また、rule_set_nameパラメータに、既存の取得プロセスで使用されているルール・セットが指定されていることを確認します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_CAPTURE_ADM.CREATE_SYNC_CAPTURE(
        queue_name    => 'strmadmin.sync_cap_source',
        capture_name  => 'sync_cap',
        rule_set_name => 'strmadmin.capture_rules');
    END;
    /
    

    指定したルール・セットには、DBMS_STREAMS_ADMパッケージのADD_TABLE_RULESプロシージャおよびADD_SUBSET_RULESプロシージャを使用して作成されたルールのみが含まれている必要があります。現行の取得プロセス・ルール・セットに他のタイプのルールが含まれている場合は、同期取得用のルール・セットを作成し、ADD_TABLE_RULESプロシージャおよびADD_SUBSET_RULESプロシージャを使用して、新しいルール・セットにルールを追加します。

    また、同期取得ではネガティブ・ルール・セットを使用できません。現行の取得プロセスにネガティブ・ルール・セットがあり、同期取得に取得プロセスと同様の動作をさせる場合には、同期取得のポジティブ・ルール・セットにルールを追加すると、同じ動作結果が得られます。

    既存の取得プロセスの取得ユーザーがOracle Streams管理者でない場合、CREATE_SYNC_CAPTUREプロシージャのcapture_userパラメータを使用して、新しい同期取得に適切な取得ユーザーが指定されていることを確認します。

    同期取得を構成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  10. 次の問合せを実行して、同期取得用に構成された表が、既存の取得プロセス用に構成された表と同じであることを確認します。

    SELECT * FROM DBA_SYNC_CAPTURE_TABLES ORDER BY TABLE_OWNER, TABLE_NAME;
    

    表が無効であるか、存在していない場合は、ADD_TABLE_RULESプロシージャまたはADD_SUBSET_RULESプロシージャを使用して表を追加します。

  11. インスタンス化するためにレプリケートされた表を準備します。レプリケートされた表は、同期取得が変更を取得した表です。

    たとえば、同期取得でhr.employees表およびhr.departments表への変更が取得される場合は、次のファンクションを実行します。

    SET SERVEROUTPUT ON
    DECLARE
      tables       DBMS_UTILITY.UNCL_ARRAY;
      prepare_scn  NUMBER;
      BEGIN
        tables(1) := 'hr.departments';
        tables(2) := 'hr.employees';
        prepare_scn := DBMS_CAPTURE_ADM.PREPARE_SYNC_INSTANTIATION(
                          table_names => tables);
      DBMS_OUTPUT.PUT_LINE('Prepare SCN = ' || prepare_scn);
    END;
    /
    

    戻された準備システム変更番号(SCN)は、手順1317および18で使用されます。この例では、準備SCNは2700000とします。

    レプリケートされた表はすべて、PREPARE_SYNC_INSTANTIATIONファンクションに対する1つのコールに含まれている必要があります。

    データベース・オブジェクトのインスタンス化の準備については、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  12. SQL*Plusで、宛先データベースにOracle Streams管理者としてログインします。

  13. 手順11で戻された値に1を加えたSCNに達したときに変更の適用を停止するように、取得プロセスの変更を適用する適用プロセスを設定します。

    たとえば、準備SCNが2700000の場合、次のプロシージャを実行して、maximum_scnパラメータを2700001(2700000 + 1)に設定します。

    BEGIN
      DBMS_APPLY_ADM.SET_PARAMETER(
        apply_name   => 'apply_cap_proc',
        parameter    => 'maximum_scn',
        value        => '2700001');
    END;
    /
    
  14. SQL*Plusで、ソース・データベースにOracle Streams管理者としてログインします。

  15. 手順2で停止した取得プロセスを起動します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_CAPTURE_ADM.START_CAPTURE(
        capture_name => 'cap_proc');
    END;
    /
    
  16. SQL*Plusで、宛先データベースにOracle Streams管理者としてログインします。

  17. 取得プロセスによって取得された変更を適用する適用プロセスが、手順13で指定したSCNの値に達するまで待機します。このイベントが発生すると、SCNの制限値に達したことを示すエラーORA-26717を伴って、適用プロセスは自動的に無効になります。

    適用プロセスがこの制限値に達したことを確認するには、DBA_APPLYビューを問い合せます。この例では、次の問合せを実行します。

    SELECT 1 FROM DBA_APPLY 
       WHERE STATUS       = 'DISABLED' AND
             ERROR_NUMBER = 26717 AND 
             APPLY_NAME   = 'APPLY_CAP_PROC';
    

    この問合せで行が戻されるまで、次の手順には進まないでください。

  18. レプリケートされた表のインスタンス化SCNを、手順11でSCNにより戻されたSCN値に設定します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN(
        source_object_name    => 'hr.employees',
        source_database_name  => 'db1.example.com',
        instantiation_scn     => 2700000);
    END;
    /
    
    BEGIN
      DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN(
        source_object_name    => 'hr.departments',
        source_database_name  => 'db1.example.com',
        instantiation_scn     => 2700000);
    END;
    /
    

    インスタンス化SCNの設定の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  19. 手順5で作成した適用プロセスを起動します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_APPLY_ADM.START_APPLY(
        apply_name => 'apply_sync_cap');
    END;
    /
    
  20. 取得プロセスで取得された変更を適用した適用プロセスを削除します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_APPLY_ADM.DROP_APPLY(
        apply_name => 'apply_cap_proc');
    END;
    /
    
  21. 手順20で削除した適用プロセスによって使用されたキューが不要であれば、削除します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_STREAMS_ADM.REMOVE_QUEUE(
        queue_name  => 'strmadmin.cap_proc_dest',
        drop_unused_queue_table => TRUE);
    END;
    /
    
  22. SQL*Plusで、ソース・データベースにOracle Streams管理者としてログインします。

  23. 取得プロセスを停止します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_CAPTURE_ADM.STOP_CAPTURE(
        capture_name => 'cap_proc');
    END;
    /
    
  24. 取得プロセスを削除します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_CAPTURE_ADM.DROP_CAPTURE(
        capture_name => 'cap_proc');
    END;
    /
    
  25. 取得プロセスで取得された変更を送信した伝播を削除します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_PROPAGATION_ADM.DROP_PROPAGATION(
        propagation_name => 'cap_proc_prop');
    END;
    /
    
  26. 手順2425で削除した取得プロセスおよび伝播によって使用されたキューが不要であれば、削除します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_STREAMS_ADM.REMOVE_QUEUE(
        queue_name  => 'strmadmin.cap_proc_source',
        drop_unused_queue_table => TRUE);
    END;
    /
    

双方向レプリケーション環境の場合、これらの手順を個別に実行し、取得プロセスから同期取得に双方向で切り替えることができます。

同期取得から取得プロセスへの切替え

この項では、同期取得から取得プロセスへの切替え方法について説明します。この切替えは、次のいずれかの場合に行います。

  • 現在は少数の表への変更を取得しているが、使用する環境を拡張して、多数の表、1つ以上のスキーマまたはデータベース全体への変更を取得する場合。

  • 変更の取得中に、ネガティブ・ルール・セットを使用する場合。

  • データベース・オブジェクトへのデータ定義言語(DDL)変更を取得する場合。

この項では例を用いて、同期取得から取得プロセスへの切替え方法について説明します。表 15-2に、サンプル環境での切替え前後のOracle Streamsコンポーネントを示します。

表 15-2 同期取得から取得プロセスへの切替えの例

Oracle Streamsコンポーネント 切替え前 切替え後

同期取得

sync_proc

なし

同期取得ルール・セット

cap_rules

なし

取得プロセス

なし

cap_proc

取得プロセス・ルール・セット

なし

cap_rules

伝播

sync_cap_prop

cap_proc_prop

伝播ルール・セット

prop_rules

prop_rules

ソース・キュー

sync_cap_source

cap_proc_source

宛先キュー

sync_cap_dest

cap_proc_dest

適用プロセス

apply_sync_cap

apply_cap_proc

適用プロセス・ルール・セット

apply_rules

apply_rules


表15-2では、Oracle Streams環境で切替え前と切替え後に同じルール・セットが使用されていることに注意してください。また、この項の例では、ソース・データベースdb1.example.comで、宛先データベースdb2.example.comであるとします。


注意:

この項の例では、Oracle Streams環境に2つのデータベースのみを含むものとします。有向ネットワークを使用して複数のデータベースを介して変更を送信している場合、変更の新規取得プロセス・ストリーム用に追加の伝播およびキューを構成し、同期取得のストリームによって使用された追加の伝播およびキューを削除することが必要になる場合もあります。

同期取得から取得プロセスに切り替えるには、次の手順を実行します。

  1. ソース・データベースがARCHIVELOGモードで実行されていることを確認します。詳細は、「ARCHIVELOGモードおよび取得プロセス」および『Oracle Database管理者ガイド』を参照してください。

  2. SQL*Plusで、宛先データベースにOracle Streams管理者としてログインします。

    この例では、各データベースのOracle Streams管理者はstrmadminであると想定しています。Oracle Streams管理者を作成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  3. 取得プロセスで取得された変更を適用する適用プロセスにキューを作成します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_STREAMS_ADM.SET_UP_QUEUE(
        queue_table => 'strmadmin.cap_proc_dest_qt',
        queue_name  => 'strmadmin.cap_proc_dest');
    END;
    /
    

    キューを構成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  4. 手順3で作成したキューの変更を適用する適用プロセスを作成します。apply_capturedパラメータをTRUEに設定します。また、rule_set_nameパラメータで、既存の適用プロセスで使用されているルール・セットが指定されていることを確認します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_APPLY_ADM.CREATE_APPLY(
        queue_name     => 'strmadmin.cap_proc_dest',
        apply_name     => 'apply_cap_proc',
        rule_set_name  => 'strmadmin.apply_rules',
        apply_captured => TRUE);
    END;
    /
    

    適用プロセスが環境に適切に構成されていることを確認します。具体的には、新しい適用プロセスが、次の項目について適切に構成されていることを確認します。

    • 適用ユーザー

    • 適用ハンドラ

    • 適用タグ

    必要に応じて、新しい適用プロセスが、これらの項目について既存の適用プロセスと同じように構成されていることを確認します。

    適用プロセスを作成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  5. 同期取得で取得された変更を適用する適用プロセスを停止します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_APPLY_ADM.STOP_APPLY(
        apply_name => 'apply_sync_cap');
    END;
    /
    
  6. SQL*Plusで、ソース・データベースにOracle Streams管理者としてログインします。

  7. 取得プロセスのキューを作成します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_STREAMS_ADM.SET_UP_QUEUE(
        queue_table => 'strmadmin.cap_proc_source_qt',
        queue_name  => 'strmadmin.cap_proc_source');
    END;
    /
    
  8. 手順7で作成したキューの変更を手順3で作成したキューに送信する伝播を作成します。rule_set_nameパラメータで、既存の伝播で使用されているルール・セットが指定されていることを確認します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_PROPAGATION_ADM.CREATE_PROPAGATION(
        propagation_name   => 'cap_proc_prop',
        source_queue       => 'strmadmin.cap_proc_source',
        destination_queue  => 'strmadmin.cap_proc_dest',
        destination_dblink => 'db2.example.com',
        rule_set_name      => 'strmadmin.prop_rules');
    END;
    /
    

    伝播を作成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  9. 取得プロセスを作成します。次に示すように、パラメータがCREATE_CAPTUREプロシージャで適切に設定されていることを確認します。

    • queue_nameパラメータを手順7で作成したキューに設定します。

    • rule_set_nameパラメータを既存の同期取得で使用されているルール・セットに設定します。

    • 既存の同期取得の取得ユーザーがOracle Streams管理者でない場合、capture_userパラメータを、新しい取得プロセスの適切な取得ユーザーに設定します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_CAPTURE_ADM.CREATE_CAPTURE(
        queue_name    => 'strmadmin.cap_proc_source',
        capture_name  => 'cap_proc',
        rule_set_name => 'strmadmin.cap_rules');
    END;
    /
    

    取得プロセスを構成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  10. インスタンス化するためにレプリケートされた表を準備します。レプリケートされた表は、取得プロセスで変更を取得した表です。

    たとえば、取得プロセスでhr.employees表およびhr.departments表への変更が取得される場合は、次のプロシージャを実行します。

    BEGIN
      DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(
        table_name           => 'hr.employees',
        supplemental_logging => 'keys');
    END;
    /
    
    BEGIN
      DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(
        table_name           => 'hr.departments',
        supplemental_logging => 'keys');
    END;
    /
    

    データベース・オブジェクトのインスタンス化の準備については、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  11. SHAREMODEでレプリケートされたすべての表をロックします。

    この例では、次のSQL文を実行します。

    LOCK TABLE hr.employees, hr.departments IN SHARE MODE;
    
  12. 次の問合せを実行して、現行のシステム変更番号(SCN)を確認します。

    SELECT CURRENT_SCN FROM V$DATABASE;
    

    戻された切替えSCNは、手順15および18で使用されます。この例では、切替えSCNは2700000とします。

  13. COMMIT文を実行して、レプリケートされた表のロックを解放します。

    COMMIT;
    
  14. SQL*Plusで、宛先データベースにOracle Streams管理者としてログインします。

  15. 手順12で戻された値に1を加えたSCNに達したときに変更の適用を停止するように、同期取得の変更を適用する適用プロセスを設定します。

    たとえば、切替えSCNが2700000の場合、次のプロシージャを実行して、maximum_scnパラメータを2700001(2700000 + 1)に設定します。

    BEGIN
      DBMS_APPLY_ADM.SET_PARAMETER(
        apply_name   => 'apply_sync_cap',
        parameter    => 'maximum_scn',
        value        => '2700001');
    END;
    /
    
  16. 同期取得からの変更を適用する適用プロセスを起動します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_APPLY_ADM.START_APPLY(
        apply_name => 'apply_sync_cap');
    END;
    /
    
  17. 同期取得によって取得された変更を適用する適用プロセスが、手順15で指定したSCNの値に達するまで待機します。このイベントが発生すると、SCNの制限値に達したことを示すエラーORA-26717を伴って、適用プロセスは自動的に無効になります。

    適用プロセスがこの制限値に達したことを確認するには、DBA_APPLYビューを問い合せます。この例では、次の問合せを実行します。

    SELECT 1 FROM DBA_APPLY 
       WHERE STATUS       = 'DISABLED' AND
             ERROR_NUMBER = 26717 AND 
             APPLY_NAME   = 'APPLY_SYNC_CAP';
    

    この問合せで行が戻されるまで、次の手順には進まないでください。

  18. レプリケートされた表のインスタンス化SCNを、手順12で戻されたSCN値に設定します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN(
        source_object_name    => 'hr.employees',
        source_database_name  => 'db1.example.com',
        instantiation_scn     => 2700000);
    END;
    /
    
    BEGIN
      DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN(
        source_object_name    => 'hr.departments',
        source_database_name  => 'db1.example.com',
        instantiation_scn     => 2700000);
    END;
    /
    

    インスタンス化SCNの設定の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

  19. 手順4で作成した適用プロセスを起動します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_APPLY_ADM.START_APPLY(
        apply_name => 'apply_cap_proc');
    END;
    /
    
  20. 同期取得で取得された変更を適用した適用プロセスを削除します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_APPLY_ADM.DROP_APPLY(
        apply_name => 'apply_sync_cap');
    END;
    /
    
  21. 手順20で削除した適用プロセスによって使用されたキューが不要であれば、削除します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_STREAMS_ADM.REMOVE_QUEUE(
        queue_name              => 'strmadmin.sync_cap_dest',
        drop_unused_queue_table => TRUE);
    END;
    /
    
  22. SQL*Plusで、ソース・データベースにOracle Streams管理者としてログインします。

  23. 手順9で作成した取得プロセスを起動します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_CAPTURE_ADM.START_CAPTURE(
        capture_name => 'cap_proc');
    END;
    /
    
  24. 同期取得を削除します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_CAPTURE_ADM.DROP_CAPTURE(
        capture_name => 'sync_cap');
    END;
    /
    
  25. 同期取得で取得された変更を送信した伝播を削除します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_PROPAGATION_ADM.DROP_PROPAGATION(
        propagation_name => 'sync_cap_prop');
    END;
    /
    
  26. 手順2425で削除した同期取得および伝播によって使用されたキューが不要であれば、削除します。

    この例では、次のプロシージャを実行します。

    BEGIN
      DBMS_STREAMS_ADM.REMOVE_QUEUE(
        queue_name              => 'strmadmin.sync_cap_source',
        drop_unused_queue_table => TRUE);
    END;
    /
    

双方向レプリケーション環境の場合、これらの手順を個別に実行して、同期取得から取得プロセスに双方向で切り替えることができます。