ヘッダーをスキップ
Oracle® Streamsアドバンスト・キューイング・ユーザーズ・ガイド
11gリリース2 (11.2)
B61355-04
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

4 Oracle Streams Advanced Queuingの管理

この章では、Oracle Streams Advanced Queuing(AQ)の管理に関するトピックについて説明します。

内容は次のとおりです。

Oracle Streams Advanced Queuing互換性パラメータ

バッファ済メッセージを格納するキューは、互換性を8.1以上に設定して作成する必要があります。

次の機能を使用するには、init.oracompatibleパラメータおよびキュー表compatibleパラメータを8.1以上に設定する必要があります。

  • キュー・レベルのアクセス制御

  • Oracle Real Application Clusters環境のサポート

  • パブリッシュ・サブスクライブ用のルールベースのサブスクライバ

  • 非同期通知

  • 送信元の識別

  • 履歴管理情報の記憶域の分離

  • 保護キュー


    関連項目:

    保護キューの詳細は、『Oracle Streams概要および管理』を参照してください。

データベースの互換性が10.0である場合のみ、大文字と小文字が混在するキュー名、キュー表名およびサブスクライバ名を指定できますが、名前を二重引用符で囲む必要があります。したがって、abc.efgは、スキーマがABCで名前がEFGであることを示しますが、"abc"."efg"はスキーマがabcで名前がefgであることを示します。

キューのセキュリティとアクセス制御

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

Oracle Streams Advanced Queuingのセキュリティ

構成情報は、DBMS_AQADMパッケージ内のプロシージャを使用して管理できます。最初は、SYSおよびSYSTEMのみに、DBMS_AQADMおよびDBMS_AQ内のプロシージャの実行権限が付与されています。この2つのパッケージのEXECUTE権限が付与されたユーザーは、自分のスキーマで、キューの作成、管理および使用ができます。他のスキーマのキューを作成および管理する場合は、The MANAGE_ANY AQシステム権限が使用されます。


関連項目:

AQシステム権限の詳細は、「Oracle Streams Advanced Queuingシステム権限の付与」を参照してください。

Java Message Service(JMS)APIのユーザーには、DBMS_AQJMSおよびDBMS_AQINに対するEXECUTE権限が必要です。

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

管理者ロール

AQ_ADMINISTRATOR_ROLEには、キュー管理に必要なすべての権限が付与されます。ロールに付与された権限によって、権限受領者は次のことができるようになります。

  • データベースのあらゆるスキーマに対するすべてのキュー管理操作(キューやキュー表の作成など)の実行

  • データベースのすべてのキューに対するエンキューおよびデキュー操作の実行

  • そのキューの作業負荷を監視するための統計ビューへのアクセス

  • DBMS_TRANSFORMを使用した変換の作成

  • DBMS_AQELM内のあらゆるプロシージャの実行

  • DBMS_AQJMS内のあらゆるプロシージャの実行

ユーザー・ロール

AQ_USER_ROLEでは、エンキューまたはデキューを行うには権限が不十分なため、このロールを付与することは避けてください。

ユーザーにこのレベルの制御を付与する場合は、データベース管理者がDBMS_AQADM.GRANT_SYSTEM_PRIVILEGEおよびDBMS_AQADM.REVOKE_SYSTEM_PRIVILEGEを直接データベース・ユーザーに対して実行し、システム権限ENQUEUE_ANYおよびDEQUEUE_ANYを付与するオプションがあります。

アプリケーション開発者がキューに権限を付与するには、DBMS_AQADM.GRANT_QUEUE_PRIVILEGEおよびDBMS_AQADM.REVOKE_QUEUE_PRIVILEGEを実行して、オブジェクト・レベルの権限を付与および取り消します。

データベース・ユーザーは、DBMS_AQに対するEXECUTE権限以外に、オブジェクト・レベルまたはシステム・レベルの明示的な権限を付与されなくても、自分のスキーマでのキューのエンキューおよびデキューが可能です。

Oracle Streams Advanced Queuingオブジェクト型へのアクセス

