16 ステージングと伝播の管理

次の各項では、ANYDATAキュー伝播の管理について説明します。

この章で説明する各タスクは、特に明記されていないかぎり、適切な権限を付与されている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の保護キュー・ユーザーとして構成します。

  1. SQL*Plusで、Oracle Streams AQエージェントを作成してユーザーを変更できる管理ユーザーとして接続します。

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

  2. 次のように入力してエージェントを作成します。
    EXEC DBMS_AQADM.CREATE_AQ_AGENT(agent_name => 'streams_queue_agent');
    
  3. ユーザーがキューからメッセージをデキューできるようにする必要がある場合は、エージェントを保護キューのサブスクライバにします。
    DECLARE
      subscriber SYS.AQ$_AGENT;
    BEGIN
      subscriber :=  SYS.AQ$_AGENT('streams_queue_agent', NULL, NULL);  
      DBMS_AQADM.ADD_SUBSCRIBER(
        queue_name          =>  'strmadmin.streams_queue',
        subscriber          =>  subscriber,
        rule                =>  NULL,
        transformation      =>  NULL);
    END;
    /
    
  4. ユーザーをエージェントに関連付けます。
    BEGIN
      DBMS_AQADM.ENABLE_DB_ACCESS(
        agent_name  => 'streams_queue_agent',
        db_username => 'oe');
    END;
    /
    
  5. ユーザーにDBMS_STREAMS_MESSAGINGパッケージまたはDBMS_AQパッケージのEXECUTE権限が付与されていない場合は、これらの権限を付与します。
    GRANT EXECUTE ON DBMS_STREAMS_MESSAGING TO oe;
    
    GRANT EXECUTE ON DBMS_AQ TO oe;
    

前述の手順を完了すると、oeユーザーはstreams_queueの保護ユーザーとなり、このキューを操作できます。ただし、ユーザーにはエンキュー権限やデキュー権限など、キュー操作を実行するための特定の権限を付与する必要もあります。

関連項目:

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を実行すると、そのエージェントに関連付けられているユーザーがこれらすべてのキューに対する操作を実行できなくなります。

  1. 次のプロシージャを実行し、oeユーザーに対して保護キューstreams_queueのキュー操作を禁止します。
    BEGIN
      DBMS_AQADM.DISABLE_DB_ACCESS(
        agent_name  => 'streams_queue_agent',
        db_username => 'oe');
    END;
    /
    
  2. 不要になったエージェントは削除できます。
    BEGIN
      DBMS_AQADM.DROP_AQ_AGENT(
        agent_name  => 'streams_queue_agent');
    END;
    /
    
  3. キューに対する権限がユーザーにとって不要になった場合は、その権限を取り消します。
    BEGIN
      DBMS_AQADM.REVOKE_QUEUE_PRIVILEGE (
       privilege   => 'ALL',
       queue_name  => 'strmadmin.streams_queue',
       grantee     => 'oe');
    END;
    /
    

関連項目:

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)の機能を使用して管理することもできます。

関連項目:

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秒待機してから、完全に伝播されたキューの新しいメッセージが伝播されるように、伝播ジョブを設定します。

この項には、次の項目が含まれます。

関連項目:

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に設定されている場合、伝播のポジティブ・ルール・セットネガティブ・ルール・セットが両方とも削除されます。このプロシージャによってルール・セットが削除された場合、そのルール・セット内のルールのうち、他のルール・セットに含まれていないルールも削除されます。

注意:

伝播を削除すると、その伝播が使用していた伝播ジョブは、他の伝播で使用されていないかぎり自動的に削除されます。