TimesTenのXLAの概要

TimesTen ClassicでXLAを使用する方法について説明します。

ここで説明するXLA関数については、XLAリファレンスを参照してください。

XLAの基本

TimesTen XLAによって更新レコードがトランザクション・ログ・バッファまたはトランザクション・ログ・ファイルから直接取得されるため、それらの更新レコードは、必要とされるかぎり使用可能です。また、ロギング・モデルによって、複数のリーダーでトランザクション・ログの更新を同時に読み取ることができます。

ttXlaPersistOpen XLA関数は、でデータベースへの接続をオープンします。

TimesTenは、初期作成時に、アプリケーションがリンクされているTimesTenリリースと同じバージョンに、トランザクション・ログ・ハンドルを構成します。

どのようにXLAでトランザクション・ログからレコードが読み取られるか

アプリケーションによってデータベースが変更されると、TimesTenは、データの変更およびトランザクション・コミットなどの他のイベントを示すトランザクション・ログ・レコードを生成します。新しいトランザクション・ログ・レコードは、生成されると常にログ・バッファの最後に書き込まれます。

トランザクション・ログ・レコードは、メモリー内のログ・バッファからファイル・システム上のトランザクション・ログ・ファイルに定期的に一括でフラッシュされます。XLAが初期化されている場合、XLAアプリケーションでは、トランザクション・ログのどの部分がファイル・システムまたはメモリーに存在するかについて考慮する必要はありません。したがって、この章で使用するトランザクション・ログという用語は、トランザクション更新レコードの仮想ソースを指し、これらのレコードが物理的にメモリーまたはファイル・システムに存在するかどうかは関係ありません。

アプリケーションで、XLAを使用し、データベースへの変更に関してトランザクション・ログを監視できます。XLAは、トランザクション・ログ全体を読み取り、ログ・レコードをフィルタ処理し、目的の表および列への変更が含まれているトランザクション・レコードのリストをXLAアプリケーションに配信します。

XLAは、レコードをディスクリート・トランザクションにソートします。複数のアプリケーションが同時にデータベースを更新している場合、異なるアプリケーションのトランザクション・ログ・レコードがトランザクション・ログに交互配置されます。

XLAは、特定のトランザクションに関連するすべてのトランザクション・ログ・レコードを透過的に抽出し、それらを連続するリストにしてアプリケーションに配信します。

コミット済のトランザクションのレコードのみが返されます。コミット済のレコードは、最後のコミット・レコードがトランザクション・ログに書き込まれる順序で返されます。コミットされていないデータベースへの変更に関連するレコードは、XLAによってフィルタ処理されます。

変更を加え、その後にロール・バックした場合、XLAでは、取り消されたトランザクションのレコードはアプリケーションに配信されません。

これらのXLAの基本概念のほぼすべてを次の例で示し、次にそれぞれの内容を箇条書きで示します。

図5-1に示すトランザクション・ログを例として考えてみます。

図5-1 トランザクション・ログから抽出されるレコード

図5-1の説明が続きます。
「図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がトランザクションをコミット。

WYおよび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メカニズムの間に処理上の違いはありません。

マテリアライズド・ビューの詳細は、次を参照してください。

XLAブックマークについて

各XLAリーダーは、XLAブックマークを使用してログ更新ストリーム内でのその位置を維持します。

内容は次のとおりです。

XLAログ・レコード識別子

各ブックマークは、ログ・レコード識別子を使用することでトランザクション・ログ内の更新レコードを追跡する、2つのポインタからなります。

  • 初期読取りログ・レコード識別子は、最後に確認されたトランザクション・ログ・レコードを指します。初期読取りログ・レコード識別子はデータベースに保存されるため、データベースの接続、停止および障害が発生しても永続的に維持されます。

  • 現行読取りログ・レコード識別子は、トランザクション・ログから現在読み取られているレコードを指します。

ブックマークの作成または再利用

ttXlaPersistOpen関数をコールしてXLAハンドルを初期化する場合は、tagパラメータを使用して新しいブックマーク、またはシステム内の既存のブックマークを指定し、optionsパラメータを使用して、そのブックマークが新しいレプリケートされていないブックマークなのか、新しいレプリケートされたブックマークなのか、既存(再利用)のブックマークなのかを指定します。