Oracle Streams Advanced Queuingの内部オブジェクトは、すべてPUBLICからのアクセスが可能となりました。

キューのセキュリティ

Oracle DatabaseのOracle Streams Advanced Queuing管理者は、キューを作成できます。キューを作成するとき、DBMS_AQADM.CREATE_QUEUE_TABLEcompatibleパラメータのデフォルト値は、compatibleパラメータのデフォルト値です。

エンキューまたはデキューするユーザーには、DBMS_AQEXECUTE権限の他、ターゲット・キューでのエンキューまたはデキュー権限、もしくはENQUEUE_ANY/DEQUEUE_ANYシステム権限のいずれかが必要です。

キュー権限とアクセス制御

キューに対するオブジェクト・レベルの権限は、付与または取消しが可能です。システム・レベルの各種権限を付与または取り消すこともできます。表4-1に、Oracle Streams Advanced Queuingのすべての共通操作とそれらの操作を実行する場合に必要な権限を示します。

表4-1 操作および必要な権限

操作 必要な権限

所有するキューに対するCREATE/DROP/MONITOR

DBMS_AQADMEXECUTE権限が必要です。その他の権限は不要です。

すべてのキューに対するCREATE/DROP/MONITOR

DBMS_AQADMEXECUTE権限の他、AQ_ADMINISTRATOR_ROLEが付与されている別のユーザーから、このロールを取得する必要があります(最初は、SYSおよびSYSTEMからAQ_ADMINISTRATOR_ROLEが付与されます)。

所有するキューに対するENQUEUE/ DEQUEUE

DBMS_AQEXECUTE権限が必要です。その他の権限は不要です。

他のユーザーが所有するキューに対するENQUEUE/ DEQUEUE

DBMS_AQEXECUTE権限の他、DBMS_AQADM.GRANT_QUEUE_PRIVILEGEを使用して、所有者から権限を取得する必要があります。

すべてのキューに対するENQUEUE/ DEQUEUE

DBMS_AQEXECUTE権限の他、DBMS_AQADM.GRANT_SYSTEM_PRIVILEGEを使用して、Oracle Streams Advanced Queuing管理者から、ENQUEUE ANY QUEUEまたはDEQUEUE ANY QUEUEシステム権限を取得する必要があります。


OCIアプリケーションとキュー・アクセス

Oracle Call Interface(OCI)アプリケーションでキューにアクセスするセッション・ユーザーには、アクセス先のキューのオブジェクト権限、またはシステム権限(ENQUEUE ANY QUEUEまたはDEQUEUE ANY QUEUE)のいずれかを付与する必要があります。DBMS_AQEXECUTE権限とセッション・ユーザーの権限が照合されて確認されることはありません。

伝播に必要なセキュリティ

Oracle Streams Advanced Queuingでは、データベース・リンクを介してメッセージを伝播します。伝播ドライバは、ソース・キューの所有者としてソース・キューからデキューするため、ソース・キューに対して明示的なアクセス権を付与する必要はありません。宛先では、データベース・リンクのログイン・ユーザーには、ENQUEUE ANY QUEUE権限を付与するか、または宛先キューに対するエンキュー権限を付与する必要があります。ただし、データベース・リンクのログイン・ユーザーが宛先のキュー表も所有している場合は、明示的なOracle Streams Advanced Queuingの権限を付与しないでください。

キュー表のエクスポート/インポート

キュー表がエクスポートされると、キュー表データおよびPL/SQLコードの無名ブロックがエクスポート・ダンプ・ファイルに書き込まれます。キュー表がインポートされると、インポート・ユーティリティがこれらのPL/SQL無名ブロックを実行して、メタデータをデータ・ディクショナリに書き込みます。

Oracle AQでは、ユーザーのエクスポートとともに登録をエクスポートしません。クライアント登録を利用するすべてのアプリケーションでは、インポートされたデータベースにクライアントが存在しないことを考慮する必要があります。


注意:

バッファ済メッセージをエクスポートまたはインポートすることはできません。

