【文献】
熊倉克己,レプリケーションによる分散データベースの構築,SQL SERVER magazine,日本,株式会社翔泳社,2004年 2月15日,第13号,58−66ページ
【文献】
Oracle GoldenGate Administration Guide Version 10.4,ORACLE Corporation,2009年10月,p.13-16,333-337,URL,https://docs.oracle.com/cd/E15881_01/doc.104/gg_wux_admin_v104.pdf
(58)【調査した分野】(Int.Cl.,DB名)
バイナリログファイルを使用するMySQLデータベースまたはシステムと、他の種類のデータベースまたはシステムとの間でデータを転送するために、ログベースレプリケーションを使用するシステムであって、
ベンダーアクセスモジュールを備え、前記ベンダーアクセスモジュールは、
MySQLデータベースまたはシステムによってバイナリログファイルに記録されるバイナリログイベントのうち、前記MySQLデータベースまたはシステムが記録したヘッダを参照して、予め定められた種類のバイナリログイベントのサブセットのみを特定し、
前記特定したバイナリログイベントのサブセットのバイナリログデータをデータレコードに変換し、
変換されたデータレコードをレコードキューに保持し、
前記レコードキューに保持されたデータレコードを処理するとともに、処理されたデータを含むトレールファイルを生成するために、extractプロセスとやり取りするように構成され、前記処理されたデータは非MySQLデータベースまたはシステムへの適用に使用される、システム。
前記extractプロセスはOracle(登録商標)GoldenGateextractプロセスであり、前記トレールファイルはOracleGoldenGateトレールファイルである、請求項1または2に記載のシステム。
前記ベンダーアクセスモジュールは、extractプロセスが特定のトランザクション用にデータレコードを検索するためにAPIを提供する、請求項1〜3のいずれか1項に記載のシステム。
前記ベンダーアクセスモジュールは、ログインデックスファイルを用いて、複数のバイナリログファイルから使用するべき現行のバイナリログファイル、およびその状態を判断する、請求項1〜5のいずれか1項に記載のシステム。
前記ベンダーアクセスモジュールは、前記バイナリログファイルに記録されているEOFを検出し、次のバイナリログファイルを探索する、請求項1〜7のいずれか1項に記載のシステム。
バイナリログファイルを使用するMySQLデータベースまたはシステムと、他の種類のデータベースまたはシステムとの間でデータを転送するためにログベースレプリケーションを用いる方法であって、
ベンダーアクセスモジュールを設けるステップを備え、前記ベンダーアクセスモジュールは、
MySQLデータベースまたはシステムによってバイナリログファイルに記録されるバイナリログイベントのうち、前記MySQLデータベースまたはシステムが記録したヘッダを参照して、予め定められた種類のバイナリログイベントのサブセットのみを特定し、
前記特定したバイナリログイベントのサブセットのバイナリログデータをデータレコードに変換し、
変換されたデータレコードをレコードキューに保持し、
前記レコードキューに保持されたデータレコードを処理するとともに、処理されたデータを含むトレールファイルを生成するために、extractプロセスとやり取りするように構成され、前記処理されたデータは非MySQLデータベースまたはシステムへの適用に使用される、方法。
前記extractプロセスはOracle(登録商標)GoldenGateextractプロセスであり、前記トレールファイルはOracleGoldenGateトレールファイルである、請求項9または10に記載の方法。
前記ベンダーアクセスモジュールは、extractプロセスが特定のトランザクション用にデータレコードを検索するためにAPIを設ける、請求項9〜11のいずれか1項に記載の方法。
前記ベンダーアクセスモジュールは、ログインデックスファイルを用いて、複数のバイナリログファイルから使用するべき現行のバイナリログファイル、およびその状態を判断する、請求項9〜13のいずれか1項に記載の方法。
前記ベンダーアクセスモジュールは、前記バイナリログファイルに記録されているEOFを検出し、次のバイナリログファイルを探索する、請求項9〜15のいずれか1項に記載の方法。
【発明を実施するための形態】
【0010】
詳細な説明:
異種システムの間でデータを転送するためのシステムおよび方法が記載され、特にログベースレプリケーションを用いて、たとえばMySQLデータベースまたはシステムと、他の種類のデータベースまたはシステムとの間でデータを転送する。一実施例に従うと、システムを用いてソースデータベースシステムからターゲットデータベースシステムへのMySQLデータの1回限りのコピーまたは最初のコピーを行ない、および/またはMySQLデータベースのバイナリログからキャプチャされた進行中のトランザクションを、連続した態様で1つ以上の非MySQLデータベースにレプリケートし、2つのシステムは対象トランザクションのために同期化される。一実施例に従うと、すべてのもしくは部分的データ変更は、MySQLバイナリログから抽出でき、任意に変換、スキップまたは拡大され、ファイルに出力または書込まれ(一実施例に従うと、トレールファイル、またはOracle(登録商標) GoldenGateトレールファイルとして実施でき)、次に1つ以上のターゲットシステム(たとえば別のMySQLデータベース、または非MySQLデータベース)で与えることができ、それによりソースおよびターゲットのシステムを同期させる。本発明のさまざまな実施例の利点は以下を含む:
1.ログベースレプリケーションは、MySQLデータベースシステムと非MySQLデータベースシステムとの間のトランザクションレプリケーションについて、非常に低いレイテンシを可能にする。トランザクションがMySQLシステムにコミットされてから非MySQLシステムにレプリケーションされるまでの一般的に予想される時間は数秒以下である。
【0011】
2.MySQLシステムのオーバーヘッドは、従来の方法と比べて著しく低い。なぜなら、変更はログからキャプチャされるのであって、MySQLシステムのデータページではないからである。ネットワーク上で転送されるバイトの数も著しく低い。
【0012】
3.アプリケーションテーブルは、SQLまたは他のSQLを組込んだプログラミング言語(またはSQL様言語)を介してクエリーされない。それにより、レプリケーションは非侵襲性のものとなる。
【0013】
4.本システムは第3のゲートウェイプロダクトの使用を必要とせず、ネットワークまたはシステムの障害の場合、およびデータサイト全体に影響を及ぼすほとんどの障害に対しても、トランザクションの配信を保証することができる。
【0014】
5.オペレーショナルレポーティングアプリケーションを用いて、MySQLデータベースにアクセスすることなく、リアルタイムベースで非MySQLデータベースからデータを得ることができる。
【0015】
6.本システムは、MySQLデータベースで実行されるアプリケーションの非MySQLデータベースへの移行をほぼゼロに近いダウンタイムで可能にし、さらにMySQLデータベースからのトランザクションが、ほぼリアルタイム(またはアクティブ)データウェハウス用に、データベースマシンで使われることを可能にする。
【0016】
7.本システムはログベース変更データキャプチャ(CDC)を可能にし、他のシステムへのスケーリングを求めているがアプリケーションの停止を受入れることができないMySQLベースの組織が、2つのシステムを同期して維持し、十分なテストを行ない、ダウンタイムを発生することなく、自己のMySQLシステムを他のシステムに最終的に移行することを可能にする。現在、MySQLデータベースからのリアルタイム操作は、リアルタイムベースで企業データウェハウスとの統合は一般になされていない。一実施例に従うと、該方法は企業がMySQLシステムからデータを得る方法を提供する。
【0017】
一実施例に従うと、システムはMySQLのバイナリログフィーチャを用いてデータをキャプチャする。MySQLバイナリログはデータをたとえばDML操作で変更するステートメントデータを含む。ステートメントは「イベント」の形で格納され、イベントはデータへの変更を記述する。一実施例に従うと、バイナリログは2つの重要な役割を果たす:(1)レプリケーションであって、バイナリログは、スレーブサーバに送られるステートメントの記録として、マスタレプリケーションサーバで用いられる。マスタサーバはそのバイナリログに含まれるイベントをスレーブに送り、そこでマスタで行なわれたのと同じデータ変更を行なうためにイベントが実行され、および(2)データリカバリであって、特定のデータリカバリ操作はバイナリログの使用を必要とする。バックアップファイルが回復されると、バックアップが行なわれた後に記録されたバイナリログは再実行される。これらのイベントにより、データベースはバックアップ時点のものから現在のものになる。
【0018】
バイナリログがトランザクションデータを記憶可能にすることは、MySQLの設置によってデフォルトでは設定されない。一実施例に従うと、「ログ-ビン」のパラメータを用いてバイナリロギングを可能にする。このパラメータはMySQL初期ファイルで指定される(これはウインドウズ(登録商標)プラットフォームではmy.iniであり、他のプラットフォームではmy.confである)。MySQLの以前のリリースでは、バイナリログはステートメントレベル情報を含んでいた、すなわち、完全なDDLおよびDMLステートメントをログしていた。異種性を支持するために、データが汎用的なデータフォーマットで利用可能にするためには、純粋なテキストSQLステートメントに基づいてログベースキャプチャを構築することは難しい。MySQLの後のバージョンでは、上記の問題を軽減するために、バイナリロギングサポートを導入している。MySQLバージョン5.1は、バイナリデータへのアクセスを提供するために新しい内部C++クラスを導入している。
【0019】
一実施例に従うと、IngressおよびSybaseといった他のデータベースで見られる循環型ロギングスタイルと比べて、MySQLバイナリログは順次作成され番号が付けられる。MySQLは古いログファイルを自動的にはアーカイブしないので、古いログファイルを保つ/バックアップするために、管理者は十分に注意しなければならない。
【0020】
一実施例に従うと、非トランザクションテーブルへの更新は、実行の後すぐにバイナリログに記憶される。拘束のないトランザクションでは、InnoDBテーブルといったトランザクションテーブルを変更するすべての更新(INSERT、DELETE、UPDATE)は、COMMITステートメントがサーバによって受取られるまでキャッシュされる。その時点で、サーバデーモン(mysqld)はトランザクション全体をバイナリログに書込む。サーバデーモンはROLLBACKステートメントが発行されたのなら、トランザクションデータを書込まない。バイナリログについて、ロールバック操作はno−opの非記録操作である。
【0021】
図1は、一実施例に係わる、異種ログベースレプリケーション用のシステムのアーキテクチャの全体を示す図である。
図1に示されるように、アーキテクチャ102はMySQLまたは同様のデータベース104を含み、これは上記の構成設定およびパラメータを用いて、データを現行のバイナリログファイル106(または複数のバイナリログファイル108)にログするよう構成されている。
【0022】
一実施例に従うと、システムは、ファイルリーダ、ファイルCACHEおよびデータ変換クラスを与えるために、任意に1つ以上のMySQLライブラリ110を含むことができる。別の実施例では、この特定のコンポーネントは必要ない。
【0023】
ベンダーアクセスモジュール(VAM)プラグインもしくはアプリケーションプログラムインターフェイス(API)111または同様のコンポーネントを用いて、Oracle GoldenGateまたは類似のレプリケーションプロダクトといったデータキャプチャおよびレプリケーションシステムまたはプロダクトにより、バイナリログファイルへのアクセスが与えられる。一実施例に従うと、VAMは、複数のMySQL VAMイベントクラス112を含み、これを用いてたとえば現行のバイナリログを開く、イベントを読む、VAM記録に変換する、ログ回転を取扱うなどといった、MySQLバイナリログからのイベントの処理をもたらし、さらにMySQLライブラリをラップアラウンドするために用いることができる複数のMySQL VAMバイナリログクラス114、ならびにビンログクラスからレコードを読取り処理し、それらをレコードキューに入れるために用いることができる複数のVAMリーダおよびプロセッサクラス116を含む。一実施例に従うと、これらのクラスの一部または全部はextractコールによって、ブロックではなく自己の専用スレッドを有することができる。他の実施例に従うと、上記はMySQL環境およびMySQL VAMの使用を示しているが、他の種類のVAMを他の種類のデータベースまたはシステムで実施できることは明らかである。
【0025】
一実施例に従うと、VAMread()コールにより、後で使用されるよう、レコードを保持するためにレコードキュー118が設けられる。複数のVAMレコードクラス120を用いてレコードキューからデータを読出し、VAM APIを用いて、extractにデータを送ることができる。Oracle GoldenGateまたは同様のレプリケーション処理といったextractプロセス122がコンパイルされて、データをVAM APIから取込み、データをターゲットシステム126および/またはターゲットデータベース128に与えるために、トレール124に、またはGoldenGateトレールファイルといったトレールファイルに、書込む。
【0026】
一実施例に従うと、MySQLはイベント入力としてデータをバイナリログ内にストアし、SQLステートメントおよび操作の性質に基づきさまざまなイベントを支持し、イベントデータを読出すためにC++クラスを与える。一実施例に従うと、VAMはこれらバイナリログイベントのサブセットを認識するために一般に構成される。たとえば、VAMはトランザクション、DMLステートメントデータ、ログ回転などを表わすバイナリログイベントを認識するよう構成することができる。表1は一実施例に従うと、MySQL VAMがバイナリログから認識することができるよう構成可能であるMySQLイベントのリストを示す。他の実施例に従うと、他の種類のイベントも認識できることは明らかである。
【0027】
一実施例に従うと、VAMの実施はC++を用いて書込むことができ、VAMモジュールの実施は2つの主要な部分に分けることができる:第1の部分は、内部的に立てられたイベントC++クラスを用いてバイナリログイベントを読出し、データレコードに処理し、レコードを既存フォーマット(送信できる形)にして、制限された大きさのキューに記憶し、第2の部分は、APIからリクエストを受取るたびに、キューからレコードを取ってきてAPIに送信する。
【0028】
ログインデックスファイル
図2は現行のバイナリログファイルを定めるためのログインデックスファイルの使用を示す図である。一実施例に従うと、MySQLはログインデックスファイルを用いて、現行のバイナリログファイルおよびより古いログファイルを識別するリストを維持する。このログインデックスファイルは、バイナリログと、同じディレクトリ場所にある。システムはログファイルフォーマットが、たとえばROW、STATEMENT、またはMIXEDフォーマットのいずれであるかを判断するために構成ファイルから読出し、ROWでない場合に、アベンド(abend)する。初期化の際、VAMはアクティブバイナリログファイルの名前を得る必要がある。
図2に示されるように、実施例132に従うと、MySQLデータベース104は、上記の構成設定およびパラメータを用いて、現行のバイナリログファイル106(または複数のバイナリログファイル108)にデータ変更を書込むことができる。アクティブバイナリログを定めるために、VAM111は環境変数または与えられたVAMパラメータからMySQL設置ホームを得て、MySQL初期化ファイルを読出し(すなわち、ウインドウズ(登録商標)プラットフォームではmy.iniであり、他のプラットフォームではmy.confファイルであり);「ログ-ビン」パラメータの値を得て、ログディレクトリ場所およびログインデックスファイル名を得て、ログインデックスファイル140を開けて内容142を読出す。この内容から、VAMはリストの最後のログファイルを判断し、この情報を用いて特定のログファイルを開き144、そのログファイルがまだサーバによって使用されているかどうかをチェックする(たとえば、フォーマット記述イベントのフラグ値がLOG_EVENT_BINLOG_IN_USE_Fであるかチェックする)。イエスなら、MySQLサーバは現在書込のためにこのログファイルを使用しているのであり、VAMはこのログファイルをアクティブログファイルとして扱う。
【0029】
図3は、一実施例に従う異種ログベースレプリケーション用の処理のフローチャートである。
図3に示されるように、ステップ160において、ソースシステム(たとえばMySQLデータベース)は、トランザクションデータをバイナリログに書込むよう構成されている。ステップ162において、ランタイム中に、1つ以上のバイナリログが作成され、たとえばSQLまたは他のデータベースステートメントに対応するイベント入力として、トランザクションまたは変更データが中に記憶される。ステップ164において、VAM(MySQLデータベースの場合、MySQL VAM)はバイナリログイベントを読出し、これらをデータレコードのキューに処理する。ステップ166において、トランザクションデータのリクエストが受取られると、VAMはキューからデータレコードを取ってきて、VAM APIに送る。ステップ168において、extractプロセス(たとえば、Oracle GoldenGate)はAPIから読出し、トランザクションまたは変更データを反映して、トレール情報またはトレールファイル(たとえばOracle GoldenGateトレールファイル)を作成する。ステップ170において、トレール情報またはトレールファイルは、1つ以上のターゲットシステム(たとえば、ターゲットデータベース)に通信または「ポンプ」され、そのトレール情報またはトレールファイルは、(ここでも、Oracle GoldenGateまたは他のプロダクトを使用して)そのターゲットシステムでトランザクションをレプリケーションするのに使用される。
【0030】
ログ回転
一実施例に従うと、バイナリログと係わる特定の種類のイベントは回転イベントであり、これは可能なログ回転を示す、すなわち、MySQLサーバが現行のバイナリログを閉じて新しいバイナリログを開くたびに、バイナリログにログされる。ログ回転の可能な理由は、たとえばログファイルのサイズがmax_binlog_sizeパラメータを超える、または明確な「フラッシュログ」コマンドが、MySQLコマンドコンソールから発せられた場合を含む。この場合、MySQLは現行のバイナリログに回転イベントを作成し、現行のバイナリログを閉じて、さらに処理するために新しいバイナリログを開く。回転イベントは、作成するべき新しいログファイルを示す。一実施例に従うと、VAMはこの値を用いて既存のバイナリログファイルを閉じ、新しいバイナリログファイルを開け、その読出を続けることができる。
【0031】
一実施例に従うと、回転イベントは、CRotateEvent C++クラスによって表わされ、これは以下のように定義される:
【0033】
一実施例に従うと、以下のシナリオはMySQLのログ回転を引き起こす(すなわち、既存のアクティブログファイルを閉じて、新しいログファイルを開く):
1.アクティブログファイルのサイズが、max_binlog_size値を超えた場合(my.iniまたはmy.confファイルで指定されている)。このシナリオでは:
a.MySQLはアクティブバイナリログにおいて’Rotate Event’をログする。回転イベントデータ部は、新しいアクティブバイナリログの場所および名前を含む。
【0034】
b.MySQLはアクティブバイナリログを閉じて、フォーマット記述イベントフラグをNULLにリセットする(このフラグは前にLOG_EVENT_BINLOG_IN_USE_F値に設定されている)。
【0035】
c.MySQLは新しいバイナリログを作成し、フォーマット記述イベントフラグをLOG_EVENT_BINLOG_IN_USE_F値に設定する。
【0036】
2.明確な「フラッシュログ」コマンドがMySQL SQLプロンプトで発行された場合。このシナリオでは:
a.MySQLはアクティブバイナリログにおいて’Rotate Event’をログする。回転イベントデータ部は、新しいアクティブバイナリログの場所および名前を含む。
【0037】
b.MySQLはアクティブバイナリログを閉じて、フォーマット記述イベントフラグをNULLにリセットする(このフラグは前にLOG_EVENT_BINLOG_IN_USE_F値に設定されている)。
【0038】
c.MySQLは新しいバイナリログを作成し、フォーマット記述イベントフラグをLOG_EVENT_BINLOG_IN_USE_F値に設定する。
【0039】
3.サーバシャットダウンの際。このシナリオでは:
a.MySQLはアクティブバイナリログに’Stop Event’をログする。
【0040】
b.MySQLはバイナリログを閉じ、さらにフォーマット記述イベントフラグをNULL値にリセットする(このフラグは前にLOG_EVENT_BINLOG_IN_USE_F値に設定されている)。
【0041】
4.サーバスタートアップの際。このシナリオでは:
a.MySQLは新しいバイナリログを作成し、フォーマット記述イベントフラグをLOG_EVENT_BINLOG_IN_USE_F値に設定する。
【0042】
一実施例に従うと、上記のシナリオ1および2では、VAMはログ回転が起こったことを識別するために回転イベントを使用し、次のバイナリログの名前を得るために、回転イベントデータを用いる。VAMは次のバイナリログを開き、そのバイナリログ読出を続ける。上記のシナリオ3および4では、VAMがストップイベントに出合うと、使用しているバイナリログを閉じて、次のバイナリログがあるかログインデックスファイルをチェックする。VAMがインデックスファイルにおいて次のバイナリログを見つけると、そのバイナリログを開いて読出を続ける。VAMがインデックスファイルにおいて新しいログファイル名を見つけることができなかった(たとえば、サーバがまだシャットダウンモードにあるか、シャットダウン後、スタートしていない)場合、VAMはextractに対してアベンドすることを知らせる。
【0043】
サーバクラッシュの際、フォーマット記述イベントのフラグがサーバの再スタートのときにサーバによってリセットされない可能性は小さく、またはMySQLサーバがアクティブバイナリログファイルに回転イベントもしくはストップイベントのどちらもログしない可能性は小さい。後のスタートアップの際、サーバはより古いバイナリログのフラグをリセットすることなく、新しいバイナリログファイルを作成する。一実施例に従うと、この状況では、2つのバイナリログがLOG_EVENT_BINLOG_IN_USE_F状態のフラグを設定していることになる。VAMがこのシナリオに出合うのは以下の条件の場合である:(1)VAMは現在アクティブバイナリログを処理している。サーバクラッシュが読出のときに起こる。この場合、extractを停止させ、クラッシュリカバリを行ない、サーバスタートアップの後VAMを再度スタートさせるのがよい;および(2)VAMはより古いログファイルを読むよう位置付けられている。1つのファイルから別のファイルに読出す間(すなわちログ回転の間)、LOG_EVENT_BINLOG_IN_USE_Fの値のログファイルフラグに出合う。このログファイルは最新のログファイルではないことに注意しなければならない(すなわち、アクティブなバイナリログではない)。EOFが起こると、MySQL VAMは次のログファイルがあるかどうかについて、ログインデックスファイルをチェックする。この場合、VAMはサーバクラッシュが前に起こっているとみなし、既存のログファイルを閉じ、次のログファイルを開けてログリーディングを続ける。
【0044】
図4は、一実施例に従う、ログ回転の使用182を示す。
図4に示されるように、ステップ184において、VAMはログインデックスファイルを解析してバイナリログファイルをリストする。ステップ186において、シーケンスIDが読取られて、ログファイル名および場所が得られる。ステップ188において、ログファイルが開けられる。ステップ190において、ファイルのEOFがチェックされ、ステップ198において、EOFに達しなければ、イベントは順次ファイルログから読出される。ステップ200から204において、VAMはクエリーイベント、ローイベント、回転イベント、および/またはストップイベントといったイベントを判断する。ステップ208において、次のログファイルは回転イベント情報から得ることができる。
【0045】
VAM実施
上記のように、一実施例に従うと、当該システムおよび方法は、たとえばMySQLデータベースまたはシステムと別の種類のデータベースまたはシステムとの間でデータを転送するために、ログベースレプリケーションを用いること、またはMySQLのようなデータベースプロダクトもしくはOracle GoldenGateのようなデータレプリケーションプロダクトを用いることを可能にする。以下の部分は、このような実施の形態および対応するベンダーアクセスモジュール(VAM)またはアプリケーションプログラムインターフェイス(API)の特定の実施を説明する。
【0046】
バイナリログサポート
上記のように、一実施例に従うと、VAM(MySQL VAM)は、データをキャプチャするためにMySQLバイナリログを使用する。MySQLバイナリログは、DML操作といったような、データを変更するステートメントデータを含む。ステートメントは、変更を記述する「イベント」の形で記憶される。
【0047】
バイナリログは2つの重要な役割を果たす:レプリケーションであって、バイナリログは、スレーブサーバに送られるステートメントの記録として、マスタレプリケーションサーバで用いられる。マスタサーバはそのバイナリログに含まれるイベントをスレーブに送り、そこでマスタで行なわれたのと同じデータ変更を行なうためにイベントが実行され;およびデータリカバリであって、特定のデータリカバリ操作はバイナリログの使用を必要とする。
【0048】
バックアップファイルが回復されると、バックアップが行なわれた後に記録されたバイナリログのイベントは再実行される。これらのイベントにより、データベースはバックアップ時点のものから現在のものになる。完全なバックアップのためには、ユーザー(例えば、顧客)はMySQLDumpユーティリティを使用し、その後増分バックアップ用にバイナリログを使用することができる。
【0049】
バイナリログ構成
一実施例に従うと、バイナリログがトランザクションデータを記憶可能にすることは、MySQLの設置によってデフォルトでは設定されない。その代わりに、「ログ-ビン」のパラメータを用いてバイナリロギングを可能にする。このパラメータは初期化ファイルにおいて、ウインドウズ(登録商標)プラットフォームではmy.iniとして、他のプラットフォームではmy.confとして指定される)。
【0050】
MySQLバージョン5.1の前のリリースでは、バイナリログはステートメントレベル情報を含んでいた、すなわち、完全なDDLおよびDMLステートメントをログしていた。異種性を支持するために、データが汎用的なデータフォーマットで利用可能にするためには、純粋なテキストSQLステートメントに基づいてログベースキャプチャを構築することは難しい。しかしMySQL5.1リリースは、上記の問題を軽減するために、バイナリロギングサポートを導入している。さらに、MySQLは、バイナリデータへのアクセスのために内部C++クラスを提供している。
【0051】
一実施例に従うと、バイナリロギングを可能にするために、MySQLサーバを構成するのに、以下のステップが必要である:MySQLサーバ構成ファイルを開く(ウインドウズ(登録商標)プラットフォームではmy.iniであり、他のプラットフォームではmy.confである);「ログ-ビン」パラメータを用いてバイナリロギングを能動化する。このオプションの値は、ログファイル用のディレクトリ場所を特定する。たとえば:
log-bin="C:/MySQL/MySQL Server 5.1/log/test.bin"
上記の例では、ログファイルの名前は‘test.00001, test.00002 …’などで作成される。これらのファイルは、"c:/MySQL/MySQL Server 5.1/log"ディレクトリに記憶される。構成ファイルにおいて、ロギングフォーマットはROWモードでのみ構成されるべきである。MIXEDモードはサポートされていない。このオプションにより、DMLステートメントはデータをバイナリフォーマットでログすることができる。これは、‘binlog_format’パラメータを用いることにより達成することができる。‘max_binlog_size’オプションを用いて、バイナリログファイルのサイズ(バイト単位)を指定することができる。最小値は4096となるべきである。
【0052】
IngressおよびSybaseといった他のベンダで見られる循環型ロギングスタイルと比べて、MySQLのバイナリログは順次作成され番号が付けられる。MySQLはより古いログファイルを自動的にはアーカイブしないので、古いログファイルを保つ/バックアップするために、エンドユーザ/顧客は十分に注意しなければならない。一実施例に従うと、以下の処理は新しいバイナリログファイルを作成し、既存ログファイルを閉じる:サーバデーモン、mysqldが開始された場合;FLUSH LOGSまたはFLUSH MASTERといったMySQLコマンドコンソールプログラム(mysql)からフラッシュコマンドを明示する。現行のログサイズがmax_binlog_sizeパラメータに達すると、サーバはさらに新しいバイナリログファイルを自動的に作成する。
【0053】
一実施例に従うと、MySQLはアクティブなおよび古いバイナリログファイルを含めたリストを含むインデックスファイルを維持する。このインデックスファイルは、他のバイナリログと同じディレクトリ場所にある。MySQLバイナリログは、特定テーブル/カラムのロギングのターンオフ/オンをサポートしない。
【0054】
トランザクションおよびバイナリログ
一実施例に従うと、非トランザクションテーブルへの更新は、実行の後すぐにバイナリログに記憶される。拘束のないトランザクションでは、InnoDPテーブルといったトランザクションテーブルを変更するすべての更新(INSERT、DELETE、UPDATE)は、COMMITステートメントがサーバによって受取られるまでキャッシュされる。MySQLは、更新操作からより多くのデータを収容するために、一時ファイルを開いてキャッシュをフラッシュする。その時点で、mysqld(サーバデーモン)はトランザクション全体をバイナリログに書込む。サーバデーモンはROLLBACKステートメントが発行されたのなら、トランザクションデータを書込まない。バイナリログに関するかぎり、ロールバック操作はno−opの非記録操作である。
【0055】
更新が混合しているトランザクションを、トランザクションテーブルおよび非トランザクションテーブルの両方にロールバックする場合、サーバデーモンはROLLBACKステートメントをログに明示する。SAVEPOINTステートメントは、ある名前の付けられたトランザクションセーブポイントを任意の名前に設定するために用いられる。ROLLBACK TO SAVEPOINTステートメントを用いて、トランザクションを示されたセーブポイントにロールバックする。MySQLはネストされたトランザクションまたはトランザクションのネーミングをサポートしない。新しいトランザクションが開始された場合、または前回のものがCOMMITもしくはROLLBACKで終了することなくサーバが閉じられた場合、MySQLは新しいトランザクショを開始させる前、またはサーバがシャットダウンされる前に、自動的により古いトランザクションのデータをディスクにコミットする。MySQLはトランザクションを複数のバイナリファイル間で分割しない。
【0056】
一実施例に従うと、トランザクションデータのサイズが‘max_binlog_size’パラメータ値を超えた場合、バイナリログファイルの大きさが‘max_binlog_size’パラメータを用いて指定された値を超えることができる。非操作の更新(更新が「ゼロ」カラムをもたらす)は、バイナリログに書込まれない。これは空のトランザクションの場合にも当てはまる。カラムを自己に更新するためにトリガが用いられた場合、MySQLはステートメント更新の結果よりも、トリガ更新の結果をログする。たとえば、以下のトリガの場合、年齢を20に更新すると、MySQLは20ではなく、25の値(トリガの結果)をログさせる:
【0058】
プラットフォームサポート
さまざまな実施例に従うと、本システムはWindows、Linux Operating system、HPUX、およびSolaris OS(登録商標)をサポートすることができる。MySQL VAMがバイナリログイベントをキャプチャするためには、MySQLextractプロセスには以下の許可が必要である(以下の許可は、非ウインドウズプラットフォームに適用可能である):構成ファイル(my.cnf)があるディレクトリ用のおよびバイナリログが生成されるディレクトリ用の読出しおよび実行許可;構成ファイル(my.cnf)用の読出許可;読出、書込(MySQLデーモンプロセスで使用);tmpディレクトリ(規定)用の実行許可。
【0059】
バージョンサポート
MySQLは3.x以降のリリースからバイナリログをサポートする。リリース5.1以前では、DML操作によるデータベーステーブルへの変更は、SQLステートメント(テキスト形式)でバイナリログにログされた。リリース5.1以降では、MySQLバイナリログは、DML操作をバイナリ形式でローデータとしてストアする。一実施例に従うと、テキストに基づくSQLステートメントでの処理と比べて、このバイナリデータを読出し、これらをたとえばOracle GoldenGate汎用フォーマットに変換することは、MySQL VAMにとってより容易である。
【0060】
データタイプサポート
表2は一実施例に従うサポートされるデータタイプを示す。
【0062】
ストレージエンジンサポート
一実施例に従うと、MySQL VAMは以下のストレージエンジンをサポートする:MyISAM-非トランザクションストレージエンジン;およびInnoDB−トランザクションストレージエンジン。
【0063】
サポートされているデータベース操作
一実施例に従うと、MySQL VAMはバイナリログから以下のデータベース操作をキャプチャすることができる:Startトランザクション、Commitトランザクション、Rollbackトランザクション−MySQLはバイナリログにロールバックされたトランザクションを送信するのではなく、MySQLはトランザクションがInnoDBのテーブルおよび同じトランザクションに関与しているmylSAMタイプに係わる場合、「トランザクションロールバック操作」をログする;挿入操作;更新操作;削除操作;切捨て操作。
【0064】
最大ローサイズおよびカラムサポート
一実施例に従うと、MySQLの最大データベースローサイズ(現在64k)はすべて、たとえばOracle GoldenGateアプリケーションによってサポートされている。所与のMySQLテーブル用の最大カラム数(現在3398);MySQL用の最大オブジェクト名長さ(schema.table);およびMySQLの最大オブジェクト名長さ(schema.table)が支持される。InnoDBストレージエンジンを有するMySQLは、カラム数が1000を超えてはならないという制限を含む。
【0065】
圧縮更新および削除のサポート
一実施例に従うと、バイナリログは、DML操作の一部ではないカラム値を記憶する。MySQL VAMとキャプチャモジュールとの間のデータ転送を最小にするために、圧縮更新および削除がサポートされる。
【0066】
AUTO_INCREMENTカラム
一実施例に従うと、AUTO_INCREMENTカラム属性を用いて新しいローの一意的識別を生成することができる。このカラム値はほとんどの場合システムで生成されるので、以下の2つの要件が支持される:ターゲット側へのAUTO_INCREMENTカラム値の伝搬−MySQLログは、このAUTO_INCREMENTカラム値をバイナリログに記憶する。アプライ(apply)側(すなわちターゲット)では、replicatプロセスがオートインクリメントなカラム値の明示挿入操作を挿入する。MySQLは挿入操作の際、AUTO INCREMENTカラムを特定の値に強制することをサポートし;およびBi方向サポート−INSERT操作の際、AUTO_INCREMENTカラム値は次のより高い値で挿入される。
【0067】
MySQLは双方向の‘auto_increment_’カラム問題を解決するために、‘auto_increment_increment’および‘auto_increment_offset’の2つの変数(初期化ファイルmy.iniを介して構成)をサポートする。これらサーバ側変数は、双方向設定の競合を解決するために、ソース側およびターゲット側で異なって設定できる。
【0068】
双方向データレプリケーションサポート
一実施例に従うと、双方向ループ検出をサポートするために、MySQL VAMモジュールは、ユーザid、トランザクションidに基づき、レコードをフィルタ処理する。MySQLバイナリログは、これらの値をイベントには記憶しない。双方向ループ検出は、ターゲット側で、トレーステーブルまたはチェックポイントテーブル(FILTERTABLE オプションを用いて構成)を介してサポートされるべきである。MySQL双方向構成は、キャプチャから除外するためにReplicatトランザクションを識別するため、Replicatチェックポイントテーブルの使用を必要とする。extractは、チェックポイントテーブルでの操作で終わるトランザクションは無視する。この機能をサポートするために、TRANLOGOPTIONSはチェックポイントテーブルの名前を特定する新しいFILTERTABLE<テーブル>オプションを与える。Replicatデータベースユーザは、‘sql_log_bin’変数を用いてセッションレベルバイナリロギングをオフにすることができる。アプライ側では、Replicatユーザはこの値を0に設定して、バイナリロギングをオフにする。
【0069】
LSNおよびタイムスタンプによる位置付け
一実施例に従うと、MySQL VAMはタイムスタンプによる位置付けおよびLSNによる位置付けをサポートする。タイムスタンプ位置は、ADD/ALTER抽出コマンドを用いて設定される。たとえば:
ADD/ALTER EXTRACT extract_name,MYSQL VAM, begin timestamp_value
ここで有効なタイムスタンプ値は以下のとおりである:
NOW(またはnow)−extractは、加えるまたは変更されたときの現行タイムスタンプ値を取る。MySQLMySQL VAMはタイムスタンプ値がこのタイムスタンプ値と等しいまたはより大きいトランザクションレコードを読出す。
【0070】
今までのタイムスタンプ値−MySQL VAMはログファイルを検索し、タイムスタンプ値がこのタイムスタンプ値と等しいまたはより大きいトランザクションレコードを読出す。
【0071】
今後のタイムスタンプ値−MySQL VAMは待機し、タイムスタンプ値がこのタイムスタンプ値と等しいまたはより大きいトランザクションレコードを読出す。
【0072】
LSN値による位置付けは、ADD/ALTER抽出コマンドを用いて設定される。たとえば:
ADD/ALTER EXTRACT extract_name,MYSQL VAM,lognum log_num , logpos log_pos
ここでlog_numはログファイル番号である。たとえば、ログファイル名がtest.000034である場合、この値は34となる。MySQLMySQL VAMはこのログファイルを検索し、さらに読出すために開く:およびlog_posはログファイル内のオフセット値である。この場所後で利用可能なトランザクションレコードは、MySQL VAMによって読出される。
【0073】
アーカイブログサポート
上記のように、一実施例に従うと、IngressおよびSybaseといった他のベンダで見られる循環型ロギングスタイルと比べて、MySQLのバイナリログは順次作成され番号が付けられる。MySQLは古いログファイルを自動的にはアーカイブしない。ログファイルは初期ファイルで指定されたログディレクトリに保持される。したがって顧客はより古いログファイルを保つ/バックアップするよう、注意しなければならない。一実施例に従うと、MySQL VAMを用いて位置付けおよびより古いログファイルの読み出しがサポートされる。MySQL VAMは、管理者または他のバックアップツールによって他の場所に移動させられたより古いログファイルを位置付けることが要求された場合、エラーを返すか、操作をアベンドする。
【0074】
DDLレプリケーション
一実施例に従うと、バイナリログはDDLステートメントをテキストに基づくSQLステートメントとして記憶し、MySQL VAMはこの特徴をサポートする。
【0075】
FetchColsおよびFetchModColsサポート
一実施例に従うと、FetchColsおよびFETCHCOLSEXCEPTを用いて、値がトランザクションログレコードにない場合に、カラム値をデータベースから取ってくることができる。このオプションは、データベースが圧縮更新を用いる場合(カラム値は変更されない限りログされない)に使用することができる。FETCHCOLS およびFETCHCOLSEXCEPTは、FILTER操作に必要なカラム値が利用可能であることを確実にする:
FETCHCOLSは特定カラムを取ってくる。
【0076】
FETCHCOLSEXCEPTは、指定されているもの以外は、すべてのカラムを取ってくる。多くのカラムを有するテーブルでは、FETCHCOLSEXCEPTは各カラムをFETCHCOLSでリストするよりも有効であり得る。
【0077】
FETCHMODCOLS およびFETCHMODCOLSEXCEPTは、カラムがトランザクションログにある場合でも、カラム値をデータベースから取ってくることを強制するために使用することができる。トランザクションログで存在し得る値は、変更されたカラムまたは補足ロギングで含まれたカラムのものである:
FETCHMODCOLSは特定カラムを取ってくる。
【0078】
FETCHMODCOLSEXCEPTは、指定されているもの以外は、トランザクションログにあるすべてのカラムを取ってくる。多くのカラムを有するテーブルでは、FETCHMODCOL。
【0079】
一実施例に従うと、この特徴はキャプチャする側でサポートされる。
初期ロードサポート
一実施例に従うと、MySQL VAMは初期ロードサポートを含む。
【0080】
オープンソースデータベースおよびオープンソースオペレーティングシステムの人気に伴い、ますます多くの顧客はMySQLを仕事の一部として使い始めている。事業が成長するにつれ、組織は複雑なデータ管理を管理するために、MySQLからOracle/DB2/SQLServerに移行したいと考え、一般に以下の工程をたどる:
ステップ1、既存のMySQLデータを顧客の選択されたデータベースに移行。この課題のために、キャプチャ側初期ロードサポートを用いることができる;
ステップ2、移行がうまく行けば、リアルタイムレプリケーション(またはデータキャプチャを変更)を能動化する。MySQL VAMを用いてこの課題を達成することができる。
【0081】
以下の初期ロード方法がサポートされている:Replicatでデータをロードする−extractプロセスは、データをテーブルから直接抽出する。この方法は実際はより遅い。なぜなら、アプライ側では1レコードずつ与えられるからである;バルクロードユーティリティでデータをロードする−extractプロセスはレコードをASCIIフォーマットで出力し、これは後でSQLLOADERまたはBCPで使われる;GoldenGate直接ロードでデータをロードする−extractプロセスはデータを直接テーブルから抽出し、replicatプロセスを呼出す。データを直接SQL*ローダにロードする。
【0082】
その他の要件
一実施例に従うと、MySQL VAMモジュールは、たとえば付加的切捨点を加える(SyBASEcase)により、バイナリログ内容を変更しない。したがって、同じバイナリログでの2つ以上のextractプロセスの読出しのサポートが可能である。一実施例に従うと、MySQL VAMはレプリケーションオプションで構成されるMySQLデータベースと共存する。extractにおいて新しいパラメータを追加したりMySQLに特有のパラメータファイルを用いないよう注意しなければならない。
【0083】
大文字および小文字の区別
一実施例に従うと、MySQLはデータベース名をディレクトリ名として、およびテーブル名をファイル名としてマッピングする(.frmファイルはテーブルについてのメタデータを保持する)。大文字および小文字によって区別されるテーブル名は、MySQLが実行される下地となるオペレーティングシステムに依存する。MySQLはウインドウズ(登録商標)プラットフォームにおいて大文字小文字が混合しているテーブル名を区別せず、UNIX(登録商標)プラットフォームのほとんどの種類において大文字小文字の区別をする。
【0084】
文字設定サポート
一実施例に従うと、MySQLはCHAR、VARCHAR、 TEXT およびENUMカラムタイプ用にUNICODE文字セットをサポートする。MySQLはそのストリングカラムについてUTF8およびUTF16(ucs2)符号化の両方をサポートする。UNICODE文字セットでは、データはUTF16値としてトレールファイルに記憶されなければならない。ストリングカラム用のUTF8符号化の場合、MySQL VAMモジュール、初期ロードモジュール、およびアプライ側モジュールは、内部変換ライブラリを用いてデータをUTF16値に(またはから)変換する。MySQLはNCHAR, NVARCHARカラムタイプをサポートする。これらは、UTF8文字セットを有するカラムとして内部的にマッピングされる。MySQLキャプチャは、最初のリリースから、UTF8およびUSC2文字セットをサポートする。一実施例に従うと、MySQLキャプチャおよびアプライモジュールはUNICODE文字セットで認定されている。
【0085】
付加的構成要件
一実施例に従うと、MySQL VAMは環境変数‘MYSQL_HOME’が正しく設定されることを必要とする。この変数は、MySQLデータベースの設置場所を示さなければならない。MySQL VAMはこの変数を用いてMySQL構成ファイルを検索する(ウインドウズ(登録商標)プラットフォームではmy.iniであり、ウインドウズでないプラットフォームではmy.confである)。さらに、以下のパラメータがMySQL構成ファイルの中に設定されなければならない(my.iniまたはmy.conf):「ログービン」パラメータを用いてバイナリロギングを能動化する−このオプションの値はログファイル用のディレクトリ場所を特定する;‘binlog_format’パラメータを用いてログフォーマットを指定する−これはROWモードとしてのみ構成されるべきである。‘MIXED’ および‘STATEMENT’モードはサポートされていない。たとえば:
【0087】
この例では、ログファイルの名前は‘test.00001, test.00002’などで作成される。これらのファイルは“c:/MySQL/MySQL Server 5.1/log”ディレクトリに記憶される。
【0088】
MySQL C++クラスの直接使用
MySQLは外の世界に対して利用可能な十分に規定されたログAPIを持たないが、バイナリログの内容を写す十分に定義されたファイルアクセスIO_CACHEクラスおよびイベントクラス(C++で公開)を有する。MySQLはログイベントについて別個の読出および処理を有する。内部IO_CACHEクラスはバイナリログデータをかたまりとしてオンデマンドで読出す(ディスクIOオーバーヘッドを避けるために、最小64kサイズ)。これらクラスにより、APIはこのブロックから読出することができる。処理側では、MySQLはデータをイベント特有のC++クラスの型に変換するために用いることができるイベントクラスを有する。この公的に利用可能なMySQLクラスは以下の欠点を有する:IO_CACHEクラスはメモリへの1回のショットでバイナリログイベントデータを読出す(サイズが64kを超えた場合)。より大きいデータを含むイベント(たとえば、サイズが2GBであるLOBデータ)では、これは問題となり得る;IO_CACHEクラスは自己でpthread特有機能を再度実施する。これはMySQL VAMがextractモジュールでリンクする際、一連のリンカーエラー(再定義)を発生させる。
【0089】
一実施例に従うと、MySQL VAMはIO_CACHEクラスおよびイベントプロセッサクラスの両方を再度実施することができる。これはバイナリログをアクセスするMySQL VAMに完全な制御を与える。さらに、これはリンカーエラー、より大きいLOBデータフェッチング(fetching)およびMySQL特有ソースコードファイルまたはヘッダファイルの依存といった問題を緩和する。
【0090】
一実施例に従うと、MySQL VAMは処理イベント用にC++クラスを再度実施し、バッファIO読出用にIO_CACHEクラスを使用することができる。このアプローチは、MySQLソースコードが、たとえばGoldenGate作成環境にいなければならないという依存性を減らす。このアプローチはさらにMySQL VAMがどのようにイベントデータを処理するかについての完全な制御を与える。頻繁に用いられるイベント状況も同様にリサイクルすることができる。
【0091】
一実施例に従うと、MySQL VAMはMySQLに特有のイベントクラスおよびIO_CACHEクラスを用いてバイナリログをアクセスすることができる。MySQL VAMクラスは、MySQL VAMに特有の必要な機能を提供するために、イベントクラスから受け継ぐ必要がある。
【0092】
符号付きまたは符号のない整数
MySQLは符号付きまたは符号なし(デフォルトは符号付き)のいずれかで定義される整数カラムをサポートする。たとえば、2バイトの符号付き整数カラムは、−32kから+32kの値をサポートし、符号がないものは0から+64kをサポートする。バイナリログは、数値カラムの符号について、すなわちそのカラムが符号付きまたは符号なしモードを支持しているのなら、メタデータを返さない。2つの設計上のアプローチが可能である:常に符号付きの値を返す、−ターゲット側でreplicatはカラムの種類に基づき変換を行なう;またはextractからMySQLカラムのメタデータを得て、extractするために正しい値を返す。一実施例に従うと、MySQL VAMは数値を符号付きの値としてMySQL VAM APIに返す。
【0093】
シーケンスIdによる位置付け
一実施例に従うと、バイナリログの中では、MySQLイベントはそのヘッダ部に場所値を有する。この値の寿命はバイナリファイルに特有である。すなわち、この場所値は所与のバイナリファイル内では固有のものであり得るが、バイナリファイルの外では固有ではない。2つの異なるバイナリファイルにおける2つの異なるイベントは同じ値を有し得る。場所によってトランザクションレコードを固有に識別するためには、MySQL VAMはこのイベント場所値をログファイル名と結合する。たとえば、‘binlog.00054:123’では、‘binlog.00054’はバイナリログの名前であり、123はトランザクションレコードの場所である。MySQL VAMはGG_ATTR_DS_SEQIDを用いてこの値をASCIIストリング属性として送る。
【0094】
一実施例に従うと、再スタートシナリオの際、extractはこの最後に受取られたシーケンスId値をMYSQL VAMIntialize()コールの際にMySQL VAMに送る。MySQL VAMはこの値を用いて正しい読出場所を設定する。MySQL VAMはこのシーケンスIdをextractから解析し、ログファイル名およびイベント場所を得る。次に、対応するログファイルを開き、イベントのスキャンを開始する。イベントの場所がシーケンスIdで特定されているものと一致すると、MySQL VAMはこの場所を現行の読出場所として設定し、この場所からバイナリログ内容の読出を開始する。
【0095】
トランザクションID
DML操作を表わすイベントでは、MySQLはトランザクションIdをイベントデータの一部として持たない。したがって、MySQL VAMはこのトランザクションId(固有のもの)をMySQL VAM APIに送るための方法が必要である。一実施例に従うと、この問題を解決するために、MySQL VAM APIは‘START Transaction’ステートメントのシーケンスIdをトランザクションIdとして扱う。このシーケンスIdは、ログファイル名+ファイル内のイベントオフセットの組合せであるので、トランザクションIdの固有性は複数のログファイル間で保証される。さらに、MySQL VAMはこの擬似トランザクションIdを内部で維持し、この値を特定のトランザクション内のすべてのDMLステートメントに対してMySQL VAM APIに送る。MySQL VAMは「コミット」または「ロールバック」ステートメントに出くわすと、この値をクリアする。
【0096】
LOBデータへのアクセス
MySQLバイナリログにおいて、LOBカラム値は他の非LOBカラム値とインラインで記憶される。これは他のデータベースと異なる。なぜなら、値はインラインでストアされず、データがオンデマンドでフェッチ(fetch)することができるロケータまたはクーポンを用いてアクセスされないからである。MySQLデータベースの場合では違う(ストレージエンジンMyISAM およびInnoDBを有する)。バイナリログからLOBカラム値を読出すため、MySQL内部IO_CACHEクラスは、ログファイルからこのLOBカラム値の全体の値をフェッチしてメモリに渡す、すなわち、メモリはこのクラスにより1回でこのLOBカラム用に完全に割当てられる。
【0097】
一実施例に従うと、MySQL VAM APIはより大きいサイズのLOBデータは塊でMySQL VAM APIに送られるべきであるという仕様概要を与える。しかし、MySQLの場合、データは既にMySQL内部クラスで完全に既にフェッチされている(すなわち、メモリはIO_CACHEオブジェクトによって完全に割当てられており)、LOBデータは32kバイトのサイズの塊で、1つのコールや複数のコールで、MySQL VAM APIに送ることができる。一実施例に従うと、上記のように、MySQLのIO_CACHEクラスはLOBデータの全体の値を他のローデータとともに、ワンショットでフェッチする。これは、LOBのサイズが2GBである場合問題となる。1つの方法は、MySQL VAMがデータを塊でファイルから読出すことができるよう、IO_CACHEクラスの実施を書き直すことである。GoldenGate(あれば)から既存のファイルマネージャライブラリを用いることができる。一実施例に従うと、システムはIO_CACHEクラスを使用し、ログデータを塊でMySQL VAM APIに送る。
【0098】
一実施例に従うと、MySQL VAM実施は、バイナリログファイルを読出すために、IO_CACHEクラスを使用することができる。LOBデータ制限を除き、IO_CACHEクラスはうまく他のMySQLデータの読出を扱う。さらに、LOBデータを2GBのサイズで処理することは実質的に珍しい(または滅多にない)。LOBカラムの内部記憶機構と無関係に、MySQL VAM APIが必要ならページアウトできるよう、MySQL VAMはLOBデータを塊でMySQL VAM APIに返すべきである。
【0099】
OG処理およびMySQL VAM API通信
一実施例に従うと、MySQL VAM実施は2つの部分に分割することができる:第1の部分はLOGデータをバイナリログから読出し、データを準備し、データをMySQL VAM API用に用意する−これは別のスレッドで実行される;第2の部分は用意ができたデータ(レコード)をリクエスト毎にAPIに送る。この従来の設計での主な欠点は、すべて(完全な処理)はMySQL VAM APIがリクエストした場合にしか起こらないことであり、MySQL VAMモジュールが処理を完了するのに何らかの実行時間を必要とする。この間、MySQL VAM APIはアイドル状態にあり、MySQL VAMのパフォーマンスを低下させる。設計を2つの部分に分割することにより、MySQL VAM APIのアイドル時間がなくなる。第1の部分が独立してバイナリログを読出す間、システムはAPIに送るべきデータの準備を行ない、制限されたサイズQueue(キュー)に記憶する。次に、第2の部分はQueueから用意ができたレコードをフェッチし、MySQL VAM API側からリクエストが来ると直ちにMySQL VAM APIに送る。
【0100】
アーキテクチャ設計
上記のように、一実施例に従うと、MySQL VAMモジュールの全体のアーキテクチャは以下を含む:
MySQLライブラリ−ファイルリーダ、ファイルCACHE、データ変換クラスを与えるライブラリ。
【0101】
MySQL VAMイベントクラス−MySQLバイナリログからイベントを処理するMySQL VAMのインハウス実施。
【0102】
MySQL VAMバイナリログクラス−MySQLライブラリをラップアラウンドするクラス、MySQL VAMイベントクラス。現行のバイナリログを開き、イベントを読出し、MySQL VAMレコードに変換し、ログ回転を処理するなど。
【0103】
MySQL VAMリーダ、プロセッサクラス−ビンログクラスからレコードを読出しおよび処理し、レコードキューに入れるクラス。これらクラスはextractコールによりブロックではなく自己の専用スレッドを有する。
【0104】
レコードキュー−後でMYSQL VAMRead ()コールによって使われるためにレコードを保持するキュー。
【0105】
MySQL VAMレコードクラス−レコードキューからデータを読出し、MySQL VAM APIを用いてextractに送るクラス。
【0106】
Extractプロセス−MySQL VAM APIからデータをキャプチャするためにコンパイルされた標準のGoldenGateextractプロセス。
【0107】
バイナリログ構造およびログイベント
図5は一実施例に従うと、MySQLバイナリログでのイベント順序を示す。一実施例に従うと、MySQLはデータをイベント入力としてバイナリログ内に記憶する。MySQLは、SQLステートメントおよび操作の性質に基づき、さまざまなイベントをサポートする。MySQLはイベントデータを読出すためにC++クラスを与える。一般に、バイナリログ構造は以下のイベント入力を含む:
1.4バイトの魔法数で始まる。これは"\xfe\x62\x69\x6e"の値を有する定数BINLOG_MAGICとして定義される。この値は無視することができる。
【0108】
2.次の入力はフォーマット記述イベントである。このイベントは所与のバイナリログファイルにわたって包括的である。MySQLはこのイベントを各バイナリログ毎に1回しか書込まない。このイベントは現行のバイナリログが使用されているかまたは正しく閉じられたかを追跡する。
【0109】
3.一連のイベントが続く残りの入力は、
図5に示される。
一実施例に従うと、MySQL VAMはバイナリログイベントのサブセットに興味を持つ。たとえば、MySQL VAMはトランザクション、DMLステートメントデータ、ログ回転などを表わすバイナリログイベントに興味を持つ。表3は、一実施例に係わる、MySQL VAMが興味を持つMySQLイベントのリストを示す。
【0111】
イベント構造
図6は一実施例に従うイベントヘッダ構造を示す。すべてのイベントは汎用ヘッダ部と後に続くデータ部とを有する。一部のイベントは、任意のデータヘッダ部を有する。イベント構造は一般に次のように表わされる。
【0112】
1.イベントヘッダ‐構造のサイズは19バイトである。この部分は、すべてのイベントに汎用的である以下のイベント特有データを含む。
【0113】
4バイト−イベントのタイムスタンプ。1970年の開始からの秒数。
1バイト−イベントのタイプコード。タイプコードの対象の値および意味は次のとおりである: QUERY_EVENT= 2; STOP_EVENT= 3; ROTATE_EVENT= 4; FORMAT_DESCRIPTION_EVENT= 15; XID_EVENT= 16; TABLE_MAP_EVENT = 19; WRITE_ROWS_EVENT = 23; UPDATE_ROWS_EVENT = 24; DELETE_ROWS_EVENT = 25。
【0114】
4バイト−サーバID。レプリケーションピア間でサーバを一意に識別。MySQL VAMはこの値を無視する。
【0115】
4バイト−ヘッダを含むイベント全体の長さをバイトで表わす。
4バイト−ログにおけるイベントのオフセットをバイトで表わす。この値はLSNまたはシーケンス番号に類似している。
【0116】
2バイト−イベントフラグ。MySQL VAMはこの値を無視する。
このイベントヘッダは、CLogEvent C++クラスによって表わされる。すべてのバイナリログ系イベント特有C++クラスはこのクラスから継承する。このクラスの構造は以下のように表わされる:
【0118】
2.データヘッダ−構造のサイズは8バイトである。変数データを含むイベント(たとえば、テーブルマップイベント、書込ローイベントなど)はこの部分を含む。この部分は、以下を含む
6バイト−テーブル
_idを含む。これは、テーブルバージョンとして扱うことができる。MySQL VAMはこの値を用いて、下地のテーブルメタデータが変更されたか否かをチェックする。
【0119】
2バイト−データヘッダフラグ。MySQL VAMはこの値を無視する。
3.データ部−イベント特有データを保持する。たとえば、書込ローイベント用のカラム値のシーケンス、テーブルマップイベント用のカラムメタデータ。より詳細については、次の箇所参照。
【0120】
イベントデータ部
一実施例に従うと、イベントデータ部はイベント特有データを保持する。データ部のサイズは動的である。すなわち、イベントの種類に応じて値は異なりかつ特定的であり、データの変数リストを保持する。次の箇所は、MySQL VAMが興味を持つイベントタイプのイベントデータ部の構造を説明する。
【0121】
クエリーイベント
一実施例に従うと、このイベントはSQLクエリーを表わす。このイベントは、MySQL内部C++クラス‘CQueryEvent’によって表わされる。このイベントのデータ部は、データベース名、クエリーストリング値、および他の情報を含む。MySQL VAMはCQueryEventイベントを用いて、以下のメンバー変数を使ってこれらの値を引出す:
【0123】
MySQLの‘BEGIN Transaction’および‘ROLLBACK Transaction’ならびに‘Truncate’ステートメントは、このCQueryEventクラスによって表わされる。これらのステートメントについて、メンバー「クエリー」は、“BEGIN”または“ROLLBACK”または“TRUNCATE table_name”といった値を含む。ログからこれらのステートメントをフィルタ処理するために、通常のストリングを用いることができる。
【0124】
XID_イベント
一実施例に従うと、このイベントはトランザクションのコミットを表わす。このイベントは、MySQL内部C++クラス‘CXidEvent’によって表わされる。このイベントのデータ部は、MySQL VAMが無視する2相コミットトランザクションのトランザクションidを含む(MySQLレプリケーションもこの値を無視する)。MySQL VAMはこのイベント入力を用いてトランザクションがコミットされ、トランザクション特有オブジェクトと切離されていることと見なす。
【0125】
テーブルマップイベント
一実施例に従うと、このイベントはトランザクションに係わる(DMLステートメントによって)テーブルのメタデータを表わす。このイベントは、書込、更新および削除ローイベントといったDML操作を表わすイベントより先に来る。たとえば、簡単な挿入操作はバイナリログにおいて2つの入力を引き起こす。最初の入力は、テーブルメタデータを含む「テーブルマップイベント」であり、次の入力はINSERT操作の一部として加えられるローデータを含む「書出ローイベント」である。汎用ヘッダ部とは別に、このイベントは付加的データヘッダ部+データ部を含む。(8バイトの)データヘッダ部は、以下のデータを含む:table_id:6バイト長−テーブルのメタデータ変更を追跡し;およびフラグを立てる:MySQL VAMはこのフラグを無視することができる。
【0126】
所与のテーブルの時間テーブルマップイベントの大部分は、下地のテーブル構造が同じままであるのなら、変更されずに残る。バイナリログは同じテーブルマップイベントの複数の入力を含むが、これらを一度に処理して、後で再度用いる方がよい。これは、読出バイナリログのパフォーマンスの速度を上げる。Table_map_log_eventログクラスのインスタンスを記憶するのにハッシュテーブルを用いるのがよく、さらに処理するためにテーブル名を用いて後で引出すことができる。
【0127】
データ構造が変更された場合(「テーブル変更…」ステートメントを使用)、MySQLは同じテーブルに対して新しいテーブルidを作成する。MySQLはテーブルidの履歴を記憶しない。バイナリログを読出す際にテーブルメタデータを変更する場合、MySQLは次のように扱う。1)プロセスをアベンドする。2)MySQL VAMは付加的処理のために変えられた(最新の)テーブル定義を用いる。一実施例に従うと、MySQL VAMは所与のテーブル名について既存のテーブルidをチェックし、異なれば、これはテーブルメタデータの変更として見なされ、MySQL VAMはextractにアベンドすることを知らせることができる。
【0128】
テーブルマップイベントのデータ部は、以下のテーブルメタデータ情報を含む:
1バイト−データベース名の長さ。
【0129】
nバイト−データベースネーム+null終了文字が続く。
1バイト−テーブル名の長さ。
【0130】
nバイト−テーブル名+null終了文字が続く。
nバイト−カラム数。カラム数が255バイト以下である場合は1バイトであり、それ以外は2バイトである。
【0131】
nバイト−テーブルの各カラムのタイプを記憶し、左から右側に示される。各バイトはMySQL内部カラムタイプにマッピングされる。
【0132】
nバイト−フィールドメタデータのサイズ。より詳細については、フィールドメタデータ部(次の箇所)参照。
【0133】
nバイト−フィールドメタデータ値。より詳細については、フィールドメタデータ部(次の箇所)参照。
【0134】
nバイト−nullカラムビットであり、直近のバイトに切上げられる。各カラムについて、そのカラムのデータがnullであり得るか否かを示すビット。これに必要なバイト数はint((column_count+7)/8)である。左から最初のカラムのフラグは、第1のバイトの最下位ビットにあり、2番目は第1のバイトのつぎの最下位ビットにあり、9番目は第2バイトの最下位ビットにある、など。
【0135】
フィールドメタデータ
図7は、一実施例に従うフィールドメタデータを示す。フィールドメタデータは一般にカラムメタデータのサイズに関連する付加的情報を表わす。これはパック長として扱うことができる、すなわち特定のカラム値を圧縮するのに必要な合計バイト数。これらの値は後で用いられて、実際の値を得るために適切なバイトを読出すために用いられる。固定長のカラムタイプ(たとえば、整数、日付など)については、このフィールドメタデータは通常ゼロである。たとえば、VARCHARのカラムタイプでは、このフィールドメタデータはVARCHARカラムの最大サイズを表わす。表4は異なるカラムタイプに対するフィールドメタデータ部の内容を示す。
【0137】
‘MEDIUM BLOB’タイプのブロブカラムを有するテーブルがあるとする。ブロブカラムの最大サイズは16777216バイト(16MB)であり得る。このサイズは通常3バイト必要である。このテーブルに簡単な挿入操作が行なわれる。この挿入操作はバイナリログに、テーブルマップイベント(Table Map Event)、および書込ローイベント(Write Rows Event)を作成する。バイナリログは、書込ローイベント部にBLOBカラムおよび実際のBLOBデータを記憶する。このBLOBデータを検索するためには、MySQL VAMは以下のステップを行なわなければならない:
1.MySQL VAMはこのBLOBカラムの長さを計算するのに必要なバイト記憶領域を知る必要がある(この例では、16777216の長さを記憶するのに3バイト必要である)。この値は、‘テーブルマップイベント’の‘フィールドメタデータ(field metadata)’部から引出される。
【0138】
2.上記の値に基づき、実際のデータ長を特定するために、MySQL VAMは‘書込ローイベント’から実際のローデータ値の最初の1つまたは2つまたは3つまたは4つのバイトを読出す。この場合、MySQL VAMはBLOBデータの実際の長さ値を得るために最初の3バイトを読出さなければならない。
【0139】
3.MySQL VAMは実際の長さに基づき十分なメモリを割当て、バイナリログからデータをコピーする。
【0140】
‘テーブルマップイベント’から、BLOBカラムに必要な最大カラムバイトストアを得る。これによって、3が返される。
【0141】
column_max_datasize = uint2korr(m_field_metadata);
上記の値は‘書込ローイベント’から実際のデータを得るために用いることができる。
【0143】
以下の例はテーブル′t1′のテーブルマップイベントのバイトシーケンス順序を示し、データベース′テスト(test)′は以下のように記述される:
【0145】
図8は一実施例に従うテーブルマップイベント構造のテーブルを示す。テーブルマップイベントはC++クラス‘CTableMapEvent’によって表わされ、そのクラス構造は以下のとおりである:
【0147】
書込ローイベント
図9は一実施例に従う書込ローイベント構造を示す。このイベントはMySQLINSERT操作を表わす。このイベントの前に、テーブルマップイベントが来る。汎用ヘッダ部とは別に、このイベントは付加的データヘッダ部+データ部を含む。(8バイトの)データヘッダ部は以下のデータを含み、これはより古いテーブルマップイベントと類似している。
【0148】
table_id:6バイト長。これはより古いテーブルマップイベントのtable_idと比較できるが、あまり役に立たない。MySQL VAMはこの値を無視する。
【0149】
flags:MySQL VAMはこのフラグを無視することができる。
書込ローイベントのデータ部は、カラムの順序に基づき配置されるカラム値を含む。書込ローイベントはCWriteRowsEventクラスによって表わされる。データ部は以下の情報を含む:
1または2バイト−カラムの数を記憶する。MySQLがサポートしている最大カラム数は3398である。
【0150】
nバイト−カラムビットマップ。これはMySQLレプリケーションで用いられる内部データ構造である。MySQL VAMは通常この値を無視する。サイズは((no_of_cols+7)/8) である。
【0151】
nバイト−(リトルエンディアンオーダ)でnullカラム値を示す。総合サイズは通常((no_of_cols+7)/8)である。左から最初のカラムのフラグは、第1のバイトの最下位ビットにあり、2番目は第1のバイトのつぎの最下位ビットにあり、9番目は第2バイトの最下位ビットにある、など。
【0152】
nバイト−挿入値のバイトシーケンス。可変カラム値(たとえばVARCHAR, LOB, CHARタイプ)の前にはその長さがくる。
【0153】
以下の例は、テーブルt2の書込ローイベントのバイトシーケンス順序を示す。
【0155】
更新ログイベント
図10は一実施例に従う、更新ローイベント構造を示す。このイベントはMySQL UPDATE操作を表わす。このイベントの前に、テーブルマップイベントが来る。汎用ヘッダ部とは別に、このイベントは付加的データヘッダ部+データ部を含む。(8バイトの)データヘッダ部は以下のデータを含み、これはより古いテーブルマップイベントと類似している。
【0156】
table_id:6バイト長。これはより古いテーブルマップイベントのtable_idと比較できる。flags:MySQL VAMはこのフラグを無視することができる。
【0157】
更新ローイベントのデータ部は、カラムの順序に基づき配置されるカラム値を含む。更新ローイベントは、事前画像および事後画像データ値を含む。他のロギングシステムと違って、MySQLバイナリログは単にプライマリキーや更新されたカラムを記憶するのではなく、カラム値の全体のコピー(事前画像値および事後画像値の両方)を記憶する。たとえば、100カラムを含むテーブルで1つのカラムを更新すると、100カラム値の事前画像コピーおよび同じ100カラムの事後画像コピーが作成される。MySQL VAMがデータをMySQL VAM API(extract)に送る前にデータを圧縮(またはフィルタ処理)することが重要である。更新ローイベントはCUpdateRowsEventクラスによって表わされる。データ部は以下の情報を含む:
1または2バイト−カラムの数を記憶する。MySQLがサポートしている最大カラム数は3398である。
【0158】
nバイト−カラムビットマップ。これはMySQLレプリケーションで用いられる内部データ構造である。MySQL VAMは通常この値を無視する。サイズは((no_of_cols+7)/8)である。
【0159】
nバイト−事後画像カラムビットマップ。これはMySQLレプリケーションで用いられる内部データ構造である。MySQL VAMは通常この値を無視する。サイズは((no_of_cols+7)/8)である。
【0160】
nバイト−事前画像データ用に(リトルエンディアンオーダ)でnullカラム値を示す。総合サイズは通常((no_of_cols+7)/8)ビットである。
【0161】
nバイト−事前画像データ用の値のバイトシーケンス。可変カラム値(たとえばVARCHAR、LOB、CHARタイプ)の前にはその長さがくる。
【0162】
nバイト−事後画像データ用に(リトルエンディアンオーダ)でnullカラム値を示す。総合サイズは通常((no_of_cols+7)/8)ビットである。
【0163】
nバイト−事後画像データ用の値のバイトシーケンス。可変カラム値(たとえばVARCHAR、LOB、CHARタイプ)の前にはその長さがくる。
【0164】
ロー削除イベント
このイベントはMySQL DELETE操作を表わす。このイベントの前にテーブルマップイベントが来る。汎用ヘッダ部と別に、このイベントは付加的データヘッダ部プラスデータ部を含む。(8バイトの)データヘッダ部は以下のデータを含み、これはより古いテーブルマップイベントと類似している。ロー削除イベントはCDeleteRowsEventクラスによって表わされる。
【0165】
table_id:6バイト長。これはより古いテーブルマップイベントのtable_idフラグと比較できる、flags:MySQL VAMはこのフラグを無視することができる。
【0166】
ロー削除イベントのデータ部は、カラムの順序に基づき配置されるカラム値を含む。
データ部は、書き込みローイベントデータ部と類似している。
【0167】
CRowsLogEvent C++ クラス
CWriteRowsEvent、CUpdateRowsEvent およびCDeleteRowsEvent C++ classesはCRowsLogEvent C++クラスから継承する。このクラスはINSERT、UPDATE およびDELETE操作用にログデータを検索するのに特有の一般的操作の大部分を含む。
【0169】
回転イベント
回転イベントは可能なログ回転を示すバイナリログにログされる。すなわち、MySQLサーバは現行のバイナリログを閉じて新しいものを開く。ログ回転の可能なシナリオは以下のとおりである:
1.ログファイルのサイズは‘max_binlog_size’パラメータを超えている。
【0170】
2.MySQLコマンドコンソールから、明白な‘flush logs’コマンドが発行された。
【0171】
どちらの場合でも、MySQLは現行のバイナリログに回転イベントを作成し、現行のバイナリログを閉じて、付加的処理用に新しいバイナリログを開く。回転イベントは、作成するべき新しいログファイルを含む。MySQL VAMはこの値を用いて既存のバイナリログファイルを閉じて、新しいバイナリログファイルを開き、読出しを続ける。回転イベントはCRotateEventC++クラスによって表わされ、以下のとおり定義される:
【0173】
ストップイベント
MySQLサーバはシャットダウンが明確な場合、バイナリクラスにストップイベントをログする。後でMySQLがスタートさせると、新しいバイナリログファイルが作成される。ストップイベントは新しいバイナリログファイル用の入力を含まない。
【0174】
イベント順序
図11は一実施例に従うイベント順序例を示す。この部分は、異なるシナリオ用にバイナリログのイベント順序を示す。さまざまなトランザクションシナリオについては、「イベント順序」の箇所参照。一例として、以下のステートメントをバイナリログファイルに記憶することができる:
【0176】
図12は一実施例に従う別のイベント順序例を示す。一例として、以下のステートメントをバイナリログファイルに記憶することができる:
【0178】
データタイプ
この部分はさまざまなサポートされているデータタイプおよびバイナリログ内のストレージ要件を説明する。MySQLはいくつかのカテゴリにおいて複数のデータタイプをサポートしている:数値型、日時型およびストリング(文字)型。各タイプは1組のバイトとして、ログレコード内に記憶される。用いられるバイト数は、データのタイプ、カラムがNULL可能であるか否か、およびフィールドの長さに依存する。可変長文字フィールド(たとえばVARCHAR、VARBINARY、CHAR、TEXT およびBLOBなど)の前にその長さが来る。
【0179】
データタイプCHAR、VARCHARおよびTEXTはucs2(1文字当たり最大2バイト)フォーマットまたはutf8フォーマット(1文字当たり2または3バイト)で記憶することができる。たとえば、VARCHAR(255)カラムは、最大255文字の長さのストリングを保持することができる。カラムはlatin1文字セット(1文字当たり1バイト)を用いると仮定すると、必要な実際の記憶領域は、ストリング長さプラスストリングの長さを記録するための1バイトである。′abcd′のストリングでは、Lは4であり、記憶領域要件は5バイトである。同じカラムがucs2ダブルバイト文字セットを用いるとされるのなら、記憶領域の要件は10バイトである。′abcd′の長さは8バイトであり、カラムは長さを記憶するのに2バイトを必要とする。なぜなら、最大長は255より大きいからである(510バイトまで)。
【0180】
一実施例に従うと、LOBフィールドはインラインに記憶される。LOBフィールドの前にはその長さが来る。サポートされているデータタイプおよびそのログサイズは表5に記載されている。
【0184】
null値の取扱い
一実施例に従うと、バイナリログローイベント(すなわちWriteRowsEvent、UpdateRowsEvent およびDeleteRowsEvent)は他の非NULLカラム値とともにはNULLカラム値を記憶しない。NULLカラム値は、データ部の前にNULLバイトの組として記憶される。NULLバイトの合計数は通常(カラム数+7)/8である。より詳細にはWriteRowsEvent(todo)参照。
【0185】
NULLカラムは、リトルエンディアンオーダとしてこれらNULLバイト部に記憶される。左から最初のカラムのフラグは、第1のバイトの最下位ビットにあり、2番目は第1のバイトのつぎの最下位ビットにあり、9番目は第2バイトの最下位ビットにある、など。カラムがNULL値を保持しているか否かを見つけるために、NULLバイトの各ビットをマスクすることができる。以下のコードは、カラムがNULLであるか否かをチェックする:
【0187】
空のストリングは、ゼロ長値としてバイナリログに記憶される。
データタイプ変換
一実施例に従うと、CHAR、BINARY、VARCHARおよびVARBINARYタイプ−ストリングデータタイプの長さは可変である。実際のデータ値の前にデータ長が来る。長さの値は1バイト(長さが255未満の場合)または2バイト(長さが256以上の場合)を必要とする。
【0188】
上記のように、ストリングカラムの‘フィールドメタデータ(fieldmetadata)’(CHAR、VARCHAR、BINARYおよびVARBINARYタイプタイプに当てはまる)は、長さの最大値を見つけるのに役立つ。この値に基づき、実際の長さは以下のように検索することができる。
【0190】
uint2korr()関数はconfig_win.hで規定されるMySQL提供マクロである。この関数は所与のポインタの最初の2バイトを読取り、対応する整数値を返す。
【0191】
ENUMタイプ
一実施例に従うと、ENUMカラムはログファイルにおいてインデックス値として記憶される。たとえば、ENUM(「赤」、「オレンジ」、「青」)のカラムでは0、1および2のインデックス値を有することができる。したがって、「オレンジ」のENUM値を記憶すると、バイナリログファイルではインデックス値2となる。サポートされる最大列挙インデックス値は65,535バイトである。
【0192】
ENUMカラムタイプのフィールドメタデータは、ENUMインデックス値に必要な最大バイトを含む。この値に基づき、実際の長さは以下のように読出すことができる。
【0194】
SETタイプ
一実施例に従うと、SETカラムは0またはより大きい値を有することができるストリングカラムであり、各々はテーブルを作成した場合に指定される許容値のリストから選択されなければならない。たとえば、SET(「1」、「2」)と指定されたカラムは、「1」「2」、「1,2」のいずれかの値を有することができる。SETは最大64個の異なるメンバーを有することができる。セットカラムはログファイルにおいてバイナリ値として記憶される。たとえば、SET('a','b','c','d')として指定されるカラムでは、メンバーは以下の10進数および2進数の値を有する:
【0196】
したがって、SET('a','b')を記憶すると、3の10進数の値をもたらす(すなわち、2進数では0011)。SETカラムは最大64個の異なるメンバーを有することができるので、これらの値を記憶するのに要する最大バイトは最大8バイトとなる。SETカラムタイプのフィールドメタデータは、SET10進数に必要な最大バイトを含む。この値に基づき、実際の長さは以下のように取出すことができる:
【0198】
整数タイプ
一実施例に従うと、整数値はバイナリログにおいて符号付きおよび符号なしの整数として記憶される。整数は符号付きの整数として読取られ、MySQL VAMによってextractに送られる。整数のCタイプは、整数カラムのサイズに依存し、これは長さによって定められる。MySQLではサイズに基づきすべての整数変形にはCタイプが規定され、関連するマクロを有して、メモリ場所をプラットフォームとは独立している整数値にコピーする。表7は各長さおよび関連するマクロで使用するタイプを示す。
【0200】
整数値は指定サイズの整数としてGoldenGateMySQL VAMに返すことができるので、データ変換には適切なマクロを用いることだけが必要であり、変換された整数および長さを整数データとして返す。
【0201】
浮動小数点、倍精度および10進数タイプ
一実施例に従うと、浮動小数点データタイプには、MySQLは単精度値には4バイト、倍精度値には8バイト使用する。MySQLは非標準シンタックス: FLOAT(M,D)またはDOUBLE (M,D)を可能にする。ここで(M,D)は値が合計M桁まで記憶できることを意味し、そのうちD桁は小数点の後ろに来てもよい。MySQLは浮動小数点および倍精度カラムタイプ用のマクロを有し、メモリ場所をプラットフォームと独立した浮動小数点または倍精度値にコピーする。表8は各長さおよびそれに伴うマクロで使用するタイプを示す。
【0203】
浮動小数点および倍精度値は、指定サイズの浮動として、GoldenGateMySQL VAMに戻すことができる。それにより、データ変換には適切なマクロを用いることだけが必要であり、変換された整数および長さを整数データとして返却する。
【0204】
DECIMAL(またはNUMERIC)のデータタイプは正確な数値データ値を記憶するために用いられる。これらのタイプは正確な精度を保つことが重要な、たとえば通貨データでの値を記憶するために用いられる。MySQLのリリースの前(5.0.3以前)では、DECIMALおよびNUMERIC値はストリングフォーマットで記憶される。
【0205】
DECIMALカラムの値は、9桁の10進数(10進法)を4バイトに圧縮するバイナリフォーマットを用いて表わされる。各値の整数および小数部の記憶領域は別個に定められる。9桁の各倍数は4バイトを要し、「余り」の桁は4バイトの一部を要する。余剰桁に必要な記憶領域は表9によって与えられる:
【0207】
MySQLは10進数値を含むメモリ場所をコピーして、ストリング値に変換するための、10進数カラムタイプ用の関数を有する。MySQL VAMは‘bin2decimal’関数を用いてメモリ場所を読取り、この値を‘decimal_t’構造に埋める。別の関数‘decimal_bin_size’はこの‘decimal_t’構造を単に変換し、値をストリングとして返す。これは以下のコードラインで記載される。
【0209】
10進数値はストリングとしてGoldenGateMySQL VAMに返すことができ、データ変換は単に適切なマクロを用いることだけが必要であり、変換された10進数値を返す。
【0210】
BITタイプ
一実施例に従うと、BITタイプカラムは1つの値当たり64ビットまで記憶する。必要な最大記憶領域は(M+7)/8バイトであり、'M'は値当たりのビット数を示す。MySQL VAMは以下のコードを用いてバイナリログからBITカラム値を読出す。
【0212】
DATE、TIME、YEAR、DATETIMEおよびTIMESTAMPタイプ
日時タイプ変換はすべての変換の中で最も複雑なものである。他のデータタイプと比較して、MySQLは日時タイプを扱うマクロまたは公的関数を公開していない。MySQL内部実施はこれらのコールを扱うための適切な方法を見つけるためにデバッグされた。MySQL VAMはMySQL内部実施に基づき、自己のコードバージョンを書き直している。MySQL VAMはログからバイナリデータを読出し、これらを共通構造MySQL_TIMEに変換する(この構造はMySQLによって定義され、使用される)。後でこれらの構造はextractに渡される前にストリングに変換することができる。
【0213】
MySQL_TIMEは以下のように規定される
【0215】
DATEタイプは、DD+MM×32+YYYY×16×32として、圧縮3バイト整数形式に記憶される。サポートされている範囲は1000−01−01から9999−12−31である。DATEカラムは以下のコードを用いてバイナリログから読出される。
【0217】
TIMEタイプはDD×24×3600+HH×3600+MM×60+SSとして、圧縮3バイト整数で記憶される。TIMEカラムは以下のコードを用いてバイナリログから読出される。
【0219】
YEARタイプは1バイトの整数で記憶される。値はYYYY(値の範囲は1901から2155)またはYY(値の範囲は70(1970)から69(2069))形式であり得る。YEARカラム値は以下のコードを用いてバイナリログから読出される。
【0221】
DATETIMEタイプは、日付および時刻情報の両方を含む値が必要である場合に用いられる。サポートされている範囲は′1000−01−01 00:00:00′から′9999−12−31 23:59:59′である。DATETIMEタイプはYYYY×1000+MM×100+DDとして圧縮される4バイトの整数を含む8バイトの整数として;HH×10000+MM×100+SSとして圧縮される4バイトの整数として記憶される。DATETIMEカラム値は以下のコードを用いてバイナリログから読出される:
【0223】
TIMESTAMPタイプは4バイトの整数であり、エポックからの秒数UTCを表わす(範囲は′1970−01−01 00:00:01′UTCから′2038−01−19 03:14:07′UTCである)。TIMESTAMPカラム値は以下のコードを用いてバイナリログから読出される:
【0225】
LOBデータタイプ
一実施例に従うと、MySQL LOBMySQLは、他のカラム値に従ってLOBレコードを記憶する(大型オブジェクト−すなわちTINYBLOB、BLOB、MEDIUM BLOB、LONG BLOBおよびTEXTタイプ)。BLOBおよびTEXTカラムデータは、VARBINARY またはVARCHARフィールドと同様の方法で記憶される。すなわち、最初のいくつかのバイトは、長さを記憶し、その後にオリジナルのLOB値が続く。LOBカラムでは、テーブルマップイベントのフィールドメタデータは、所与のLOBフィールドに必要な最大バイトの記憶領域を含む。この値は、LOB値を読出すときに必要なメモリを割当てる際に便利である。TINYTEXTおよびTINYBLOBカラムの最大サイズは255である。これはCHARおよびbinaryカラムを扱う場合と同様である。
【0226】
TEXTおよびBLOBブロブカラムの最大サイズは64kである。これはまたはVARCHARおよびVARBINARYカラムを取扱うのと類似している。TINYTEXT、TEXT、TINYBLOBおよびBLOBカラムに記憶されている値は1回のショットでextractに送ることができる。他のLOBタイプでは、データは一度に64kのサイズの一塊として、読出すことができ、extractに送られる。以下のコード行はMySQL LOBカラムの取扱いを説明する。
【0228】
(65kバイト以上のデータを保持することができる)MEDIUM BLOBおよびLONG BLOBのような他のLOBタイプでは、データは一度に32kの大きさの一塊として読出すことができ、複数のコールでextractに送られる。上記のように、LOBカラム値は他の非LOBカラム値に従って記憶される。これは他のデータベースと異なる。なぜなら、値はインラインで記憶されないし、データがオンデマンドで取ってくることができるロケータまたはクーポンを用いてアクセスされないからである。MySQLデータベースの場合では違う(ストレージエンジンMyISAM およびInnoDBを有する)。バイナリログからLOBカラム値を読出すため、MySQL内部IO_CACHEクラスは、ログファイルからこのLOBカラム値の全体の値をフェッチしてメモリに渡す、すなわち、メモリはこのクラスにより1回でこのLOBカラム用に完全に割当てられる。
【0229】
一実施例に従うと、より大きいサイズのLOBデータが塊でMySQL VAM APIに送られるべきであるというMySQL VAM API仕様概要が示される。しかし、MySQLの場合、データは既にMySQL内部クラスで完全に既にフェッチされている(すなわち、メモリはIO_CACHEオブジェクトによって完全に割当てられており)、LOBデータは32kバイトのサイズの塊で、1つのコールや複数のコールで、MySQL VAM APIに送ることができる。
【0230】
バイナリログを使った作業
一実施例に従うと上記のように、MySQLはバイナリログインデックスファイルを用いて、現行のバイナリログファイルおよびより古いログファイルを含むリストを維持する。このインデックスファイルは、バイナリログと同じディレクトリ場所にある。これにより、システムは構成ファイルから読出してログファイルフォーマットを見つける、たとえばROW、 STATEMENT、またはMIXEDフォーマットをさがし、ROWでなければアベンドする。
【0231】
MySQLサーバが新しいバイナリログファイルを作成する場合(スタートアップ時、または明白な「フラッシュログ」コマンドによる)、BINLOG_MAGIC値(4バイト)および「フォーマット記述イベント」を書込む。このフォーマット記述は所与のバイナリログについて一度しか書込まれない。
【0232】
このフォーマット記述イベントの「フラグ」属性は、現行のバイナリログがサーバによって使用中であるか否かを追跡する。MySQLサーバはスタートアップの際にこの状態をLOG_EVENT_BINLOG_IN_USE_F値に設定し、シャットダウンまたはログ回転の際にはこの値をクリアする。これは、バイナリログが正しく閉じられているか否かをチェックする信頼性のあるインジケータとして扱うことができる。
【0233】
初期化の際、MySQL VAMは活性バイナリログファイルの名前を得る必要がある。MySQL VAMは以下のステップを用いてアクティブバイナリログの名前を得る。MySQLサーバは同じプロシージャを用いて現行のバイナリログを得る:
1.環境変数または供給されたMySQL VAMパラメータのどちらから、MySQL設置ホームを得る。
【0234】
2.MySQL初期化ファイルを読出す−ウインドウズ(登録商標)プラットフォームではmy.iniであり、他のプラットフォームではmy.confである。
【0235】
3.「ログ-ビン」パラメータの値を得る。この値から、ログディレクトリ場所およびログインデックスファイル名を見つける。
【0236】
4.ログインデックスファイル名を開き、内容を読出す。この内容から、リストの最後のログファイルを見つける。
【0237】
5.このログファイルを開き、ログファイルがまだサーバによって使用されているかをチェックする(フォーマット記述イベントのフラグ値がLOG_EVENT_BINLOG_IN_USE_Fであるかをチェックする)。イエスなら、MySQLサーバは書込のためにこのログファイルを現在使用している。MySQL VAMはこのログファイルをアクティブログファイルとして扱う。
【0238】
バイナリログの位置付け
一実施例に従うと、MySQL VAM APIはタイムスタンプ値またはシーケンス番号のどちらかによって位置付けることをMySQL VAMに要求することができる。extractにおいて、位置付けはGGSCIにおいてADDまたはALTERコマンドのどちらかによって要求できる。MySQL VAMにおいてタイムスタンプおよびシーケンス番号による位置付けのサポートに加えて、本システムはアクティブバイナリログを終わりおよび先頭への位置付けをサポートする。
【0239】
シーケンス番号による位置付け
一実施例に従うと、extractにトランザクションレコードを送信する場合、MySQL VAMはextractにシーケンス番号値をも送信する。再スタートシナリオの際、extractはこの最後に受取ったシーケンス番号値をMYSQL VAMIntialize()コールの際にMySQL VAMに送る。VAMはこの値を用いて正しい読出場所を設定する。
【0240】
MySQL VAMはGG_ATTR_DS_SEQIDを用いてこのシーケンス番号値をASCIIストリングとして送る。MySQL VAMはこのASCIIストリングを、現行のログファイルおよび現行のイベント場所(すなわちlog.000001:10045)の組合せとして、この値をextractに送る前に作成する。
【0241】
MYSQL VAMIntialize()コールの際にシーケンス番号によって位置付けるために、MySQL VAMはextractからシーケンス番号値を解析し、ログファイル名をイベント場所として得る。次に、対応するログファイルを開き、イベントのスキャンを開始する。イベントの場所がシーケンス番号で指定されたものと一致するなら、MySQL VAMはこの場所を現行の読出場所として設定し、この場所からバイナリログの内容の読出を始める。
【0242】
タイムスタンプ値による位置付け
タイムスタンプによる位置付けのため、システムは必要なタイムスタンプ値以上のタイムスタンプを有するアクティブバイナリログ(すなわちBEGINストリングを含むQueryEvent)においてビギントランザクションレコードを見つけなければならない。タイムスタンプ値が未来の時間であるのなら、必要なタイムスタンプ場所以上のタイムスタンプを有するビギントランザクションレコードを見つけるまで、システムはログの終わりにおいて読出を続ける。バイナリログ内またはバイナリログとともに起こり得る2つのシナリオがある:
シナリオ1:Begin/Endトランザクションレコードはアクティブバイナリログにあり、最初にこのようなレコードのタイムスタンプは要求されるタイムスタンプ位置よりも低い。
【0243】
このシナリオの場合、MySQL VAMはアクティブバイナリログファイルをスキャンして、タイムスタンプ値が要求されるタイムスタンプ場所以上であるビギントランザクションレコードを見つける。MySQL VAMが要求されるレコードを見つけられなかった場合、ログの終わりに位置付けられる。
【0244】
シナリオ2:アクティブバイナリログにおける最初のBegin/Endトランザクションレコードは、要求されるタイムスタンプ場所以上のタイムスタンプ値を有する。
【0245】
このシナリオは微妙である。このシナリオにおいて、より古いバイナリログも要求されるタイムスタンプ値に等しいタイムスタンプを有するBeginトランザクションレコードを持っている可能性がある。
【0246】
一実施例に従うと、MySQL VAMは最新のものから古いものへと、バイナリログをスキャンする(順序はログインデックスファイルで維持される)。MySQL VAMが要求されるタイムスタンプに等しいタイムスタンプを有するBegin/End了トランザクションレコードを見つけなかった場合、MySQL VAMはエラーを返すかまたは最も古いログファイルの先頭に位置付ける。タイムスタンプによる位置付けは時間の掛かる処理となり得る。なぜなら、MySQL VAMはより古いログファイルを開けて、そのタイムスタンプに一致するイベントエントリを見つける必要があるかもしれないからである。
【0247】
ログの終わりへの位置付け
一実施例に従うと、アクティブバイナリログの終わりに位置付けるために、MySQL VAMは、IO_CACHE関数クラスにログの終わりを見つけることを要求するために、my_b_seek()関数を使用する。
【0248】
ログの先頭への位置付け
一実施例に従うと、トランザクションログの先頭に位置付けるために、MySQL VAMはmy_b_seek()関数をコールして、ログの先頭を、BINLOG_MAGICプラスグローバルフォーマット記述イベントデータの後ろに位置付ける。
【0249】
バイナリログの読出
一実施例に従うと、MySQL VAMはMySQLのIO_CACHE C++クラスおよびファイルユーティリティ関数を用いてMySQLバイナリログを開いて読出す。MySQLのIO_CACHE C++クラス(mysql_client.libの一部)は、バイナリログの内容を64kのサイズの塊で読出す。このバッファ読出はIO使用の減少に役立つ。
【0250】
バイナリログファイルを読出す正しいシーケンスを見つけるために、‘mysqlbinlog’ユーティリティおよび‘replication slave thread’モジュールといったMySQLのさまざまな内部モジュールがデバッグされる。以下のコード行は、IO_CACHEクラスを初期化し、バイナリログファイルを開いて読出す。
【0252】
ログ回転
一実施例に従うと、以下のシナリオによりMySQLのログ回転を引き起こす(すなわち、既存のアクティブログファイルを閉じて、新しいログファイルを開く)。
【0253】
1.アクティブログファイルのサイズが、max_binlog_size値を超えた場合(my.iniまたはmy.confファイルで指定されている)。
【0254】
a.MySQLはアクティブバイナリログにおいて’Rotate Event’をログする。回転イベントデータ部は、新しいアクティブバイナリログの場所および名前を含む。
【0255】
b.MySQLはアクティブバイナリログを閉じて、フォーマット記述イベントフラグをNULLにリセットする(このフラグは前にLOG_EVENT_BINLOG_IN_USE_F値に設定されている)。
【0256】
c.MySQLは新しいバイナリログを作成し、フォーマット記述イベントフラグをLOG_EVENT_BINLOG_IN_USE_F値に設定する。
【0257】
2.明確な「フラッシュログ」コマンドがMySQL SQLプロンプトで発行された場合。
【0258】
a.MySQLはアクティブバイナリログにおいてRotate Eventをログする。回転イベントデータ部は、新しいアクティブバイナリログの場所および名前を含む。
【0259】
b.MySQLはアクティブログを閉じて、フォーマット記述イベントフラグをNULLにリセットする(このフラグは前にLOG_EVENT_BINLOG_IN_USE_F値に設定されている)。
【0260】
c.MySQLは新しいバイナリログを作成し、フォーマット記述イベントフラグをLOG_EVENT_BINLOG_IN_USE_F値に設定する。
【0261】
3.サーバシャットダウンの際。
a.MySQLはアクティブバイナリログにStop Eventをログする。
【0262】
b.MySQLはバイナリログを閉じ、さらにフォーマット記述イベントフラグをNULL値にリセットする(このフラグは前にLOG_EVENT_BINLOG_IN_USE_F値に設定されている)。
【0263】
4.サーバスタートアップの際。
a.MySQLは新しいバイナリログを作成し、フォーマット記述イベントフラグをLOG_EVENT_BINLOG_IN_USE_F値に設定する。
【0264】
上記のように、一実施例に従うと、MySQL VAMはログ回転が起こったことを識別するために回転イベントを使用し、次のバイナリログの名前を得るために、回転イベントデータを用いる。MySQL VAMは次のバイナリログを開き、そのバイナリログ読出を続ける。シナリオ3および4では、MySQL VAMがストップイベントに出合うと、使用しているバイナリログを閉じて、次のバイナリログがあるかログインデックスファイルをチェックする。MySQL VAMがインデックスファイルにおいて次のバイナリログを見つけると、そのバイナリログを開いて読出を続ける。MySQL VAMがインデックスファイルにおいて新しいログファイル名を見つけることができなかった(たとえば、サーバがまだシャットダウンモードにあるか、シャットダウン後、スタートしていない)場合、MySQL VAMはextractに対してアベンドすることを知らせる。
【0265】
考慮するべきもう一つの興味のあるシナリオがある。サーバクラッシュの際、フォーマット記述イベントのフラグがサーバの再スタートのときにサーバによってリセットされない可能性は小さく、またはMySQLサーバがアクティブバイナリログファイルに回転イベントもしくはストップイベントのどちらもログしない。後のスタートアップの際、サーバはより古いバイナリログのフラグをリセットすることなく、新しいバイナリログファイルを作成する。このような特有の状況では、2つのバイナリログがLOG_EVENT_BINLOG_IN_USE_F状態のフラグを設定していることになる。MySQL VAMがこのシナリオに出合うのは以下の条件の場合である:
1. MySQL VAMは現在アクティブバイナリログを処理している。サーバクラッシュは読出のときに起こる。この場合、extractを停止させ、クラッシュリカバリを行ない、サーバスタートアップの後MySQL VAMを再度スタートさせるのがよい。
【0266】
2. MySQL VAMはより古いログファイルを読むよう位置付けられている。1つのファイルから別のファイルに読出す場合(すなわちログ回転の場合)、LOG_EVENT_BINLOG_IN_USE_Fの値のログファイルフラグに出合う。このログファイルは最新のログファイルではないことに注意しなければならない(すなわち、アクティブなバイナリログではない)。EOFが起こると、MySQL VAMは次のログファイルがあるかどうかについて、ログインデックスファイルをチェックする。この場合、MySQL VAMはサーバクラッシュが前に起こっていると見なし、既存のログファイルを閉じ、次のログファイルを開けてログ読出を続ける。
【0267】
MySQLVAMクラス設計
上記のように、一実施例に従うと、MySQL VAM実施はC++を用いて書込まれ、MySQL VAMモジュールの実施は2つの主な部分に分けられる。最初の部分では、内部で開発されたイベントC++クラスを用いてバイナリログイベントを読出し、これらをデータレコードに処理し、レコードを用意ができたフォーマット(送信できる状態)にして、制限されたサイズのQueueに記憶する。第2の部分では、Queueからレコードを取ってきて、APIからリクエストを受けるたびにAPIに送る。
【0268】
バイナリログリーダ
図13は、一実施例に従うVAMバイナリログリーダのクラスダイヤグラムを示す。CMySQLBinLogManagerクラスは主要制御クラスであり、全体の処理を管理し、作業を異なるクラスにコミットする。データをバイナリログから読出し、バイナリログデータを処理し(MySQLイベントをデータレコードに変換)、レコード(既成フォーマット)を制限されたサイズのQueueに入れることを主に担当する。これはすべての関数を「純粋仮想」として有するCLogManagerクラスから派生している。
【0269】
設計はCMySQLBinLogReaderクラスを有し、データをバイナリログから取ってくることを担う。さまざまなC++イベントクラスおよびMySQLのIO_CACHEクラスを用いて、バイナリログのライフサイクルおよびイベントインスタンスを管理する。さらに、イベントをフィルタ処理するためにCFilterBinLogログを用いる。
【0270】
CLogProcessorクラスはバイナリログデータを処理するのであって、制限されたサイズQueue(CRecordQueue)を準備した既成オブジェクトで埋める。後で、これらのオブジェクトはAPIに送られるために他のクラスによってフェッチされる。
【0271】
CRecordQueueクラスは既成レコード(CRecord)の記憶を担う。
先頭から、処理はCMySQLBinLogManagerクラスのscanLog機能から始まり、これは別個の実行エンティティ(スレッド)であり、独立して実行され、全体の処理実行を担う。まずCMySQLBinLogReaderにバイナリログの読出を求め、そこから生のイベントインスタンスを得る。このレコードをさらに処理するためCLogProcessorに渡して、制限されたサイズのQueueに入力される。
【0272】
バイナリログプロセッサ
図14は一実施例に従うと、バイナリログプロセッサのクラスダイヤグラムを示す。
【0273】
CMySQL VAMModuleは全体のMYSQL VAMモジュールの主要制御クラスである。これはシングルトンクラスであり、MYSQL VAMモジュールの寿命の間中1つのオブジェクトしか持たない。中にすべてのコアビジネスロジックがあり、タスクをさまざまなクラスにわたってデリゲート(delegate)する。
【0274】
MYSQL VAMモジュールはAPIに4つの関数を公開しており、これはMYSQL VAMInitialize、MYSQL VAMRead、MYSQL VAMMesage およびMYSQL VAMControlである。これらの関数のビジネスロジックはCMySQL VAMModuleクラスの中にある。CRecordQueueキューからCRecordレコード(設計の第1の部分により、Queueに入れられた既成レコード)をフェッチして、CMySQL VAMCommunicatorクラスによってAPIに送る。
【0275】
CMySQL VAMCommunicatorクラスはどのようにデータをAPIに対して送るおよび得るかを担う。CMySQL VAMApiクラスを用いてAPIからの公開された関数を用いる。CMySQL VAMApiクラスはAPI公開関数のラッパである。
【0276】
CErrorContainerクラスは中にエラーオブジェクトを記憶し、エラーになりがちなシナリオを取扱う。
【0277】
MySQL VAM公開関数(すなわち、MYSQL VAMInitialize)がAPIからコールされるたびに、フローはCMySQL VAMModuleクラスに向けられ、そのフローを別の他のクラスにリダイレクトし、データをAPIに返す。たとえば、MYSQL VAMRead読出しがAPIからコールされたのなら、CMySQL VAMModuleのMySQL VAMReadがコールされ、CRecordQueueキューからデータをフェッチして、CMySQL VAMCommunicatorクラスを介してAPIに送られる。
【0278】
本発明は、1つ以上のプロセッサ、メモリおよび/または本開示の教示に従うプログラミングされたコンピュータ読取可能記憶媒体を含む、1つ以上の従来の汎用もしくは特殊なデジタルコンピュータ、演算装置、マシンまたはマイクロプロセッサを用いて、好都合に実施できる。適切なソフトウェアコード化は、ソフトウェア技術の当業者にとって明らかなように、本開示の教示に基づき、熟練したプログラマーによって容易に用意することができる。
【0279】
一部の実施例において、本発明は一時的ではない記憶媒体またはコンピュータ読取可能媒体であるコンピュータプログラムプロダクトを含み、そこに命令が記憶されて、コンピュータに本発明のいずれかの処理を実行するようプログラミングするために用いることができる。記憶媒体は、フロッピー(登録商標)ディスク、光学ディスク、DVD、CD−ROM、マイクロドライブ、光磁気ディスク、ROM、RAM、EPROM、EEPROM、DRAM、VRAM、フラッシュメモリ装置、磁気または光カード、ナノシステム(分子メモリICを含む)を有するすべての種類の物理媒体、ならびに命令および/またはデータを記憶するのに適するすべての種類の媒体または装置を含むことができるが、これらに限定されない。
【0280】
本発明の記載は、図示および説明のために提供されている。本発明を開示されたそのままの形に制限する意図はない。多くの変形および変更は当業者にとって明らかである。特に、実施例はMySQL環境およびMYSQL VAMを用いて記載されているが、他の種類のVAMを他の種類のデータベースまたはシステムで実施できることは明らかである。実施例は本発明の原理および実用的アプリケーションを最もよく説明する目的のために選択および記載されており、それにより当業者がさまざまな実施例について、および意図される特定の使用に適するさまざまな変形について、本発明を理解することができる。本発明の範囲は特許請求の範囲およびその均等の意味によって定義されるものとする。