TimesTenのXLAの概要
XLAの基本
TimesTen XLAによって更新レコードがトランザクション・ログ・バッファまたはトランザクション・ログ・ファイルから直接取得されるため、それらの更新レコードは、必要とされるかぎり使用可能です。また、ロギング・モデルによって、複数のリーダーでトランザクション・ログの更新を同時に読み取ることができます。
ttXlaPersistOpen
XLA関数は、でデータベースへの接続をオープンします。
TimesTenは、初期作成時に、アプリケーションがリンクされているTimesTenリリースと同じバージョンに、トランザクション・ログ・ハンドルを構成します。
どのようにXLAでトランザクション・ログからレコードが読み取られるか
アプリケーションによってデータベースが変更されると、TimesTenは、データの変更およびトランザクション・コミットなどの他のイベントを示すトランザクション・ログ・レコードを生成します。新しいトランザクション・ログ・レコードは、生成されると常にログ・バッファの最後に書き込まれます。
トランザクション・ログ・レコードは、メモリー内のログ・バッファからファイル・システム上のトランザクション・ログ・ファイルに定期的に一括でフラッシュされます。XLAが初期化されている場合、XLAアプリケーションでは、トランザクション・ログのどの部分がファイル・システムまたはメモリーに存在するかについて考慮する必要はありません。したがって、この章で使用するトランザクション・ログという用語は、トランザクション更新レコードの仮想ソースを指し、これらのレコードが物理的にメモリーまたはファイル・システムに存在するかどうかは関係ありません。
アプリケーションで、XLAを使用し、データベースへの変更に関してトランザクション・ログを監視できます。XLAは、トランザクション・ログ全体を読み取り、ログ・レコードをフィルタ処理し、目的の表および列への変更が含まれているトランザクション・レコードのリストをXLAアプリケーションに配信します。
XLAは、レコードをディスクリート・トランザクションにソートします。複数のアプリケーションが同時にデータベースを更新している場合、異なるアプリケーションのトランザクション・ログ・レコードがトランザクション・ログに交互配置されます。
XLAは、特定のトランザクションに関連するすべてのトランザクション・ログ・レコードを透過的に抽出し、それらを連続するリストにしてアプリケーションに配信します。
コミット済のトランザクションのレコードのみが返されます。コミット済のレコードは、最後のコミット・レコードがトランザクション・ログに書き込まれる順序で返されます。コミットされていないデータベースへの変更に関連するレコードは、XLAによってフィルタ処理されます。
変更を加え、その後にロール・バックした場合、XLAでは、取り消されたトランザクションのレコードはアプリケーションに配信されません。
これらのXLAの基本概念のほぼすべてを次の例で示し、次にそれぞれの内容を箇条書きで示します。
図5-1に示すトランザクション・ログを例として考えてみます。
この例では、トランザクション・ログに次のレコードが含まれています。
CT1
- アプリケーションC
は、表W
の行1を値7.7で更新。BT1
- アプリケーションB
は、表X
の行3を値2で更新。CT2
- アプリケーションC
は、表W
の行9を値5.6で更新。BT2
- アプリケーションB
は、表Y
の行2を値XYZで更新。AT1
- アプリケーションA
は、表Z
の行1を値3で更新。AT2
- アプリケーションA
は、表Z
の行3を値4で更新。BT3
- アプリケーションB
がトランザクションをコミット。AT3
- アプリケーションA
がトランザクションをロールバック。CT3
- アプリケーションC
がトランザクションをコミット。
表W
、Y
およびZ
への変更を検出するように設定されているXLAアプリケーションでは次のようになります。
BT2
およびBT3
- 表Y
の行2を値XYZで更新し、コミット。CT1
- 表W
の行1を値7.7で更新。CT2
およびCT3
- 表W
の行9を値5.6で更新し、コミット。
この例では、次のことが示されています。
-
アプリケーション
B
およびC
のすべてのトランザクション・レコードが同時に書き込まれます。 -
トランザクション・ログでは、アプリケーション
C
のレコードがアプリケーションB
のレコードより前に書き込まれますが、アプリケーションB
のコミット(BT3
)はアプリケーションC
のコミット(CT3
)より前に書き込まれます。その結果、アプリケーションB
のレコードはアプリケーションC
のレコードより先にXLAアプリケーションに返されます。 -
XLAは表
X
への変更を検出するように設定されていないため、アプリケーションB
による表X
への更新(BT1
)は示されません。 -
アプリケーション
A
による表Z
への更新(AT1
およびAT2
)が示されないのは、コミットされずにロールバックされたためです(AT3
)。
XLAおよびマテリアライズド・ビューについて
XLAを使用すると、表およびマテリアライズド・ビューの両方への変更を追跡できます。
マテリアライズド・ビューによって、複数のディテール表内の選択した行および列への変更を追跡できる単一のソースが提供されます。マテリアライズド・ビューがない場合は、XLAアプリケーションで、すべてのディテール表の更新レコード(アプリケーションにとって重要ではない行および列への更新が反映されているレコードを含む)に対して監視およびフィルタ処理を行う必要があります。
一般に、表またはマテリアライズド・ビューへの変更を追跡するために使用するXLAメカニズムの間に処理上の違いはありません。
マテリアライズド・ビューの詳細は、次を参照してください。
-
『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE MATERIALIZED VIEW
-
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のマテリアライズド・ビューの理解
XLAブックマークについて
各XLAリーダーは、XLAブックマークを使用してログ更新ストリーム内でのその位置を維持します。
内容は次のとおりです。
XLAログ・レコード識別子
各ブックマークは、ログ・レコード識別子を使用することでトランザクション・ログ内の更新レコードを追跡する、2つのポインタからなります。
-
初期読取りログ・レコード識別子は、最後に確認されたトランザクション・ログ・レコードを指します。初期読取りログ・レコード識別子はデータベースに保存されるため、データベースの接続、停止および障害が発生しても永続的に維持されます。
-
現行読取りログ・レコード識別子は、トランザクション・ログから現在読み取られているレコードを指します。
ブックマークの作成または再利用
ttXlaPersistOpen
関数をコールしてXLAハンドルを初期化する場合は、tag
パラメータを使用して新しいブックマーク、またはシステム内の既存のブックマークを指定し、options
パラメータを使用して、そのブックマークが新しいレプリケートされていないブックマークなのか、新しいレプリケートされたブックマークなのか、既存(再利用)のブックマークなのかを指定します。
「ttXlaPersistOpen」と「XLAの初期化およびXLAハンドルの取得」を参照してください。
この時点で、ブックマークに関連付けられている初期読取りログ・レコード識別子は、データベースから読み取られ、XLAハンドル(ttXlaHandle_h
)にキャッシュされます。この識別子は、トランザクション・ログ内のリーダーの開始位置を示します。
『Oracle TimesTen In-Memory Databaseリファレンス』のttLogHoldsを参照してください。TimesTen組込みプロシージャは、トランザクション・ログの保留に関する情報を返します。
ブックマークのしくみ
アプリケーションで最初にXLAが初期化されXLAハンドルが取得された時点では、その現行読取りログ・レコード識別子と初期読取りログ・レコード識別子は、両方とも、データベースに最後に書き込まれたレコードを指しています。
ttXlaNextUpdate
関数またはttXlaNextUpdateWait
関数を使用すると、コミット済トランザクションの一連のレコードが、コミットされた順序でトランザクション・ログから返されます(「トランザクション・ログからの更新レコードの取得」を参照)。図5-3に示すように、ttXlaNextUpdate
をコールするたびに、ブックマークの現行読取りログ・レコード識別子は、最後に読み取られたレコードに再設定されます。現行読取りログ・レコード識別子によって、次にttXlaNextUpdate
をコールする場合の開始位置がマークされます。
ttXlaGetLSN
関数およびttXlaSetLSN
関数を使用すると、レコードを再度読み取ることができます(「ブックマークの位置の変更」を参照)。ただし、図5-4に示すように、tttXlaAcknowledge
関数をコールすると、ブックマークの初期読取りログ・レコード識別子が現行読取りログ・レコード識別子に永続的に再設定されます。ttXlaAcknowledge
関数をコールして初期読取りログ・レコード識別子を再設定すると、以前に読み取られたすべてのトランザクション・レコードにパージのフラグが設定されます。初期読取りログ・レコード識別子を再設定すると、ttXlaSetLSN
関数を使用して元に戻し、以前に読み取ったトランザクションを再度読み取ることはできません。
ノート:
ttXlaAcknowledge
をコールすると、確認する関連更新レコードがない場合でもブックマークが再設定されます。これは、トランザクション・ログ領域の管理に役立ちますが、処理コストとのバランスを保つ必要があります。XLAでは、トランザクション・ログが一度に1ファイルずつパージされる点に注意してください。この処理のしくみの詳細は、「ttXlaAcknowledge」を参照してください。
データベースで作成されるブックマークの数は64に制限されています。各ブックマークに一度に関連付けることができるアクティブな接続は1つのみです。ただし、ブックマークは、存続期間中に多数の接続と関連付けることができます。アプリケーションによって、接続をオープンし、新しいブックマークを作成し、そのブックマークを接続と関連付け、ブックマークを使用してレコードを読み取り、接続をデータベースから切断し、データベースに再接続して、新しい接続を作成し、この新しい接続を既存のブックマークと関連付け、以前の接続が停止されたトランザクション・ログ・レコードから読取りを続行することができます。
レプリケートされたブックマーク
アクティブ・スタンバイ・ペアのレプリケーション・スキームを使用する場合は、ttXlaPersistOpen
コールのoptions
の設定に従ってレプリケートされたブックマークを使用することもできます。
「ttXlaPersistOpen」を参照してください。
レプリケートされたブックマークの場合、ブックマークに対する処理は必要に応じてスタンバイ・データベースにレプリケートされます。これにより、フェイルオーバーが発生した場合、より効率的にブックマークの位置をリカバリできます。読取りは、新しいアクティブ・ストアへのスイッチオーバー前に読取りが中断された位置に近いXLAレコードのストリームから再開されます。レプリケートされたブックマークがない場合、古いアクティブ・ストアに返されている多数の重複レコードを読み取る必要があります。
レプリケートされたブックマークを使用するには、次の順序で手順を実行します。
- アクティブ・スタンバイ・ペアのレプリケーション・スキームを作成します。(これは、
create active standby pair
操作、またはクラスタウェア管理環境のttCWAdmin -create
コマンドによって行われます。) - ブックマークを作成します。
- ブックマークをサブスクライブします。
- アクティブ・スタンバイ・ペアを起動します(このとき、スタンバイへの複製が発生し、レプリケーションが始まります)。(これは
ttRepAdmin -duplicate
コマンド、またはクラスタウェア管理環境のttCWAdmin -start
コマンドによって行われます。)
次の使用上のノートに注意してください。
-
スタンバイ・データベースでのブックマークの位置は、アクティブ・データベースでのブックマークの位置に非常に近くなります。ただし、確認処理のレプリケーションは非同期に行われるため、確認処理の実行頻度によっては、フェイルオーバーの発生時に更新の重複を示す小さなウィンドウが表示されることがあります。
-
データベースがスタンバイ・ステータスからアクティブ・ステータスに変わった後に、
ttXlaClose
関数とttXlaPersistOpen
関数を使用して、そのデータベース上のすべてのブックマークを閉じ、再度開く必要があります。ブックマークは、レプリケーション・エージェントによってスタンバイ・データベース上で必要に応じて自動的に再配置されるため、スタンバイ・データベース上のレプリケートされたブックマークの状態は、XLA処理の間に変化します。データベースがアクティブ・ステータスに変更される前に開いていたブックマークを使用しようとすると、ブックマークの状態がリセットされたこととブックマークが再配置されたことを示すエラーが表示されます。この場合でも再配置されたブックマークから読取りを続行できますが、ブックマークを閉じて再度開くと、エラーを回避できます。 -
レプリケートされたブックマークが存在する間に、アクティブ・スタンバイ・ペアのスキームを削除できます。ブックマークは当然その時点でレプリケートされなくなりますが、削除はされません。続けてアクティブ・スタンバイ・ペア・スキームを再び有効にすると、これらのブックマークは自動的にスキームに追加されます。
-
レプリケーション・エージェントの実行中は、レプリケートされたブックマークを削除できません。
-
アクティブ・データベース内のレプリケートされたブックマークのみを読み取って確認できます。レプリケートされたブックマークを確認するたびに、確認処理がスタンバイ・データベースに非同期にレプリケートされます。
XLAブックマークおよびトランザクション・ログの保持
XLAが使用されている場合、TimesTenのトランザクション・ログ・ファイルは、XLAブックマークが進むまで保留されます。
保留によって、XLAで必要でないことが確認されるまで、トランザクション・ログ・ファイルはパージされません。XLAアプリケーションが予期せず終了したり、そのブックマークの削除や変更トラッキングの無効化を行わずに切断した場合などに、ブックマークが固まってしまうと、ログは保持されたままになり、トランザクション・ログ・ファイルが過度に蓄積される場合があります。この蓄積により、ファイル・システム領域が一杯になる場合があります。
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のトランザクション・ログ・ファイルの蓄積の監視を参照してください。
XLAデータ型
内部SQLデータ型と、リリース7.0より前およびリリース7.0以上のXLAデータ型との間のマッピングを示します。
『Oracle TimesTen In-Memory Database SQLリファレンス』のデータ型を参照してください。
表5-1 XLAデータ型のマッピング
内部SQLデータ型 | XLAデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
XLAでは、内部SQLデータ型と外部プログラム・データ型を変換する関数が提供されます。たとえば、ttXlaNumberToCString
を使用すると、NUMBER
列を文字列に変換できます。TimesTenは、次のXLAデータ型変換関数を備えています。
XLAシステム権限
XLAユーザーには、XLAシステム権限が必要です。
-
次のようなXLA機能の実行には、システム権限
XLA
が必要です。 -
XLA
権限を持つユーザーには、SELECT ANY TABLE
、SELECT ANY VIEW
およびSELECT ANY SEQUENCE
システム権限と同等の権限があり、データベースで発生するDDL文レコードを取得できます。その結果、このユーザーは、アクセスが許可されていないデータベース・オブジェクトについて情報を取得できる点に注意してください。
XLAの制限事項
この項では、TimesTenでのXLAの制限事項を示します。
-
XLAは、TimesTenでサポートされているすべてのプラットフォームで使用できます。ただし、XLAでは異なるプラットフォーム間でのデータ転送はサポートされていません。
-
XLAでのLOBのサポートは限定的です。「更新を監視する表の指定」を参照してください。
-
XLAでは、汎用ドライバ・マネージャ・ライブラリとリンクされたアプリケーション、またはクライアント/サーバー・ライブラリと直接リンクされたアプリケーションはサポートされていません。(XLAでは、直接ドライバ・ライブラリと直接リンクされたアプリケーション、または直接接続するためにTimesTenドライバ・マネージャとリンクされたアプリケーションはサポートされています。)
-
XLAリーダーは、インメモリー列ベースの圧縮を使用する表をサブスクライブできません。
-
Oracle Databaseに対する変更トラッキング・トリガーでは、自動リフレッシュ・キャッシュ・グループについては、列レベルでの解決は行われません。(これには非常に費用がかかります。)そのため、自動リフレッシュ機能では、実際にはすべての列のデータが変更されていない場合でも、行のすべての列が更新され、XLAではすべての列が変更されたということのみがレポートされます。
XLAサンプル・アプリケーションについて
TimesTen Classicクイック・スタートには、この章で説明する多数のXLA関数の使用方法を示すxlaSimple
サンプル・アプリケーションが用意されています。
「TimesTenクイック・スタートおよびサンプル・アプリケーションについて」を参照してください。
次の「XLAイベント・ハンドラ・アプリケーションの作成」の項で示すサンプル・コードなど、この章の大部分の内容は、このxlaSimple
アプリケーションに基づいています。このアプリケーションでは、表MYDATA
がAPPUSER
スキーマに作成されます。APPUSER
としてログインしている間は、その表を更新することになります。XLAUSER
としてログインしている間は、xlaSimple
アプリケーションが更新についてレポートします。
アプリケーションを実行するには、コマンド・プロンプトでxlaSimple
を実行します。XLAUSER
のパスワード(サンプル・データベースの作成時に指定したもの)を入力するように求められます。別のコマンド・プロンプトでttIsql
を開始して、APPUSER
としてTimesTenサンプル・データベースに接続します。APPUSER
のパスワード(同じくサンプル・データベースの作成時に指定したもの)を入力するように求められます。
ttIsql
コマンド・プロンプトで、DML文を入力して表を変更できます。その後、xlaSimple
ウィンドウでXLA出力を表示できます。