データベースのスキーマが同じで、かつ同名のキュー表がエクスポート・ダンプに存在する場合は、データベース・キューを空にしてからキュー表とキューをインポートしてください。そうしないと、インポートしたキューのメタデータが破損する可能性があります。


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

キュー表データのエクスポート

キューをエクスポートすると、必然的に基になるキュー表および関連するディクショナリ表もエクスポートされます。キューは、キュー表単位でもエクスポートできます。

複数の受信者がいるキュー表のエクスポート

複数の受信者をサポートするキュー表は、次の表と対応付けられています。

  • デキュー索引構成表(IOT)

  • 時間管理索引構成表

  • サブスクライバ表

  • 履歴IOT

全データベース・モード、ユーザー・モードおよび表モード・エクスポートで、これらの表は自動的にエクスポートされます。「エクスポート・モード」を参照してください。

メタデータ表には、キュー表の一部の表のROWIDが含まれているため、インポート処理の際、メタデータ表のインポート時に使用不可になったROWIDの記録が生成されます。インポート処理の一部として、使用不可になったROWIDはキュー・システムによって自動的に修正されるため、このメッセージは無視して構いません。ただし、インポート時に別の問題が発生した場合(ロールバック・セグメント領域の不足など)は、ユーザーが問題を修正してインポートを繰り返す必要があります。

エクスポート・モード

エクスポートの操作モードには、全データベース・モード、ユーザー・モードおよび表モードがあります。キュー表の増分エクスポートはサポートされていません。

全データベース・モードでは、キュー表、すべての関連表、システム・レベルの権限付与およびプライマリ・オブジェクトとセカンダリ・オブジェクトの権限付与が自動的にエクスポートされます。

ユーザー・モードでは、キュー表、すべての関連表およびプライマリ・オブジェクトの権限付与が自動的にエクスポートされます。ただし、FROMUSER TOUSER句を使用したあるスキーマから別のスキーマへのユーザー・レベルのエクスポートはサポートされていません。

表モードでは、キュー表、すべての関連表およびプライマリ・オブジェクトの権限付与が自動的にエクスポートされます。たとえば、マルチ・コンシューマ・キュー表をエクスポートする場合、次の表が自動的にエクスポートされます。

  • AQ$_queue_table_I(デキューIOT)

  • AQ$_queuetable_T(時間管理IOT)

  • AQ$_queue_table_S(サブスクライバ表)

  • AQ$_queue_table_H(履歴IOT)

キュー表データのインポート

エクスポートと同様に、キューをインポートすると、必ず基になるキュー表および関連するディクショナリ・データもインポートされます。キュー表データがインポートされると、インポート・ユーティリティがダンプ・ファイルのPL/SQL無名ブロックを実行して、メタデータをデータ・ディクショナリに書き込みます。

複数の受信者がいるキュー表のインポート

複数の受信者をサポートするキュー表は、次の表と対応付けられています。

  • デキューIOT

  • 時間管理IOT

  • サブスクライバ表

  • 履歴IOT

そのキュー自体のキュー表の他に、これらの表もインポートする必要があります。

インポートIGNOREパラメータ

すでにデータが含まれているキュー表には、キュー・データをインポートしないでください。キュー表をインポートする場合は、インポート・ユーティリティのIGNOREパラメータを必ずNOに設定する必要があります。IGNOREパラメータがYESに設定されており、すでに存在しているキュー表がダンプ・ファイル中の表定義と互換性がある場合は、ダンプ・ファイルの各行がそのキュー表にロードされます。それと同時に、古いキュー表定義が失われ、再作成されます。インポート前のキュー表定義は失われ、複製された行がキュー表に現れます。

データ・ポンプ・エクスポートとデータ・ポンプ・インポート

データ・ポンプでは、キュー表の置換モードとスキップ・モードがサポートされています。置換モードでは、既存のキュー表が削除され、エクスポート・ダンプ・ファイルの新規キュー表に置き換えられます。スキップ・モードでは、既存のキュー表はインポートされません。

キュー表のTRUNCATEモードおよびAPPENDモードはサポートされていません。この場合の動作は置換モードと同様です。


関連項目:

