16 ステージングと伝播の管理
次の各項では、ANYDATAキューと伝播の管理について説明します。
この章で説明する各タスクは、特に明記されていないかぎり、適切な権限を付与されているOracle Streams管理者が完了する必要があります。
関連項目:
- 
                        
Oracle Streams管理者を作成する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照
 
16.1 キューの管理
ANYDATAキューでは、ペイロードがANYDATA型であるメッセージがステージングされます。したがって、ANYDATAキューでは、ペイロードがANYDATAラッパーにラップされていれば、ほぼすべての型のペイロードのメッセージをステージングできます。Oracle Streamsの各取得プロセス、適用プロセスおよびメッセージ・クライアントは1つのANYDATAキューに関連付けられ、Oracle Streamsの各伝播は1つのANYDATAソース・キューと1つのANYDATA宛先キューに関連付けられます。
                  
この項では、キューに関連する次のタスクの実行手順を説明します。
16.1.1 保護キューでのユーザー操作の有効化
ユーザーが保護キューでエンキューやデキューなどのキュー操作を実行できるようにするには、そのユーザーをキューの保護キュー・ユーザーとして構成する必要があります。DBMS_STREAMS_ADMパッケージのSET_UP_QUEUEプロシージャを使用して保護キューを作成すると、キュー所有者とqueue_userパラメータで指定したユーザーは自動的にキューの保護ユーザーとして構成されます。他のユーザーに対してキュー操作の実行を許可する場合は、そのユーザーを次のいずれかの方法で構成できます。
                        
- 
                              
SET_UP_QUEUEを実行してqueue_userを指定します。キューが存在する場合、キューの作成はスキップされますが、新規キュー・ユーザーを指定した場合はそのユーザーが構成されます。 - 
                              
ユーザーをOracle Databaseアドバンスト・キューイング(AQ)・エージェントに手動で関連付けます。
 
次の例に、ユーザーをOracle Streams AQエージェントに手動で関連付ける手順を示します。streams_queueという名前のキューに対して、oeユーザーがキュー操作を実行できるようにするとします。次の手順に従って、oeユーザーをstreams_queueの保護キュー・ユーザーとして構成します。
                        
前述の手順を完了すると、oeユーザーはstreams_queueの保護ユーザーとなり、このキューを操作できます。ただし、ユーザーにはエンキュー権限やデキュー権限など、キュー操作を実行するための特定の権限を付与する必要もあります。
                        
関連項目:
- 
                                 
「保護キュー」
 - 
                                 
Oracle Streams AQエージェントと
DBMS_AQADMパッケージの使用方法の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照 
16.1.2 保護キューでのユーザー操作の無効化
- 
                              
取得プロセスまたは同期取得を削除したが、取得プロセスまたは同期取得で使用されていたキューを削除しておらず、取得ユーザーであったユーザーに対して残りの保護キューの操作を禁止する場合。
 - 
                              
適用プロセスを削除したが、適用プロセスで使用されていたキューを削除しておらず、適用ユーザーであったユーザーには残りの保護キューの操作を禁止する場合。
 - 
                              
DBMS_APPLY_ADMパッケージのALTER_APPLYプロシージャを使用して適用プロセスのapply_userを変更しており、変更前のapply_userには適用プロセスのキューの操作を禁止する場合。 - 
                              
「保護キューでのユーザー操作の有効化」で説明した手順に従って、ユーザーに保護キューの操作を許可したが、この後、このユーザーには保護キューのキュー操作を禁止する場合。
 
保護キュー・ユーザーを無効化するには、キューに対するENQUEUEおよびDEQUEUE権限をユーザーから取り消す方法と、DBMS_AQADMパッケージのDISABLE_DB_ACCESSプロシージャを実行する方法があります。たとえば、oeユーザーに対して、streams_queueという名前のキューのキュー操作を禁止するとします。 
                        
注意:
複数の保護キューにOracle Streams AQエージェントを使用している場合は、そのエージェントに対してDISABLE_DB_ACCESSを実行すると、そのエージェントに関連付けられているユーザーがこれらすべてのキューに対する操作を実行できなくなります。
                           
関連項目:
- 
                                 
「保護キュー」
 - 
                                 
Oracle Streams AQエージェントと
DBMS_AQADMパッケージの使用方法の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照 
16.1.3 キューの削除
既存のANYDATAキューを削除するには、DBMS_STREAMS_ADMパッケージのREMOVE_QUEUEプロシージャを使用します。REMOVE_QUEUEプロシージャを実行すると、キューにある既存のメッセージがコンシュームされるまでプロシージャは待機します。その後、プロシージャによってキューが停止され、キューに対するエンキューまたはデキューが禁止されます。停止したキューは、プロシージャによって削除されます。
                        