「ttXlaPersistOpen」「XLAの初期化およびXLAハンドルの取得」を参照してください。

この時点で、ブックマークに関連付けられている初期読取りログ・レコード識別子は、データベースから読み取られ、XLAハンドル(ttXlaHandle_h)にキャッシュされます。この識別子は、トランザクション・ログ内のリーダーの開始位置を示します。

『Oracle TimesTen In-Memory Databaseリファレンス』ttLogHoldsを参照してください。TimesTen組込みプロシージャは、トランザクション・ログの保留に関する情報を返します。

ブックマークのしくみ

アプリケーションで最初にXLAが初期化されXLAハンドルが取得された時点では、その現行読取りログ・レコード識別子と初期読取りログ・レコード識別子は、両方とも、データベースに最後に書き込まれたレコードを指しています。

図5-2 XLAハンドルを初期化した時点でのログ・レコード識別子の位置

図5-2の説明が続きます。
「図5-2 XLAハンドルを初期化した時点でのログ・レコード識別子の位置」の説明

ttXlaNextUpdate関数またはttXlaNextUpdateWait関数を使用すると、コミット済トランザクションの一連のレコードが、コミットされた順序でトランザクション・ログから返されます(「トランザクション・ログからの更新レコードの取得」を参照)。図5-3に示すように、ttXlaNextUpdateをコールするたびに、ブックマークの現行読取りログ・レコード識別子は、最後に読み取られたレコードに再設定されます。現行読取りログ・レコード識別子によって、次にttXlaNextUpdateをコールする場合の開始位置がマークされます。

図5-3 ttXlaNextUpdateによって取得されるレコード

図5-3の説明が続きます。
「図5-3 ttXlaNextUpdateによって取得されるレコード」の説明

ttXlaGetLSN関数およびttXlaSetLSN関数を使用すると、レコードを再度読み取ることができます(「ブックマークの位置の変更」を参照)。ただし、図5-4に示すように、tttXlaAcknowledge関数をコールすると、ブックマークの初期読取りログ・レコード識別子が現行読取りログ・レコード識別子に永続的に再設定されます。ttXlaAcknowledge関数をコールして初期読取りログ・レコード識別子を再設定すると、以前に読み取られたすべてのトランザクション・レコードにパージのフラグが設定されます。初期読取りログ・レコード識別子を再設定すると、ttXlaSetLSN関数を使用して元に戻し、以前に読み取ったトランザクションを再度読み取ることはできません。

図5-4 ttXlaAcknowledgeによるブックマークの再設定

図5-4の説明が続きます。
「図5-4 ttXlaAcknowledgeによるブックマークの再設定」の説明

ノート:

ttXlaAcknowledgeをコールすると、確認する関連更新レコードがない場合でもブックマークが再設定されます。これは、トランザクション・ログ領域の管理に役立ちますが、処理コストとのバランスを保つ必要があります。XLAでは、トランザクション・ログが一度に1ファイルずつパージされる点に注意してください。この処理のしくみの詳細は、「ttXlaAcknowledge」を参照してください。

データベースで作成されるブックマークの数は64に制限されています。各ブックマークに一度に関連付けることができるアクティブな接続は1つのみです。ただし、ブックマークは、存続期間中に多数の接続と関連付けることができます。アプリケーションによって、接続をオープンし、新しいブックマークを作成し、そのブックマークを接続と関連付け、ブックマークを使用してレコードを読み取り、接続をデータベースから切断し、データベースに再接続して、新しい接続を作成し、この新しい接続を既存のブックマークと関連付け、以前の接続が停止されたトランザクション・ログ・レコードから読取りを続行することができます。

レプリケートされたブックマーク

アクティブ・スタンバイ・ペアのレプリケーション・スキームを使用する場合は、ttXlaPersistOpenコールのoptionsの設定に従ってレプリケートされたブックマークを使用することもできます。

「ttXlaPersistOpen」を参照してください。