データ・ポンプ・エクスポートおよびデータ・ポンプ・インポートの詳細は、『Oracle Databaseユーティリティ』を参照してください。

Oracle Enterprise Managerのサポート

Oracle Enterprise Managerでは、Oracle Streams Advanced Queuingの大抵の管理機能がサポートされています。Oracle Streams Advanced Queuingの機能は、Enterprise Managerコンソールのナビゲーション・ツリーの分散ノードに配置されています。Oracle Enterprise Managerで使用可能な機能は次のとおりです。

  • スキーマ・マネージャに含まれるキュー項目を使用した各種プロパティの参照

  • キューの作成、開始、停止および削除

  • 伝播のスケジューリングおよびスケジュール解除

  • サブスクライバの追加および削除

  • データベースのすべてのキューに対する伝播スケジュールの表示

  • データベースのすべてのキューに対するエラーの表示

  • メッセージ・キューの表示

  • 権限の付与および取消し

  • 変換の作成、変更または削除

XAでのOracle Streams Advanced Queuingの使用

Oracle Streams Advanced Queuing OCIインタフェースを使用する場合は、xa_open文字列で「Objects=T」を指定する必要があります。これは、オブジェクト・モードで、XAにクライアント側キャッシュを初期化させます。OCIまたはPro*Cから、PL/SQLラッパーを介してOracle Streams Advanced Queuingを使用する場合、この処理は必要ありません。

Oracle Streams Advanced Queuingは(ラージ・オブジェクト(LOB)として格納されていても)単純なRAWバッファに抽象化されるため、Pro*シリーズのマニュアルに記載されているラージ・オブジェクト(LOB)メモリー管理の概念は、Oracle Streams Advanced QueuingのRAW型のメッセージには当てはまりません。

サービス間(xa_start境界とxa_end境界の間など)でデキュー処理を続ける場合に、Oracle Streams Advanced Queuingナビゲーション・オプションを使用するときは、FIRST_MESSAGEを使用してデキュー位置をリセットする必要があります。これは、xa_endが終了すると、XAがカーソル・フェッチ状態を取り消すためです。リセットしないと、ナビゲーション・オプションの指定順序が正しくないというエラー・メッセージ(ORA-25237)が表示されます。


関連項目

  • XAの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』のOracle XAでのトランザクション・モニターの操作に関する項を参照してください。

  • 『Pro*C/C++プログラマーズ・ガイド』のLarge Objects(LOB)に関する項を参照してください。


キュー管理の制限事項

この項では、キュー管理の制限事項について説明します。

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


注意:

データベースの互換性が10.0である場合のみ、大文字と小文字が混在するキュー名、キュー表名およびサブスクライバ名を指定できますが、名前を二重引用符で囲む必要があります。したがって、abc.efgは、スキーマがABCで名前がEFGであることを示しますが、"abc"."efg"はスキーマがabcで名前がefgであることを示します。

サブスクライバ

各キューのローカル・サブスクライバ数は1,000以内です。また、各リモートの接続先のデータベースで対応可能なリモート・サブスクライバ数は32です。

キュー表または関連IOTに対するDMLの未サポート

Oracle Streams Advanced Queuingでは、キュー表または関連索引構成表(IOT)に対するデータ操作言語(DML)はサポートされていません。キュー表を修正するためにサポートされている唯一の手段は、提供されているAPIを使用することです。キュー表やIOTは、DML操作を行うと一貫性がなくなり、実質的に破損する可能性があります。

REFペイロード属性を持つオブジェクト・キューからの伝播

Oracle Streams Advanced Queuingでは、ペイロードにREF属性を持つオブジェクト・キューからの伝播はサポートされていません。

メッセージ・ペイロード(実際に通信される情報)内のコレクション型

オブジェクトに含まれていないVARRAYを使用して、メッセージ・ペイロードを組み立てることはできません。また、現時点では、メッセージ・ペイロード内で埋込みオブジェクトとしてネストした表を使用できません。ただし、1つ以上のVARRAYを含むオブジェクト型を作成し、これを基礎にしてキュー表を作成できます(例4-1を参照してください)。