キューのキュー表が空で他のキューに使用されていない場合、キュー表も削除できます。キュー表を削除するには、drop_unused_queue_tableパラメータにTRUE(デフォルト)を指定します。
                        
また、cascadeパラメータをTRUEに設定すると、そのキューを使用するすべてのOracle Streamsクライアントを削除できます。デフォルトでは、cascadeパラメータはFALSEに設定されています。
                        
たとえば、strmadminスキーマ内のANYDATAキューstreams_queueを削除して、そのキューの空のキュー表を削除するには、次のプロシージャを実行します。
                        
BEGIN
  DBMS_STREAMS_ADM.REMOVE_QUEUE(
    queue_name              => 'strmadmin.streams_queue',
    cascade                 => FALSE,
    drop_unused_queue_table => TRUE);
END;
/
この例ではcascadeパラメータがFALSEに設定されているため、Oracle Streamsクライアントがstreams_queueを使用していない場合のみ、このプロシージャはそのキューを削除します。cascadeパラメータがFALSEに設定されており、Oracle Streamsクライアントがそのキューを使用している場合は、エラーが発生します。
                        
16.2 Oracle Streamsの伝播および伝播ジョブの管理
伝播では、Oracle Streamsのソース・キューから宛先キューにメッセージが伝播されます。この項では、次のタスクの実行手順を説明します。
また、Oracle Streamsの伝播は、Oracle Databaseアドバンスト・キューイング(AQ)の機能を使用して管理することもできます。
関連項目:
- 
                           
Oracle Enterprise Manager Cloud Controlを使用して伝播を管理する手順については、Oracle Enterprise Manager Cloud Controlのオンライン・ヘルプを参照
 - 
                           
Oracle Streams AQの機能を使用した伝播の管理の詳細は、『Oracle Databaseアドバンスト・キューイング・ユーザーズ・ガイド』を参照
 
16.2.1 伝播の開始
既存の伝播を開始するには、DBMS_PROPAGATION_ADMパッケージのSTART_PROPAGATIONプロシージャを実行します。たとえば、次のプロシージャでは、伝播strm01_propagationが開始されます。
                        
BEGIN DBMS_PROPAGATION_ADM.START_PROPAGATION( propagation_name => 'strm01_propagation'); END; /
16.2.2 伝播の停止
既存の伝播を停止するには、DBMS_PROPAGATION_ADMパッケージのSTOP_PROPAGATIONプロシージャを実行します。たとえば、次のプロシージャでは、伝播strm01_propagationが停止されます。
                        
BEGIN
  DBMS_PROPAGATION_ADM.STOP_PROPAGATION(
    propagation_name => 'strm01_propagation',
    force            => FALSE);
END;
/
伝播の停止時に統計を消去するには、forceパラメータをTRUEに設定します。伝播に問題が発生した場合は、forceパラメータをTRUEに設定して伝播を停止してから伝播を再開始すると、問題を解決できることがあります。forceパラメータがFALSEに設定されている場合は、伝播の統計は消去されません。
                        
16.2.3 伝播ジョブのスケジュールの変更
既存の伝播ジョブのスケジュールを変更するには、DBMS_AQADMパッケージのALTER_PROPAGATION_SCHEDULEプロシージャを使用します。次の各項では、キュー・ツー・キュー伝播およびキュー・ツーdblink伝播の伝播ジョブのスケジュールを変更する例を説明します。これらの例では、メッセージを15分(900秒)ごとに300秒間伝播させ、25秒待機してから、完全に伝播されたキューの新しいメッセージが伝播されるように、伝播ジョブを設定します。
                     
この項には、次の項目が含まれます。
関連項目:
- 
                              
ALTER_PROPAGATION_SCHEDULEプロシージャの使用の詳細は、『Oracle Databaseアドバンスト・キューイング・ユーザーズ・ガイド』を参照 - 
                              
「伝播ジョブ」
 
16.2.3.1 キュー・ツー・キュー伝播の伝播ジョブのスケジュール変更
dbs2.example.comデータベース・リンクを使用してstrmadmin.strm_a_queueソース・キューからstrmadmin.strm_b_queue宛先キューにメッセージを伝播するキュー・ツー・キュー伝播の伝播ジョブのスケジュールを変更するには、次のプロシージャを実行します。 
                           