レプリケートされたブックマークの場合、ブックマークに対する処理は必要に応じてスタンバイ・データベースにレプリケートされます。これにより、フェイルオーバーが発生した場合、より効率的にブックマークの位置をリカバリできます。読取りは、新しいアクティブ・ストアへのスイッチオーバー前に読取りが中断された位置に近いXLAレコードのストリームから再開されます。レプリケートされたブックマークがない場合、古いアクティブ・ストアに返されている多数の重複レコードを読み取る必要があります。

レプリケートされたブックマークを使用するには、次の順序で手順を実行します。

  1. アクティブ・スタンバイ・ペアのレプリケーション・スキームを作成します。(これは、create active standby pair操作、またはクラスタウェア管理環境のttCWAdmin -createコマンドによって行われます。)
  2. ブックマークを作成します。
  3. ブックマークをサブスクライブします。
  4. アクティブ・スタンバイ・ペアを起動します(このとき、スタンバイへの複製が発生し、レプリケーションが始まります)。(これは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データ型

TT_CHAR

TTXLA_CHAR_TT

TT_VARCHAR

TTXLA_VARCHAR_TT

TT_NCHAR

TTXLA_NCHAR_TT

TT_NVARCHAR

TTXLA_NVARCHAR_TT

CHAR

TTXLA_CHAR

NCHAR

TTXLA_NCHAR

VARCHAR2

TTXLA_VARCHAR

NVARCHAR2

TTXLA_NVARCHAR

TT_TINYINT

TTXLA_TINYINT

TT_SMALLINT

TTXLA_SMALLINT

TT_INTEGER

TTXLA_INTEGER

TT_BIGINT

TTXLA_BIGINT

BINARY_FLOAT

TTXLA_BINARY_FLOAT

BINARY_DOUBLE

TTXLA_BINARY_DOUBLE

NUMBER

TTXLA_NUMBER

NUMBER(p,s)

TTXLA_NUMBER

FLOAT

TTXLA_NUMBER

TT_TIME

TTXLA_TIME

TT_DATE

TTXLA_DATE_TT

TT_TIMESTAMP

TTXLA_TIMESTAMP_TT

DATE

TTXLA_DATE

TIMESTAMP

TTXLA_TIMESTAMP

TT_BINARY

TTXLA_BINARY

TT_VARBINARY

TTXLA_VARBINARY

ROWID

TTXLA_ROWID

BLOB

TTXLA_BLOB

CLOB

TTXLA_CLOB

NCLOB

TTXLA_NCLOB

XLAでは、内部SQLデータ型と外部プログラム・データ型を変換する関数が提供されます。たとえば、ttXlaNumberToCStringを使用すると、NUMBER列を文字列に変換できます。TimesTenは、次のXLAデータ型変換関数を備えています。

XLAシステム権限

XLAユーザーには、XLAシステム権限が必要です。

  • 次のようなXLA機能の実行には、システム権限XLAが必要です。

    • ttXlaPersistOpen C関数を使用するなど、XLAリーダーとしてのTimesTenへの接続(CREATE SESSION権限も必要)

    • その他のXLA関連のTimesTen C関数の実行(XLAリファレンスを参照)

    • XLA関連のTimesTen組込みプロシージャの実行

      プロシージャttXlaBookmarkCreatettXlaBookmarkDeletettXlaSubscribeおよびttXlaUnsubscribeについては、『Oracle TimesTen In-Memory Databaseリファレンス』組込みプロシージャを参照してください。

  • XLA権限を持つユーザーには、SELECT ANY TABLESELECT 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アプリケーションに基づいています。このアプリケーションでは、表MYDATAAPPUSERスキーマに作成されます。APPUSERとしてログインしている間は、その表を更新することになります。XLAUSERとしてログインしている間は、xlaSimpleアプリケーションが更新についてレポートします。

アプリケーションを実行するには、コマンド・プロンプトでxlaSimpleを実行します。XLAUSERのパスワード(サンプル・データベースの作成時に指定したもの)を入力するように求められます。別のコマンド・プロンプトでttIsqlを開始して、APPUSERとしてTimesTenサンプル・データベースに接続します。APPUSERのパスワード(同じくサンプル・データベースの作成時に指定したもの)を入力するように求められます。

ttIsqlコマンド・プロンプトで、DML文を入力して表を変更できます。その後、xlaSimpleウィンドウでXLA出力を表示できます。