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