BEGIN DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE( queue_name => 'strmadmin.strm_a_queue', destination => 'dbs2.example.com', duration => 300, next_time => 'SYSDATE + 900/86400', latency => 25, destination_queue => 'strmadmin.strm_b_queue'); END; /
各キュー・ツー・キュー伝播には独自の伝播ジョブがあるため、このプロシージャでは、指定した2つのキュー間でメッセージが伝播される伝播のスケジュールのみを変更できます。キュー・ツー・キュー伝播の伝播スケジュールを変更するには、destination_queueパラメータで宛先キューの名前を指定する必要があります。
                           
16.2.3.2 キュー・ツーdblink伝播の伝播ジョブのスケジュール変更
dbs3.example.comデータベース・リンクを使用してstrmadmin.streams_queueソース・キューからメッセージを伝播するキュー・ツーdblink伝播の伝播ジョブのスケジュールを変更するには、次のプロシージャを実行します。 
                           
BEGIN DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE( queue_name => 'strmadmin.streams_queue', destination => 'dbs3.example.com', duration => 300, next_time => 'SYSDATE + 900/86400', latency => 25); END; /
伝播がキュー・ツーdblink伝播であるため、destination_queueパラメータは指定されていません。このタスクは、dbs3.example.com データベース・リンクを使用するすべての宛先キューに対してソース・キューからメッセージを伝播するすべてのキュー・ツーdblink伝播に影響します。
                           
16.2.4 伝播のルール・セットの指定
伝播には、1つのポジティブ・ルール・セットおよび1つのネガティブ・ルール・セットを指定できます。伝播では、ポジティブ・ルール・セット内の1つ以上のルールがTRUEと評価される場合にメッセージは伝播され、ネガティブ・ルール・セット内の1つ以上のルールがTRUEと評価される場合は変更が破棄されます。ネガティブ・ルール・セットは、ポジティブ・ルール・セットの前に評価されます。
                     
この項には、次の項目が含まれます。
16.2.4.1 伝播のポジティブ・ルール・セットの指定
既存のルール・セットを既存の伝播のポジティブ・ルール・セットとして指定するには、ALTER_PROPAGATIONプロシージャのrule_set_nameパラメータを使用します。このプロシージャはDBMS_PROPAGATION_ADMパッケージに含まれています。 
                           
たとえば、次のプロシージャでは伝播strm01_propagationのポジティブ・ルール・セットがstrm02_rule_setに設定されます。
                           
BEGIN
  DBMS_PROPAGATION_ADM.ALTER_PROPAGATION(
    propagation_name  => 'strm01_propagation',
    rule_set_name     => 'strmadmin.strm02_rule_set');
END;
/16.2.4.2 伝播のネガティブ・ルール・セットの指定
既存のルール・セットを既存の伝播のネガティブ・ルール・セットとして指定するには、ALTER_PROPAGATIONプロシージャのnegative_rule_set_nameパラメータを使用します。このプロシージャはDBMS_PROPAGATION_ADMパッケージに含まれています。 
                           
たとえば、次のプロシージャでは伝播strm01_propagationのネガティブ・ルール・セットがstrm03_rule_setに設定されます。
                           
BEGIN
  DBMS_PROPAGATION_ADM.ALTER_PROPAGATION(
    propagation_name        => 'strm01_propagation',
    negative_rule_set_name  => 'strmadmin.strm03_rule_set');
END;
/16.2.5 伝播のルール・セットへのルールの追加
伝播のルール・セットにルールを追加するには、次のいずれかのプロシージャを実行します。
ADD_SUBSET_PROPAGATION_RULESプロシージャ以外のこれらのプロシージャでは、伝播のポジティブ・ルール・セットまたはネガティブ・ルール・セットにルールを追加できます。ADD_SUBSET_PROPAGATION_RULESプロシージャでは、伝播のポジティブ・ルール・セットのみにルールを追加できます。
                     
この項には、次の項目が含まれます。
関連項目:
16.2.5.1 伝播のポジティブ・ルール・セットへのルールの追加
次の例では、DBMS_STREAMS_ADMパッケージのADD_TABLE_PROPAGATION_RULESプロシージャを実行して、既存の伝播strm01_propagationのポジティブ・ルール・セットにルールを追加します。
                           
BEGIN
  DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(
    table_name              => 'hr.locations',
    streams_name            => 'strm01_propagation',
    source_queue_name       => 'strmadmin.strm_a_queue',
    destination_queue_name  => 'strmadmin.strm_b_queue@dbs2.example.com',
    include_dml             => TRUE,
    include_ddl             => TRUE,
    source_database         => 'dbs1.example.com',
    inclusion_rule          => TRUE);
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
- 
                                 