例4-1 VARRAYを含むオブジェクトの作成

CREATE TYPE number_varray AS VARRAY(32) OF NUMBER; 
CREATE TYPE embedded_varray AS OBJECT (col1 number_varray);
EXECUTE DBMS_AQADM.CREATE_QUEUE_TABLE( 
  queue_table           =>     'QT', 
  queue_payload_type    =>     'embedded_varray'); 

キュー表およびキューにおけるシノニム

キューおよびキュー表におけるシノニムを解決するOracle Streams Advanced Queuing PL/SQLコールはありません。シノニムの作成は可能ですが、Oracle Streams Advanced Queuingインタフェースに適用することは避けてください。

オブジェクト型におけるシノニム

オブジェクト型のシノニムを作成している場合、それをDBMS_AQADM.CREATE_QUEUE_TABLEで使用することはできません。エラーORA-24015が発生します。

表領域のPoint-in-Timeリカバリ

現在は、Oracle Streams Advanced Queuingでは、表領域のPoint-in-Timeリカバリはサポートされていません。キュー表が表領域に作成されると、Point-in-Timeリカバリは使用できません。通常のPoint-in-Timeリカバリは、Oracle Streams Advanced Queuingでサポートされています。

仮想プライベート・データベース

Oracle Streams Advanced Queuingキュー表でセキュリティ・ポリシーを指定すると、Oracle Streams Advanced Queuingを仮想プライベート・データベースで使用できます。デキュー中に、適用するポリシーのデキュー条件(deq_cond)または相関識別子を使用します。デキュー条件として「1=1」を使用できます。デキュー条件または相関識別子を使用しないとデキューでエラーが発生します。


注意:

デキュー条件または相関識別子を使用すると、メッセージのデキュー順序が不定になり、キューのソート順序は考慮されません。

伝播の管理

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


注意:

伝播が正常に動作するために、キューaq$_prop_notify_Xが中止または削除されたり、表aq$_prop_table_Xが削除されることがないようにしてください。

伝播に必要なEXECUTE権限

伝播ジョブの所有者はSYSですが、伝播はキュー表の所有者のセキュリティ・コンテキスト内で発生します。以前は、伝播ジョブの所有者は、伝播をスケジューリングするユーザーで、伝播が発生するのは、伝播スケジュールを設定するユーザーのセキュリティ・コンテキスト内でした。キュー表の所有者には、DBMS_AQADMパッケージのEXECUTE権限が必要です。権限がない場合、Oracleデータベース・スナップショット・プロセスは、エラー識別子SYS.DBMS_AQADMが定義されていないトレース・ファイルを伝播および生成しません。伝播には、キュー表の所有者が所有するプライベート・データベース・リンクを使用できます。接続文字列に指定されたユーザーには、リモート・データベース上のDBMS_AQパッケージおよびDBMS_AQADMパッケージに対するEXECUTEアクセス権限が必要です。

オブジェクト・キューからの伝播

BFILEオブジェクトを伴うオブジェクト・キューからの伝播がサポートされています。BFILEオブジェクトを使用したオブジェクト・キューの伝播を可能にするには、ソース・キューの所有者が、BFILEの格納ディレクトリに対応するディレクトリ・オブジェクトの読取り権限を取得する必要があります。データベース・リンクのユーザーは、接続先データベースで、BFILEのディレクトリに対応するディレクトリ・オブジェクトの書込み権限を取得する必要があります。

AQの伝播では、NOT FINAL型はサポートされません。データベース・リンクを指定せずに、オブジェクト・キューからBFILEオブジェクトを伝播することはできません。


関連項目:

ディレクトリ・オブジェクトの詳細は、『Oracle Database SQL言語リファレンス』のディレクトリの作成に関する項を参照してください。

伝播の最適化

AQ伝播ジョブはOracle Schedulerで実行されます。伝播は、次の方法でスケジュールできます。

  • 専用のスケジュールでは、伝播は永久的にまたは指定された期間で実行されます。このモードは、最も低い伝播の待機時間を提供します。

  • 周期的なスケジュールでは、伝播は指定された間隔で周期的に実行されます。これは、伝播をバッチ・モードで実行する場合に使用します。

  • イベント・ベース・システムでは、伝播するメッセージがある場合に伝播が開始されます。このモードでは、迅速なレスポンス時間を持続しながら、使用可能なリソースを効果的に使用できます。

