4 Oracle Transactional Event QueuesおよびAdvanced Queuingの管理
次のトピックでは、Oracle Transactional Event QueuesおよびAdvanced Queuingの管理方法について説明します。
Oracle Database Advanced Queuing互換性パラメータ
バッファ済メッセージを格納するキューは、互換性を8.1以上に設定して作成する必要があります。
次の機能を使用するには、init.ora
のcompatible
パラメータおよびキュー表のcompatible
パラメータを8.1以上に設定する必要があります。
-
キュー・レベルのアクセス制御
-
Oracle Real Application Clusters環境のサポート
-
パブリッシュ・サブスクライブ用のルールベースのサブスクライバ
-
非同期通知
-
送信元の識別
-
履歴管理情報の記憶域の分離
-
保護キュー
データベースの互換性が10.0である場合のみ、大文字と小文字が混在するキュー名、キュー表名およびサブスクライバ名を指定できますが、名前を二重引用符で囲む必要があります。したがって、abc.efg
は、スキーマがABC
で名前がEFG
であることを示しますが、"abc"."efg"
はスキーマがabc
で名前がefg
であることを示します。
キューのセキュリティとアクセス制御
次のトピックでは、Oracle Database Advanced Queuingのキューのセキュリティおよびアクセス制御について説明します。
Oracle Database Advanced Queuingのセキュリティ
構成情報は、DBMS_AQADM
パッケージ内のプロシージャを使用して管理できます。
最初は、SYS
およびSYSTEM
のみに、DBMS_AQADM
およびDBMS_AQ
内のプロシージャの実行権限が付与されています。この2つのパッケージのEXECUTE
権限が付与されたユーザーは、自分のスキーマで、キューの作成、管理および使用ができます。他のスキーマのキューを作成および管理する場合は、The MANAGE_ANY
AQシステム権限が使用されます。
Java Message Service(JMS)APIのユーザーには、DBMS_AQJMS
およびDBMS_AQIN
に対するEXECUTE
権限が必要です。
トピック:
関連項目:
AQシステム権限の詳細は、「Oracle Database Advanced Queuingシステム権限の付与」を参照してください。
管理者ロール
AQ_ADMINISTRATOR_ROLE
には、キュー管理に必要なすべての権限が付与されます。
ロールに付与された権限によって、権限受領者は次のことができるようになります。
-
そのキューの作業負荷を監視するための統計ビューへのアクセス
-
DBMS_TRANSFORM
を使用した変換の作成 -
DBMS_AQELM
内のあらゆるプロシージャの実行 -
DBMS_AQJMS
内のあらゆるプロシージャの実行
ノート:
-
ユーザーは
AQ_ADMINISTRATOR_ROLE
がなくても、自分のスキーマでキューを作成したり、他のAQ DDLを実行できます。同様に、DBMS_AQADM
パッケージの実行権限のみがユーザーに必要です。 -
AQ_ADMINISTRATOR_ROLE
では、SYS
またはSYSTEM
スキーマにAQオブジェクトを作成できません。そのため、任意のスキーマでキュー表やキューを作成できるという前述の説明に、SYS
およびSYSTEM
スキーマは含まれません。 -
AQ_ADMINISTRATOR_ROLE
では、SYS
またはSYSTEM
スキーマのキューでエンキューやデキューはできません。
ユーザー・ロール
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
権限以外に、オブジェクト・レベルまたはシステム・レベルの明示的な権限を付与されなくても、自分のスキーマでのキューのエンキューおよびデキューが可能です。
ノート:
-
クライアントがOCIまたはPL/SQLの場合に、自分のスキーマでエンキューまたはデキューできるようにするには、
DBMS_AQ
パッケージのEXECUTE
権限のみがユーザーに必要になります。クライアントがJDBCまたはJMSの場合は、これに加えて、
DBMS_AQIN
パッケージの実行権限も必要になります。 -
自分のスキーマ内のキューでエンキューまたはデキューする場合、
AQ_USER_ROLE
はユーザーに必要ありません。
キューのセキュリティ
Oracle DatabaseのOracle Database Advanced Queuing管理者は、キューを作成できます。キューを作成するとき、DBMS_AQADM.CREATE_QUEUE_TABLE
のcompatible
パラメータのデフォルト値は、compatible
パラメータのデフォルト値です。
エンキューまたはデキューするユーザーには、DBMS_AQ
のEXECUTE
権限の他、ターゲット・キューでのエンキューまたはデキュー権限、もしくはENQUEUE_ANY
/DEQUEUE_ANY
システム権限のいずれかが必要です。
キュー権限とアクセス制御
キューに対するオブジェクト・レベルの権限は、付与または取消しが可能です。システム・レベルの各種権限を付与または取り消すこともできます。
表4-1に、Oracle Database Advanced Queuingのすべての共通操作とそれらの操作を実行する場合に必要な権限を示します。
表4-1 操作および必要な権限
操作 | 必要な権限 |
---|---|
所有するキューに対する |
|
すべてのキューに対する |
|
所有するキューに対する |
|
他のユーザーが所有するキューに対する |
|
すべてのキューに対する |
|
OCIアプリケーションとキュー・アクセス
Oracle Call Interface(OCI)アプリケーションでキューにアクセスするには、セッション・ユーザーに、アクセス先のキューのオブジェクト権限、またはシステム権限(ENQUEUE
ANY
QUEUE
またはDEQUEUE
ANY
QUEUE
)のいずれかを付与する必要があります。
DBMS_AQ
のEXECUTE
権限とセッション・ユーザーの権限が照合されて確認されることはありません。
伝播に必要なセキュリティ
Oracle Database Advanced Queuingでは、データベース・リンクを介してメッセージを伝播します。
伝播ドライバは、ソース・キューの所有者としてソース・キューからデキューするため、ソース・キューに対して明示的なアクセス権を付与する必要はありません。宛先では、データベース・リンクのログイン・ユーザーには、ENQUEUE
ANY
QUEUE
権限を付与するか、または宛先キューに対するエンキュー権限を付与する必要があります。ただし、データベース・リンクのログイン・ユーザーが宛先のキュー表も所有している場合は、明示的なOracle Database Advanced Queuingの権限を付与しないでください。
関連項目:
キュー表のエクスポート/インポート
キュー表がエクスポートされると、キュー表データおよびPL/SQLコードの無名ブロックがエクスポート・ダンプ・ファイルに書き込まれます。キュー表がインポートされると、インポート・ユーティリティがこれらのPL/SQL無名ブロックを実行して、メタデータをデータ・ディクショナリに書き込みます。
Oracle AQでは、ユーザーのエクスポートとともに登録をエクスポートしません。クライアント登録を利用するすべてのアプリケーションでは、インポートされたデータベースにクライアントが存在しないことを考慮する必要があります。
ノート:
バッファ済メッセージをエクスポートまたはインポートすることはできません。
データベースのスキーマが同じで、かつ同名のキュー表がエクスポート・ダンプに存在する場合は、データベース・キューを空にしてからキュー表とキューをインポートしてください。そうしないと、インポートしたキューのメタデータが破損する可能性があります。
トピック:
キュー表データのエクスポート
キューをエクスポートすると、必然的に基になるキュー表および関連するディクショナリ表もエクスポートされます。キューは、キュー表単位でもエクスポートできます。
複数の受信者がいるキュー表のエクスポート
AQの場合、複数の受信者をサポートするキュー表は、次の表と関連付けられます。
-
デキュー索引構成表(IOT)
-
時間管理索引構成表
-
サブスクライバ表
-
履歴IOT
トランザクション・イベント・キューは、次のオブジェクトに関連付けられます。
-
キュー表
-
デキュー表
-
時間管理表
-
オプションの例外キュー・マップ表
-
前述の表の索引
-
順序
-
ルール・セットおよび評価コンテキスト
全データベース・モード、ユーザー・モードおよび表モード・エクスポートで、これらの表は自動的にエクスポートされます。「エクスポート・モード」を参照してください。
メタデータ表には、キュー表の一部の表のROWIDが含まれているため、インポート処理の際、メタデータ表のインポート時に使用不可になったROWIDの記録が生成されます。インポート処理の一部として、使用不可になったROWIDはキュー・システムによって自動的に修正されるため、このメッセージは無視して構いません。ただし、インポート時に別の問題が発生した場合(ロールバック・セグメント領域の不足など)は、ユーザーが問題を修正してインポートを繰り返す必要があります。
エクスポート・モード
エクスポートの操作モードには、全データベース・モード、ユーザー・モードおよび表モードがあります。キュー表の増分エクスポートはサポートされていません。
全データベース・モードでは、キュー表、すべての関連表、システム・レベルの権限付与およびプライマリ・オブジェクトとセカンダリ・オブジェクトの権限付与が自動的にエクスポートされます。
ユーザー・モードでは、キュー表、すべての関連表およびプライマリ・オブジェクトの権限付与が自動的にエクスポートされます。ただし、FROMUSER
TOUSER
句を使用したあるスキーマから別のスキーマへのユーザー・レベルのエクスポートはサポートされていません。
表モードでは、キュー表、すべての関連表およびプライマリ・オブジェクトの権限付与が自動的にエクスポートされます。たとえば、AQマルチ・コンシューマ・キュー表をエクスポートすると、次の表が自動的にエクスポートされます。
-
AQ$
_queue_table
_I
(デキューIOT) -
AQ$_
queue_table
_T
(時間管理IOT) -
AQ$_queue_table_S
(サブスクライバ表) -
AQ$_
queue_table
_H
(履歴IOT)
トランザクション・イベント・キューの場合、次の表が自動的にエクスポートされます。
-
queue_table
-
AQ$_queue_name_L
(デキュー表) -
AQ$_queue_name_T
(時間管理表) -
AQ$_queue_name
(例外マップ表) -
AQ$_queue_name_V
(評価コンテキスト) -
queue_name_R
(ルール・セット)
キュー表データのインポート
エクスポートと同様に、キューをインポートすると、必ず基になるキュー表および関連するディクショナリ・データもインポートされます。キュー表データがインポートされると、インポート・ユーティリティがダンプ・ファイルのPL/SQL無名ブロックを実行して、メタデータをデータ・ディクショナリに書き込みます。
複数の受信者がいるキュー表のインポート
複数の受信者をサポートするAQキュー表は、次の表に関連付けられます。
-
デキューIOT
-
時間管理IOT
-
サブスクライバ表
-
履歴IOT
トランザクション・イベント・キューは、次のオブジェクトに関連付けられます。
-
キュー表
-
デキュー・ログ表
-
時間管理表
-
オプションの例外キュー・マップ表
-
前述の表の索引
-
順序
-
ルール・セットおよび評価コンテキスト
これらのオブジェクトは、キュー表自体とともにインポートする必要があります。
インポートIGNOREパラメータ
すでにデータが含まれているキュー表には、キュー・データをインポートしないでください。キュー表をインポートする場合は、インポート・ユーティリティのIGNORE
パラメータを必ずNO
に設定する必要があります。IGNORE
パラメータがYES
に設定されており、すでに存在しているキュー表がダンプ・ファイル中の表定義と互換性がある場合は、ダンプ・ファイルの各行がそのキュー表にロードされます。それと同時に、古いキュー表定義が失われ、再作成されます。インポート前のキュー表定義は失われ、複製された行がキュー表に現れます。
データ・ポンプ・エクスポートとデータ・ポンプ・インポート
データ・ポンプでは、キュー表の置換モードとスキップ・モードがサポートされています。
置換モードでは、既存のキュー表が削除され、エクスポート・ダンプ・ファイルの新規キュー表に置き換えられます。スキップ・モードでは、既存のキュー表はインポートされません。
キュー表のTRUNCATEモードおよびAPPENDモードはサポートされていません。この場合の動作は置換モードと同様です。
関連項目:
データ・ポンプ・エクスポートおよびデータ・ポンプ・インポートの詳細は、『Oracle Databaseユーティリティ』を参照してください。
Oracle Enterprise ManagerでのAQキューのサポート
Oracle Enterprise Managerでは、Oracle Database Advanced Queuingの大抵の管理機能がサポートされています。Oracle Database Advanced Queuingの機能は、Enterprise Managerコンソールのナビゲーション・ツリーの分散ノードに配置されています。
Oracle Enterprise Managerで使用可能な機能は次のとおりです。
-
スキーマ・マネージャに含まれるキュー項目を使用した各種プロパティの参照
-
キューの作成、開始、停止および削除
-
伝播のスケジューリングおよびスケジュール解除
-
サブスクライバの追加および削除
-
データベースのすべてのキューに対する伝播スケジュールの表示
-
データベースのすべてのキューに対するエラーの表示
-
メッセージ・キューの表示
-
権限の付与および取消し
-
変換の作成、変更または削除
Oracle Database Advanced QueuingとXAの併用
Oracle Database Advanced Queuing OCIインタフェースを使用する場合は、xa_open
文字列で「Objects=T
」を指定する必要があります。これは、オブジェクト・モードで、XAにクライアント側キャッシュを初期化させます。OCIまたはPro*Cから、PL/SQLラッパーを介してOracle Database Advanced Queuingを使用する場合、この処理は必要ありません。
Pro*ドキュメントのラージ・オブジェクト(LOB)メモリー管理の概念は、Oracle Database Advanced Queuing RAWメッセージと関連性はありませんが、これはOracle Database Advanced Queuingが単純なRAWバッファ抽象を提供するためです(ただし、これらはLOBとして格納されます)。
サービス間(xa_start
境界とxa_end
境界の間など)でデキュー処理を続ける場合に、Oracle Database 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
であることを示します。
キュー表または関連IOTに対するDMLの未サポート
Oracle Database Advanced Queuingでは、キュー表または関連索引構成表(IOT)に対するデータ操作言語(DML)はサポートされていません。
キュー表を修正するためにサポートされている唯一の手段は、提供されているAPIを使用することです。キュー表やIOTは、DML (データ操作言語)操作を行うと一貫性がなくなり、実質的に破損する可能性があります。
REFペイロード属性を持つオブジェクト・キューからの伝播
Oracle Database 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 Database Advanced Queuing PL/SQLコールはありません。
シノニムの作成は可能ですが、Oracle Database Advanced Queuingインタフェースに適用することは避けてください。
オブジェクト型におけるシノニム
オブジェクト型のシノニムを作成している場合、それをDBMS_AQADM.CREATE_QUEUE_TABLE
で使用することはできません。エラーORA-24015が発生します。
表領域のPoint-in-Timeリカバリ
現在は、Oracle Database Advanced Queuingでは、表領域のPoint-in-Timeリカバリはサポートされていません。
キュー表が表領域に作成されると、Point-in-Timeリカバリは使用できません。Oracle Database Advanced Queuingは、通常のPoint-in-Timeリカバリをサポートしています。
仮想プライベート・データベース
Oracle Database Advanced Queuingのキュー表でセキュリティ・ポリシーを指定することで、仮想プライベート・データベースとともにOracle Database Advanced Queuingを使用できます。
デキュー中に、適用するポリシーのデキュー条件(deq_cond
)または相関識別子を使用します。デキュー条件として「1=1」を使用できます。デキュー条件または相関識別子を使用しないとデキューでエラーが発生します。
ノート:
デキュー条件または相関識別子を使用すると、メッセージのデキュー順序が不定になり、キューのソート順序は考慮されません。
伝播の管理
次のトピックでは、Oracle Database Advanced Queuingの伝播の管理について説明します。
ノート:
伝播が正常に動作するために、キュー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
ビューにレポートされます。
スケジュールでエラーが発生した場合、そのスケジュール内のメッセージの伝播は、再試行間隔(失敗数に応じて異なる)の後に再度試行されます。再試行の回数がシステムで定義された最大数を超えると、そのスケジュールは無効になります。
エラーの原因になっていた問題が解決し、スケジュールが有効化されても、最終エラーの発生した日付、時刻およびメッセージを示すエラー・フィールドに、そのエラー情報が残ります。このフィールドがリセットされるのは、そのスケジュールによってメッセージが正常に伝播されたときです。