2つのルールが作成されます。一方のルールは、
hr.locations表に対するDML変更の結果を含む行LCRについてTRUEと評価されます。他方のルールは、hr.locations表に対するDDL変更を含むDDL LCRについてTRUEと評価されます。ルール名は、システムによって生成されます。 - 
                                 
どちらのルールも、
dbs1.example.comソース・データベースで変更が発生したLCRに対してのみTRUEと評価されるように指定されます。 - 
                                 
inclusion_ruleパラメータがTRUEに設定されているため、これらの2つのルールは、伝播に関連付けられたポジティブ・ルール・セットに追加されます。 
16.2.5.2 伝播のネガティブ・ルール・セットへのルールの追加
次の例では、DBMS_STREAMS_ADMパッケージのADD_TABLE_PROPAGATION_RULESプロシージャを実行して、既存の伝播strm01_propagationのネガティブ・ルール・セットにルールを追加します。
                           
BEGIN
  DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(
    table_name              => 'hr.departments',
    streams_name            => 'strm01_propagation',
    source_queue_name       => 'strmadmin.strm_a_queue',
    destination_queue_name  => 'strmadmin.strm_b_queue@dbs2.example.com',
    include_dml             => TRUE,
    include_ddl             => TRUE,
    source_database         => 'dbs1.example.com',
    inclusion_rule          => FALSE);
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
- 
                                 
2つのルールが作成されます。一方のルールは
hr.departments表に対するDML変更の結果を含む行LCRについてTRUEと評価され、他方のルールは、hr.departments表に対するDDL変更を含むDDL LCRについてTRUEと評価されます。ルール名は、システムによって生成されます。 - 
                                 
どちらのルールも、
dbs1.example.comソース・データベースで変更が発生したLCRに対してのみTRUEと評価されるように指定されます。 - 
                                 
inclusion_ruleパラメータがFALSEに設定されているため、これらの2つのルールは、伝播に関連付けられたネガティブ・ルール・セットに追加されます。 
16.2.6 伝播のルール・セットからのルールの削除
DBMS_STREAMS_ADMパッケージのREMOVE_RULEプロシージャを実行すると、既存の伝播のルール・セットからルールを削除できます。たとえば、次のプロシージャでは、伝播strm01_propagationのポジティブ・ルール・セットからルールdepartments3が削除されます。
                        
BEGIN
  DBMS_STREAMS_ADM.REMOVE_RULE(
    rule_name        => 'departments3',
    streams_type     => 'propagation',
    streams_name     => 'strm01_propagation',
    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を指定します。
                        
16.2.7 伝播のルール・セットの削除
伝播からルール・セットを削除するには、DBMS_PROPAGATION_ADMパッケージのALTER_PROPAGATIONプロシージャを使用します。このプロシージャでは、ポジティブ・ルール・セットまたはネガティブ・ルール・セット、あるいはその両方を削除できます。伝播のポジティブ・ルール・セットを削除するには、remove_rule_setパラメータをTRUEに指定します。伝播のネガティブ・ルール・セットを削除するには、remove_negative_rule_setパラメータをTRUEに指定します。
                        
たとえば、次のプロシージャでは、伝播strm01_propagationからポジティブ・ルール・セットとネガティブ・ルール・セットの両方が削除されます。
                        
BEGIN
  DBMS_PROPAGATION_ADM.ALTER_PROPAGATION(
    propagation_name         => 'strm01_propagation',
    remove_rule_set          => TRUE,
    remove_negative_rule_set => TRUE);
END;
/
                     16.2.8 伝播の削除
既存の伝播を削除するには、DBMS_PROPAGATION_ADMパッケージのDROP_PROPAGATIONプロシージャを実行します。たとえば、次のプロシージャでは、伝播strm01_propagationが削除されます。
                        
BEGIN
  DBMS_PROPAGATION_ADM.DROP_PROPAGATION(
    propagation_name      => 'strm01_propagation',
    drop_unused_rule_sets => TRUE);
END;
/
drop_unused_rule_setsパラメータがTRUEに設定されているため、このプロシージャでは伝播strm01_propagationで使用されているすべてのルール・セットも削除されます。ただし、他のOracle Streamsクライアントで使用されているルール・セットは削除されません。drop_unused_rule_setsパラメータがTRUEに設定されている場合、伝播のポジティブ・ルール・セットとネガティブ・ルール・セットが両方とも削除されます。このプロシージャによってルール・セットが削除された場合、そのルール・セット内のルールのうち、他のルール・セットに含まれていないルールも削除されます。
                        
注意:
伝播を削除すると、その伝播が使用していた伝播ジョブは、他の伝播で使用されていないかぎり自動的に削除されます。