管理者は、アプリケーション・パフォーマンス要件に最も適したスケジュールを選択します。

Oracle Schedulerは、伝播スケジュールが必要とする数のジョブ・キュー・プロセスを開始します。スケジューラはスループットで最適化するため、システムの負荷が大きい場合、いくつかの伝播ジョブを実行しないことがあります。リソース・マネージャを使用すると、スケジュール決定の制御が向上します。特に、伝播ジョブを異なったリソース・グループに関連付けると、適切なスケジュールが可能になり、負荷が大きい状況に役に立ちます。

JOB_QUEUE_PROCESSES数を設定するとき、DBAは、この値が、伝播するメッセージの伝播元のキュー数、およびメッセージの伝播先の宛先(キューではない)の数によって決まることを理解しておく必要があります。

伝播は、スケジューリング・アルゴリズムによって処理されます。このアルゴリズムは使用可能なジョブ・キュー・プロセスを最適化し、メッセージがソース・キューにエンキューされてから宛先に現れるまでの時間を最小限にするため、OLTPとほぼ同様の動作を実現します。アルゴリズムが操作できるスケジュールの数は無制限で、様々な障害に対しても対処できます。伝播は、使用可能なジョブ・キュー・プロセスの最適使用を試みますが、開始するジョブ・キュー・プロセスの数はレプリケーション・ジョブのような伝播に関連しないジョブの存在にも依存します。したがって、このスケジューリング・アルゴリズムによって最高の結果を得るためには、次のガイドラインを利用することが重要です。

スケジューリング・アルゴリズムは、次のようにジョブ・キュー・プロセスを使用します(ここでは、アクティブ・スケジュールが適切に設定されているとします)。

  • アクティブ・スケジュール数がジョブ・キュー・プロセスの半数に満たない場合、アクティブ・スケジュール数と同数のジョブ・キュー・プロセスが取得されます。

  • アクティブ・スケジュール数がジョブ・キュー・プロセス数の半数を超える場合、ジョブ・キュー・プロセスの半数を取得した後で、取得した各ジョブ・キュー・プロセスに複数のアクティブ・スケジュールを割り当てます。

  • システムがオーバーロードになっている(すべてのスケジュールが伝播のためにビジーになっている)場合、可用性に応じて、ジョブ・キュー・プロセス総数が-1になるまで追加のジョブ・キュー・プロセスが取得されます。

  • あるプロセスによって操作されるアクティブ・スケジュールがどれも伝播の必要なメッセージを持っていない場合、そのジョブ・キュー・プロセスは解放されます。

  • このアルゴリズムによって、負荷が大きいプロセスから小さいプロセスにスケジュールを転送することで自動ロード・バランシングを行い、オーバーロードのプロセスがなくなるようにします。

伝播中の障害対策

スケジューリング・アルゴリズムは、様々な障害に対して強力に対処します。メッセージの伝播を妨げる一般的な障害は次のとおりです。

  • データベース・リンクに失敗

  • リモート・データベースが使用できない

  • リモート・キューが存在しない

  • リモート・キューが開始されていない

  • メッセージをリモート・キューにエンキューしようとしたときにセキュリティ違反が発生した

前述のいずれかの状態が生じると、該当するエラー・メッセージがDBA_QUEUE_SCHEDULESビューにレポートされます。

スケジュールのエラーが発生したメッセージは、障害数の関数である再試行間隔の経過後に伝播が再試行されます。試行回数がシステム定義の最大数を超えると、スケジュールが使用不可になります。

エラーの原因になっていた問題が解決し、スケジュールが有効化されても、最終エラーの発生した日付、時刻およびメッセージを示すエラー・フィールドに、そのエラー情報が残ります。このフィールドがリセットされるのは、そのスケジュールによってメッセージが正常に伝播されたときです。