(57)【要約】【課題】  複数のトランザクションを並行処理しても各データベース間で矛盾の生じることがない多重化データベースシステムにおける同期化方法を提供する。【解決手段】  仲介装置２００は、各サーバ１００間における処理結果の矛盾又はサーバ１００の無応答を検出し、処理結果の矛盾を検出したら各応答の中から１つの応答を選定するとともに、選定した応答以外の応答を返したサーバ１００をシステムから切り離し、サーバ１００の無応答を検出したら該無応答のサーバ１００をシステムから切り離し、システムから切り離されたサーバ１００とシステムに組み込まれている正常稼働中のサーバ１００との同期化処理を行い、同期化処理が完了したらシステムから切り離されたサーバ１００を再びシステムに組み込む。【選択図】  図１
2007241324.tif 000002
【特許請求の範囲】
【請求項１】
複数のデータベースサーバと、クライアントコンピュータからの処理要求を各データベースサーバに中継するとともに各データベースサーバからの正当な応答の１つをクライアントコンピュータに処理結果として返す仲介装置とを備えた多重化データベースシステムにおいて、各データベースサーバを同期化する方法であって、
仲介装置は、
（ａ）データベースサーバから処理要求に対する応答がない事を検出すると該無応答のデータベースサーバをシステムから切り離し、
（ｂ）システムから切り離されたデータベースサーバとシステムに組み込まれている正常稼働中のデータベースサーバとの同期化処理を行い、
（ｃ）同期化処理が完了したらシステムから切り離されたデータベースサーバを再びシステムに組み込む
ことを特徴とする多重化データベースシステムにおける同期化方法。
【請求項２】
仲介装置は、
（ｄ）各データベースサーバ間における処理結果の矛盾を検出し、
（ｅ）処理結果の矛盾を検出したら各応答の中から１つの応答を選定するとともに当該選定した応答をクライアントコンピュータに返す
ことを特徴とする請求項１記載の多重化データベースシステムにおける同期化方法。
【請求項３】
仲介装置は、
（ｆ）選定した応答以外の応答を返したデータベースサーバをシステムから切り離し、
（ｇ）システムから切り離されたデータベースサーバとシステムに組み込まれている正常稼働中のデータベースサーバとの同期化処理を行い、
（ｈ）同期化処理が完了したらシステムから切り離されたデータベースサーバを再びシステムに組み込む
ことを特徴とする請求項２記載の多重化データベースシステムにおける同期化方法。
【請求項４】
複数のデータベースサーバと、クライアントコンピュータからの処理要求を各データベースサーバに中継するとともに各データベースサーバからの正当な応答の１つをクライアントコンピュータに処理結果として返す仲介装置とを備えた多重化データベースシステムにおいて、各データベースサーバを同期化する方法であって、
仲介装置は、
（ｉ）各データベースサーバ間における処理結果の矛盾を検出し、
（ｊ）処理結果の矛盾を検出したら各応答の中から１つの応答を選定するとともに当該選定した応答をクライアントコンピュータに返し、
（ｋ）選定した応答以外の応答を返したデータベースサーバをシステムから切り離し、
（ｌ）システムから切り離されたデータベースサーバとシステムに組み込まれている正常稼働中のデータベースサーバとの同期化処理を行い、
（ｍ）同期化処理が完了したらシステムから切り離されたデータベースサーバを再びシステムに組み込む
ことを特徴とする多重化データベースシステムにおける同期化方法。
【請求項５】
仲介装置は、データベースサーバのシステムからの切り離し処理を行うと該データベースサーバに対して再起動指示を送出し、
データベースサーバは、仲介装置からの再起動指示に応じて自身の再起動を行うとともに再起動後に仲介装置に対してシステムへの組込要求を送出し、
仲介装置は、データベースサーバからシステムの組込要求を受信すると該データベースサーバと正常稼働中のデータベースサーバとの同期化処理を開始する
ことを特徴とする請求項１乃至４何れか１項記載の多重化データベースシステムにおける同期化方法。
【請求項６】
仲介装置は、クライアントコンピュータからの処理要求を差分情報として記憶する差分情報記憶部を備え、前記同期化処理において、クライアントコンピュータからの処理要求を差分情報として記憶するとともに、正常稼働中のデータベースサーバに対してスナップショットの作成を指示し、
スナップショット作成指示を受信したデータベースサーバは、データベースのスナップショットを作成してシステムから切り離されたデータベースサーバに対してスナップショットを転送し、
スナップショットを受信したデータベースサーバは、該スナップショットからデータベースを復元するとともに仲介装置に対して差分情報の転送を要求し、
差分情報転送要求を受信した仲介装置は、要求元のデータベースサーバに対して差分情報記憶部に記憶した処理要求を差分情報として送出する
ことを特徴とする請求項１乃至５何れか１項記載の多重化データベースシステムにおける同期化方法。
【請求項７】
データベースサーバ検査用のクライアントコンピュータが検査用の参照系の処理要求を仲介装置に送出する
ことを特徴とする請求項１乃至６何れか１項記載の多重化データベースシステムにおける同期化方法。
【請求項８】
複数のデータベースサーバと、クライアントコンピュータからの処理要求を各データベースサーバに中継するとともに各データベースサーバからの正当な応答の１つをクライアントコンピュータに処理結果として返す仲介装置とを備えた多重化データベースシステムにおいて、
仲介装置は、
データベースサーバから処理要求に対する応答がない事を検出すると該無応答のデータベースサーバをシステムから切り離し、システムから切り離されたデータベースサーバとシステムに組み込まれている正常稼働中のデータベースサーバとの同期化処理を行い、同期化処理が完了したらシステムから切り離されたデータベースサーバを再びシステムに組み込む制御部を備えた
ことを特徴とする多重化データベースシステム。
【請求項９】
複数のデータベースサーバと、クライアントコンピュータからの処理要求を各データベースサーバに中継するとともに各データベースサーバからの正当な応答の１つをクライアントコンピュータに処理結果として返す仲介装置とを備えた多重化データベースシステムにおいて、
仲介装置は、
各データベースサーバ間における処理結果の矛盾を検出し、処理結果の矛盾を検出したら各応答の中から１つの応答を選定するとともに当該選定した応答をクライアントコンピュータに返し、選定した応答以外の応答を返したデータベースサーバをシステムから切り離し、システムから切り離されたデータベースサーバとシステムに組み込まれている正常稼働中のデータベースサーバとの同期化処理を行い、同期化処理が完了したらシステムから切り離されたデータベースサーバを再びシステムに組み込む制御部を備えた
ことを特徴とする多重化データベースシステム。
【請求項１０】
複数のデータベースサーバと、クライアントコンピュータからの処理要求を各データベースサーバに中継するとともに各データベースサーバからの正当な応答の１つをクライアントコンピュータに処理結果として返す仲介装置とを備えた多重化データベースシステムにおける仲介装置であって、
データベースサーバから処理要求に対する応答がない事を検出すると該無応答のデータベースサーバをシステムから切り離し、システムから切り離されたデータベースサーバとシステムに組み込まれている正常稼働中のデータベースサーバとの同期化処理を行い、同期化処理が完了したらシステムから切り離されたデータベースサーバを再びシステムに組み込む制御部を備えた
ことを特徴とする仲介装置。
【請求項１１】
複数のデータベースサーバと、クライアントコンピュータからの処理要求を各データベースサーバに中継するとともに各データベースサーバからの正当な応答の１つをクライアントコンピュータに処理結果として返す仲介装置とを備えた多重化データベースシステムにおける仲介装置であって、
各データベースサーバ間における処理結果の矛盾を検出し、処理結果の矛盾を検出したら各応答の中から１つの応答を選定するとともに当該選定した応答をクライアントコンピュータに返し、選定した応答以外の応答を返したデータベースサーバをシステムから切り離し、システムから切り離されたデータベースサーバとシステムに組み込まれている正常稼働中のデータベースサーバとの同期化処理を行い、同期化処理が完了したらシステムから切り離されたデータベースサーバを再びシステムに組み込む制御部を備えた
ことを特徴とする仲介装置。
【請求項１２】
複数のデータベースサーバと、クライアントコンピュータからの処理要求を各データベースサーバに中継するとともに各データベースサーバからの正当な応答の１つをクライアントコンピュータに処理結果として返す仲介装置とを備えた多重化データベースシステムにおける仲介装置を実現するプログラムであって、
コンピュータを、
データベースサーバから処理要求に対する応答がない事を検出すると該無応答のデータベースサーバをシステムから切り離し、システムから切り離されたデータベースサーバとシステムに組み込まれている正常稼働中のデータベースサーバとの同期化処理を行い、同期化処理が完了したらシステムから切り離されたデータベースサーバを再びシステムに組み込む制御部として機能させる
ことを特徴とする仲介プログラム。
【請求項１３】
複数のデータベースサーバと、クライアントコンピュータからの処理要求を各データベースサーバに中継するとともに各データベースサーバからの正当な応答の１つをクライアントコンピュータに処理結果として返す仲介装置とを備えた多重化データベースシステムにおける仲介装置を実現するプログラムであって、
コンピュータを、
各データベースサーバ間における処理結果の矛盾を検出し、処理結果の矛盾を検出したら各応答の中から１つの応答を選定するとともに当該選定した応答をクライアントコンピュータに返し、選定した応答以外の応答を返したデータベースサーバをシステムから切り離し、システムから切り離されたデータベースサーバとシステムに組み込まれている正常稼働中のデータベースサーバとの同期化処理を行い、同期化処理が完了したらシステムから切り離されたデータベースサーバを再びシステムに組み込む制御部として機能させる
ことを特徴とする仲介プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のデータベースマネージメントシステム（ＤＢＭＳ）を並列動作させた多重化データベースシステムに関し、特に各データベース間の同期技術に関する。
【背景技術】
【０００２】
従来の多重化データベースシステムは、例えば特許文献１に記載されたものが知られている。このシステムでは、図５３に示すように、それぞれデータベースを備えた２つの計算機１０１０と計算機１０２０が通信回線により接続されている。各計算機１０１０と１０２０とは、いわゆる二相コミット制御によりデータベース間の同期が図られている。
【０００３】
計算機１０１０は、各種の業務処理を実行する応用プログラム１０１１と、データベース１０１４の検索及び更新の制御を行うとともにトランザクションモニタ１０１３を介して他の計算機１０２０のデータベース１０２４における更新処理との同期を取るデータベース管理システム１０１２と、いわゆる二相コミット制御によってデータベース１０１４と１０２４の更新処理の同期をとるトランザクションモニタ１０１３とから構成される。計算機１０２０についても計算機１０１０と同様に、応用プログラム１０２１と、データベース管理システム１０２２と、トランザクションモニタ１０２３とから構成されている。
【０００４】
本システムにおいて、計算機１０１０のデータベース１０１４と計算機１０２０のデータベース１０２４で同じデータを保持し、更新があった場合でも両方のデータベース１０１４と１０２４に同じ更新が反映される処理手順について説明する。
【０００５】
応用プログラム１０１１は、あるトランザクション内でデータベース１０１４と１０２４を同一クエリで更新する。データベース１０１４は、データベース管理システム１０１２が更新し、データベース１０２４はデータベース管理システム１０２２が更新する。
【０００６】
そして、応用プログラム１０１１は、トランザクションの最後に今までの更新を確定する「ＣＯＭＭＩＴ要求」又は今までの更新を取り消す「ＲＯＬＬＢＡＣＫ要求」を発行する。「ＣＯＭＭＩＴ要求」又は「ＲＯＬＬＢＡＣＫ要求」は、トランザクションモニタ１０１３によってデータベース管理システム１０１２と、トランザクションモニタ１０２３を経由してデータベース管理システム１０２２へ送られる。
【０００７】
例えば、トランザクションモニタ１０１３が「ＣＯＭＭＩＴ要求」を転送した場合、データベース管理システム１０１２と１０２２は、ＣＯＭＭＩＴ実行の可否をトランザクションモニタ１０１３へ返答する。この際、データベース管理システム１０１２と１０２２は実際にはＣＯＭＭＩＴを実行せず、実行の可否のみを答えるのみである。
【０００８】
トランザクションモニタ１０１３及び１０２３は、データベース管理システム１０１２及び１０２２の双方から「ＣＯＭＭＩＴ可」の応答を受け取ると、それぞれデータベース管理システム１０１２及び１０２２に「ＣＯＭＭＩＴ実行」を送信する。「ＣＯＭＭＩＴ実行」を受け取ったデータベース管理システム１０１１２と１０２２は、実際にＣＯＭＭＩＴを実行する。
【０００９】
一方、例えばトランザクションモニタ１０１３が、データベース管理システム１０１２又は１０２２の一方から「ＣＯＭＭＩＴ不可」の応答を受け取った場合、他方の応答が「ＣＯＭＭＩＴ可」であったとしても、データベース管理システム１０１２と１０２２に対して「ＲＯＬＬＢＡＣＫ実行」を送信し、トランザクションをキャンセルする。「ＲＯＬＬＢＡＣＫ実行」を受け取ったデータベース管理システム１０１２と１０２２は、実際にＲＯＬＬＢＡＣＫを実行する。
【００１０】
以上のようにして、どちらか一方のデータベースだけ更新が反映されることを防ぎ、両方のデータベースに対して常に同一の更新が行われるようにすることで、データベース間の同期を保つ。
【特許文献１】特開平６−１６１８６２号公報
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかしながら、上述の従来技術は、複数のデータベースにおける一トランザクションのデータベースの同期を図る方法であって、複数のトランザクション間でのデータベースの同期を制御することはできない。つまり、複数のトランザクションが並行に実行されている状態で、且つ、それらのトランザクションが同一のテーブルの同一行にほぼ同時にアクセスした場合には、データベースの同期が崩れたり、クライアントへ返す返答が一意に決まらないなどの問題が生じる。この問題点について以下に具体的に例示する。
【００１２】
図５４に示すｔｅｓｔ＿ｔａｂｌｅという名前のテーブルを考える。この時、図５５に示すトランザクションＴ１及びＴ２がほぼ同時に実行される場合を考える。トランザクションＴ１はｉｄ＝１０１の行を更新し、トランザクションＴ２はｉｄ＝１０１の行とｉｄ＝１０２の行を更新する。どちらのトランザクションのＵＰＤＡＴＥが先に実行されるかによって、ｉｄ＝１０１の値は異なってしまう。
【００１３】
２つのトランザクション中のＵＰＤＡＴＥが実行される順序は以下の２通りが考えられる。
【００１４】
（１）Ｔ１のＵＰＤＡＴＥの後にＴ２のＵＰＤＡＴＥ
（２）Ｔ２のＵＰＤＡＴＥの後にＴ１のＵＰＤＡＴＥ
（１）の場合、２つのトランザクション実行後にはＴ２のＵＰＤＡＴＥが残り、ｄｅｐａｒｔｍｅｎｔ＝２となる。一方（２）の場合、２つのトランザクション実行後にはＴ１のＵＰＤＡＴＥが残り、ｄｅｐａｒｔｍｅｎｔ＝１となる。すなわち、（１）と（２）では最終的なテーブルｔｅｓｔ＿ｔａｂｌｅのデータが異なる。
【００１５】
つまり、複数のデータベースの初期状態が同じで、且つ、同じトランザクションを実行したとしても、あるＤＢＭＳでは（１）の順で実行し、別のＤＢＭＳは（２）の順で実行した場合、２つのデータベースは同期状態（同じデータを保持している状態）が崩れてしまう問題が発生する。
【００１６】
また、別の例として、図５６に示すトランザクションＴ３及びＴ４がほぼ同時に実行される場合を考える。トランザクションＴ４のＳＥＬＥＣＴがトランザクションＴ３のＣＯＭＭＩＴの前に実行されるか又は後に実行されるかで、トランザクションＴ４のＳＥＬＥＣＴで得られる値は異なってしまう。
【００１７】
トランザクションＴ４のＳＥＬＥＣＴとトランザクションＴ３のＣＯＭＭＩＴが実行される順序は以下の２通りが考えられる。
【００１８】
（３）Ｔ４のＳＥＬＥＣＴの後にＴ３のＣＯＭＭＩＴ
（４）Ｔ３のＣＯＭＭＩＴの後にＴ４のＳＥＬＥＣＴ
（３）の場合、トランザクションＴ４のＳＥＬＥＣＴ実行後には、トランザクションＴ３のＵＰＤＡＴＥが反映されていない古い値ｄｅｐａｒｔｍｅｎｔ＝３が得られる。一方（４）の場合、トランザクションＴ４のＳＥＬＥＣＴ実行後には、トランザクションＴ３のＵＰＤＡＴＥが反映された値ｄｅｐａｒｔｍｅｎｔ＝１が得られる。
【００１９】
つまり、複数のデータベースの初期状態が同じで、且つ、同じトランザクションを実行したとしても、あるＤＢＭＳは（３）の順で実行し、別のＤＢＭＳは（４）の順で実行した場合、得られる値が異なってしまう。
【００２０】
本発明は、上記事情に鑑みてなされたものであり、その目的とするところは、複数のトランザクションを並行処理しても各データベース間で矛盾の生じることがない多重化データベースシステムにおける同期化方法を提供することにある。
【課題を解決するための手段】
【００２１】
本願発明は、複数のデータベースサーバと、クライアントコンピュータからの処理要求を各データベースサーバに中継するとともに各データベースサーバからの正当な応答の１つをクライアントコンピュータに処理結果として返す仲介装置とを備えた多重化データベースシステムにおける各データベースの同期化処理に関するものである。
【００２２】
ところで、各データベースサーバにおいて複数のトランザクションが並行して処理され、しかも各データベースサーバでトランザクション内での処理要求が互いに異なる順番で処理されると、仲介装置側からは、（１）あるデータベースサーバからの応答はあるが他のデータベースサーバからの応答はない、又は、（２）あるデータベースサーバからの応答と他のデータベースサーバからの応答とが矛盾している（異なっている）、と認識される場合がある。
【００２３】
そこで、本願発明では、仲介装置は、（ａ）データベースサーバから処理要求に対する応答がない事を検出すると該無応答のデータベースサーバをシステムから切り離し、（ｂ）システムから切り離されたデータベースサーバとシステムに組み込まれている正常稼働中のデータベースサーバとの同期化処理を行い、（ｃ）同期化処理が完了したらシステムから切り離されたデータベースサーバを再びシステムに組み込む。
【００２４】
これにより、あるデータベースサーバからの応答はあるが他のデータベースからの応答がない場合には、当該応答のないデータベースサーバがシステムから切り離される。すなわち、各データベースサーバ間で処理要求の処理順序が異なり各データベースサーバ間で非同期になった（各データベースサーバ間で同一であるはずのデータが同一でなくなった）可能性を検出すると、あるデータベースサーバを基準として該データベースサーバと非同期になった可能性のあるデータベースサーバがシステムから切り離される。そして、正常稼働中のデータベースサーバとシステムから切り離されたデータベースサーバとの同期化処理が行われ、同期化処理が完了するとシステムから切り離されたデータベースサーバが再びシステムに組み込まれる。これにより、各データベースサーバの同期化が図られる。
【００２５】
また、本願発明では、仲介装置は、（ｉ）各データベースサーバ間における処理結果の矛盾を検出し、（ｊ）処理結果の矛盾を検出したら各応答の中から１つの応答を選定するとともに当該選定した応答をクライアントコンピュータに返し、（ｋ）選定した応答以外の応答を返したデータベースサーバをシステムから切り離し、（ｌ）システムから切り離されたデータベースサーバとシステムに組み込まれている正常稼働中のデータベースサーバとの同期化処理を行い、（ｍ）同期化処理が完了したらシステムから切り離されたデータベースサーバを再びシステムに組み込む。
【００２６】
これにより、あるデータベースサーバからの応答と他のデータベースサーバからの応答とが矛盾している場合には、各応答の中から１つの応答が選定され、選定された応答以外の応答を返したデータベースサーバがシステムから切り離される。すなわち、各データベースサーバ間で処理要求の処理順序が異なっている可能性又は何らかの原因で各データベースサーバ間で非同期になった（各データベースサーバ間で同一であるはずのデータが同一でなくなった）可能性を検出すると、あるデータベースサーバを基準として該データベースサーバと非同期になった可能性のあるデータベースサーバがシステムから切り離される。そして、正常稼働中のデータベースサーバとシステムから切り離されたデータベースサーバとの同期化処理が行われ、同期化処理が完了するとシステムから切り離されたデータベースサーバが再びシステムに組み込まれる。これにより、各データベースサーバの同期化が図られる。
【００２７】
なお、ここでシステムへのデータベースサーバの組み込みとは、多重化データベースシステムを構成するデータベースサーバとして機能するよう仲介装置が当該データベースサーバを取り扱うようにすることを意味する。また、システムからのデータベースサーバからの切り離しとは、多重化データベースシステムを構成するデータベースサーバとして機能しないよう仲介装置が当該データベースサーバを取り扱うようにすることを意味する。したがって、システムに組み込まれているデータベースサーバにはクライアントコンピュータからの処理要求が仲介装置を介して届くが、システムから切り離されたデータベースサーバにはクライアントコンピュータからの処理要求が届かない状態となる。なお、データベースサーバがシステムに組み込まれていること又は切り離されていることと、データベースサーバが仲介装置と通信可能又は不能であることとは無関係である点に留意されたい。つまり、データベースサーバと仲介装置が通信可能な状態にある場合であっても、データベースサーバがシステムに組み込まれていない場合もあり得る。
【発明の効果】
【００２８】
以上説明したように本発明によれば、複数のトランザクションを並行処理することにより各データベースサーバ間で矛盾が生じても、各データベースサーバの同期化が図られるので当該矛盾を解消できる。
【発明を実施するための最良の形態】
【００２９】
（第１の実施の形態）
本発明の第１の実施の形態に係る多重化データベースシステムについて図面を参照して説明する。図１は本実施の形態に係る多重化データベースシステムの全体構成を説明するブロック図である。
【００３０】
この多重化データベースシステムは、図１に示すように、複数のデータベースサーバ（以下「サーバ」と言う）１００と仲介装置２００とをネットワーク３００で接続したものであり、ネットワーク４００を介して１以上のクライアントコンピュータ（以下「クライアント」と言う）５００及びデータベース一致検査装置６００からアクセスされるものである。本実施の形態では、図１に示すように、２台のサーバ１００ａ及び１００ｂを有しており、２台のクライアント５００ａ及び５００ｂからアクセスされる。以降の説明において各サーバ１００を他のサーバ１００と区別する場合には添え字「ａ」「ｂ」を付加するものとする。クライアント５００についても同様である。なお、図１の例では、サーバ１００とクライアント５００はそれぞれ別々のネットワーク３００，４００に接続されているが、同じネットワークに接続されていてもよい。
【００３１】
図１に示すように、仲介装置２００は、ネットワーク４００側にＩＰアドレス172.17.1.1を持っており、これをデータベースサーバのＩＰアドレスとして公開している。クライアント５００やデータベース一致検査装置６００はデータベースにアクセスしたいときはＩＰアドレス172.17.1.1へクエリを送信し、ＩＰアドレス172.17.1.1の仲介装置２００からそのクエリに対する応答パケットを受信する。これは、クライアント５００等にとっては、ＩＰアドレス172.17.1.1を持ったデータベースサーバとパケットを送受信していることと同じである。このＩＰアドレス172.17.1.1を持った仮想的なデータベースサーバを仮想サーバ８００と呼ぶ。この仮想サーバ８００の目的は、サーバ１００が冗長化されていることを隠蔽するためである。つまり、サーバ１００ａとサーバ１００ｂ両方が稼働していようとサーバ１００ｂがダウンしてサーバ１００ａのみが稼働していようとサーバ１００ａとサーバ１００ｂの他に新たなサーバが追加されようとクライアントには影響は無く、動作を変更する必要がない。
【００３２】
サーバ１００は、データを保存・管理するデータベース１０１と、データベース１０１の動作を制御するデータベース制御部１０２とを備えている。
【００３３】
データベース１０１は、ＳＱＬ（Structured Query Language）を解して処理を行うＲＤＢＭＳ（Relational Database Management System）である。このようなデータベース１０１としては種々のものがあり、例えばＴｈｅ  ＰｏｓｔｇｒｅＳＱＬ  Ｇｌｏｂａｌ  Ｄｅｖｅｌｏｐｍｅｎｔ  ＧｒｏｕｐによるＰｏｓｔｇｒｅＳＱＬ（http://www.postgres.org/）や、Ｏｒａｃｌｅ社によるＯｒａｃｌｅ（登録商標）（http://www.oracle.com）などが挙げられる。
【００３４】
データベース制御部１０２は、ネットワーク３００を介して仲介装置２００から送られてくるパケットに基づき動作する。このパケットは、ＳＱＬなどデータベース１０１での処理に係るもの、同期化処理に係るものに大別される。ＳＱＬなどデータベース１０１での処理に係るものについては、データベース制御部１０２は、当該パケットをデータベース１０１に渡し、データベース１０１からの処理結果を仲介装置２００に返す。
【００３５】
一方、同期化処理に係るものは、さらに、自身が本システムに組み込まれている場合のものと、起動時や障害復旧時などこれからシステムに組み込む場合のものとに別れる。前者については、スナップショットの作成指示（同期化指示）がある。データベース制御部１０２は、スナップショット作成指示を仲介装置２００から受信すると、データベース１０１のスナップショットを作成する。そして、スナップショットの作成が完了すると、スナップショット作成完了を仲介装置２００に通知する。そして、作成したスナップショットを、スナップショット作成指示で指示されている転送先の他のサーバ１００に転送する。
【００３６】
他方、障害復旧時などこれからシステムに組み込む場合、データベース制御部１０２は、他のデータベースからスナップショットを受信すると、このスナップショットを用いて自身のデータベース１０１を復元する。データベース１０１の復元が完了すると仲介装置２００に対して差分情報転送要求を送出する。後述するように、差分情報転送要求に応じて仲介装置２００から差分情報が転送されるので、この差分情報を用いてデータベース１０１を復元する。
【００３７】
また、データベース制御部１０２は、仲介装置２００から再起動指示を受信すると、データベース１０１及びデータベース制御部１０２の再起動を行う。この再起動処理は、データベース１０１及びデータベース制御部１０２のプロセスの再起動のみを行ってもよく、データベース１０１及びデータベース制御部１０２がサーバ１００の起動時に自動起動するように設定されていればサーバ１００全体の再起動でもよい。さらに、データベース制御部１０２は、自身が起動（再起動を含む）されると、仲介装置２００に対してデータベース同期化要求（システムへの組込要求）を送信する。
【００３８】
仲介装置２００は、本システム内のサーバ１００を管理するサーバ管理表２０１と、トランザクションを管理するトランザクション管理表２０２と、同期化用に差分情報を蓄積する差分情報蓄積部２０３と、サーバ１００に送信するクエリを一時保存する送信キュー２０４と、クライアント５００及びデータベース一致検査装置６００とサーバ１００と間での処理の仲介やサーバ１００の同期化制御などを行うサーバ制御部２１０とを備えている。
【００３９】
サーバ管理表２０１は、サーバが正常稼働中（ａｃｔｉｖｅ）か、障害などで停止している（ｄｏｗｎ）か、という状態を保存している。図２にサーバ管理表の一例を示す。サーバ管理表２０１は、図２に示すように、サーバ１００を識別するためのサーバＩＤと、サーバの稼働状態から構成されている。図２の例では、サーバ１００ａとサーバ１００ｂとが登録されており、稼働状態は共に正常稼働を示すａｃｔｉｖｅである。また、本実施形態では、サーバＩＤとしてサーバ１００に付されたＩＰアドレスを用いた。
【００４０】
トランザクション管理表２０２は、現在実行中の又は実行開始を保留されているトランザクションの有無を記憶する。図３にトランザクション管理表２０２の一例を示す。図３に示すように、トランザクション管理表２０２は、クライアントを一意に識別するクライアントＩＤとトランザクションを一意に識別するトランザクションＩＤから構成される。これらのペアは、トランザクション開始時にトランザクション管理表２０２に登録され、トランザクション終了時にトランザクション管理表２０２から削除される。クライアントＩＤは、例えばクライアント５００等のＩＰアドレスやポート番号である。トランザクションＩＤは新しいトランザクションが発生する毎にサーバ制御部２１０が新たに割り振る。
【００４１】
差分情報蓄積部２０３は、サーバ同期化時にクライアント５００及びデータベース一致検査装置６００から受信する全てのクエリを蓄積する。図４に差分情報蓄積部２０３が蓄積している差分情報の一例を示す。差分情報蓄積部２０３の各データは、図４に示すように、クライアント５００又はデータベース一致検査装置６００が送信したクエリと、このクエリが所属するトランザクションＩＤとから構成される。トランザクションＩＤはトランザクション管理表２０２から取得する。同期化処理時における新たなクエリは、この差分情報蓄積部２０３の最後に追加される。つまり、上から古いクエリが蓄積されている。図４の例では、トランザクションＩＤ＝１のＢＥＧＩＮが一番古く、ＣＯＭＭＩＴが一番新しい。
【００４２】
送信キュー２０４は、各クライアント５００及びデータベース一致検査装置６００から受信したクエリを各サーバ１００に送信するまで一時的に保存するバッファメモリである。図５に送信キュー２０４の一例を示す。送信キュー２０４の各データは、図５に示すように、クライアント５００等が送信したクエリと、このクエリが所属するトランザクションＩＤと、サーバ１００に送信したか否かを表す送信状態とから構成される。トランザクションＩＤはトランザクション管理表２０２から取得する。クライアント５００等からの新たなクエリは、この送信キュー２０４の最後に追加される。つまり、上から古いクエリが蓄積されている。図５の例では、トランザクションＩＤ＝１のＢＥＧＩＮが一番古く、トランザクションＩＤ＝２のＢＥＧＩＮが一番新しい。この送信キュー２０４の送信状態は、クライアント５００等からクエリを受信した際には「未送信」が設定され、正常稼働中の全てのサーバ１００に送信されると「送信完了」が設定される。送信完了となったエントリは、直ちに又は所定期間経過後に送信キュー２０４から削除される。
【００４３】
サーバ制御部２１０は、通常の処理（同期化処理時以外の処理）として、クライアント５００及びデータベース一致検査装置６００からのパケットをネットワーク４００経由で受信し、サーバ管理表２０１を見て正常稼働している全てのサーバ１００へ該パケットを転送する。ここで、サーバ１００へ転送するパケットは、送信キュー２０４に「未送信」として記憶されているクエリが対象であり、送信キュー２０４に記憶されている古いクエリから順に転送される。そして、サーバ１００からのパケットをネットワーク３００経由で受信し後述するパケットの正当性判断方法により１つ以上の該パケットのうち１つを選出し１つの正しいパケットをネットワーク４００を経由して要求元のクライアント５００等へ転送する。なお、同期化処理時には、「未送信」のクエリであっても新規トランザクションに属するクエリは送信せず、実行中のトランザクションに属するクエリのみを古い順に正常稼働中のサーバ１００に送信する。
【００４４】
ここで、サーバ制御部２１０は、クライアント５００等からの処理要求を解析してトランザクションの開始と終了を検出してトランザクション管理表２０２を更新する。トランザクション開始と終了をサーバ制御部２１０が検出する方法は、ＤＢＭＳの種類によって異なる。例えば前述のＰｏｓｔｇｒｅＳＱＬの場合は、トランザクションの開始はクライアント５００等が「ＢＥＧＩＮ」というＳＱＬを送信した時であり、トランザクションの終了はクライアント５００等が「ＣＯＭＭＩＴ」「ＲＯＬＬＢＡＣＫ」というＳＱＬを送信した時である。また、Ｏｒａｃｌｅの場合は、トランザクションの開始はクライアント５００等が有効なＳＱＬを送信したときであり（明示的なトランザクションの開始を宣言するＳＱＬは無い）、トランザクションの終了はクライアント５００等が「ＣＯＭＭＩＴ」「ＲＯＬＬＢＡＣＫ」というＳＱＬを送信した時である。また、ＡＵＴＯ  ＣＯＭＭＩＴモードで動作する場合には、クライアント５００等から受信したＳＱＬ文はそれぞれ１つの独立したトランザクションに属していると解釈できるので、クライアント５００等からＳＱＬを受信する毎に、該ＳＱＬ実行前にトランザクションが開始されるとともにＳＱＬ実行後に当該トランザクションが終了したこととして扱うことができる。
【００４５】
また、パケットの正当性判断方法は、例えば、サーバ１００が３台以上ある場合には多数決で決める方法や、受信したパケットを所定のルールに基づいて判断する方法がある。例えば、クライアント５００からの「参照」要求に対して「更新成功」という応答が返ってきた場合、正常であればそのような応答はあり得ないので（参照成功など参照に関する応答のはず）、この応答パケットは正しくないと判断する。また、パケット中にデータ長フィールドがある場合、このデータ長フィールドの値と実際に受信したパケット長を比較し、異なる場合は正しくないと判断する。また、複数のサーバ１００の中からＭａｓｔｅｒサーバを予め１台決めておき、このサーバ１００からのパケットを常に正しいと判断する。また、上記複数の方法を併用する方法もある。例えば、３台で多数決を行った結果、パケットの中身が全てバラバラであり、多数派のパケットを決められない場合はＭａｓｔｅｒサーバのパケットを正しいと判断する。正常稼働しているサーバが１つだけの場合は、そのサーバからの応答パケットを正常と判断する。
【００４６】
サーバ制御部２１０は、正当ではない応答を送信したサーバ１００、及び、所定時間内に応答を返さないサーバ１００は障害と判断し、そのサーバ１００についてサーバ管理表２０１から登録を削除することによりシステムから切り離すとともに、当該サーバ１００に対して再起動指示を送信する。
【００４７】
さらに、サーバ制御部２１０は、ネットワーク３００を介してサーバ１００からデータベース同期化要求（システムの組み込み要求）を受信すると、このサーバ１００と、正常稼働中のサーバ１００とを同期化させる処理を行う。以下にその処理について説明する。ここで、以降の説明において、これからシステムに組み込まれるサーバを便宜上「新規サーバ」と呼ぶ。この新規サーバの組み込みは、システムにおけるサーバを増設する場合のほか、前述したようにシステムから切り離されたサーバを再組み込みする場合などに実施される。
【００４８】
サーバ制御部２１０は、サーバ１００からデータベース同期化要求を受信すると、正常稼働中のサーバ１００に対してスナップショットの作成指示を送出する。ここで、スナップショットの作成指示を送出するタイミングは、サーバ１００においてトランザクションが実行中でないことが求められる。これはスナップショット作成中にトランザクションがＲＯＬＬＢＡＣＫするとデータの同期化が図れない場合があることを防止するためや、ＣＯＭＭＩＴされていないために更新データがスナップショットに反映されないことを防止するためである。このためサーバ制御部２１０は、処理中のトランザクションが終了するまでスナップショットの作成指示の送出を待つとともに、スナップショット作成完了通知をサーバ１００から受信するまでは新規トランザクションを開始しないようにしている。そして、新規トランザクションに係るＳＱＬについては、スナップショット作成完了通知の受信後に、正常稼働中のサーバ１００で処理するとともに、差分情報蓄積部２０３に蓄積する。差分情報蓄積部２０３に蓄積するクエリは、トランザクション制御ＳＱＬ、参照系ＳＱＬ及び更新系ＳＱＬを含む全てのＳＱＬが対象となる。
【００４９】
サーバ制御部２１０がスナップショットの作成指示を送出すると、当該スナップショットは新規のサーバ１００に転送され、このサーバ１００からサーバ制御部２１０に対して差分情報転送要求が送出される。サーバ制御部２１０は、差分情報転送要求を受信すると、新規のサーバ１００に対して差分情報蓄積部２０３に蓄積されているクエリを古いものから順次送信する。差分情報蓄積部２０３に蓄積されているＳＱＬを全て送出すると、サーバ制御部２１０は、新規サーバ１００をシステムに組み込むべくサーバ管理表２０１を更新する。
【００５０】
ここで、サーバ制御部２１０は、差分情報の送出中にクライアント５００又はデータベース一致検査装置６００から新たなクエリを受信する場合があるが、この場合は当該クエリを差分情報蓄積部２０３の最後に追加するとともに正常稼働中のサーバ１００へ送信すれば良い。ただし、クライアント５００等のクエリ送出頻度が高い場合などには、差分情報の送出終了まで、すなわち同期化終了まで長時間要する場合が考えられる。そこで、差分情報蓄積部２０３における未送信の差分情報が所定件数以下となったら、クライアント５００等からのクエリを一時保留して差分情報の送出のみを行い、まず差分情報の送出を完了させる。そして、前述のように新規サーバ１００をシステムに組み込むべくサーバ管理表２０１を更新した後に、保留していたクエリ処理を再開すると好適である。
【００５１】
クライアント５００は、多重化データベースシステムに対して更新クエリ（データベースを更新するリクエスト）や参照クエリ（データベースの内容を参照するリクエスト）などを発行するものである。
【００５２】
データベース一致検査装置６００は、クライアント５００と同様に多重化データベースシステムのクライアントとして動作するものであり、各サーバ１００のデータベース１０１が互いに一致しているか否かを確認するためのクエリを発行する。このクエリは、参照系のものであり、例えば所定のテーブルｔｅｓｔ＿ｔａｂｌｅに対する「ＳＥＬＥＣＴ  ＊  ＦＲＯＭ  ｔｅｓｔ＿ｔａｂｌｅ」などである。データベース一致検査装置６００は、定期的に又はオペレータ等の指示に応じて当該検査用クエリの発行を行う。
【００５３】
次に、本実施の形態に係る多重化データベースシステムの動作について図面を参照して説明する。まず、サーバ１００ａと１００ｂが正常に動作している場合の動作を図６から図８を参照して説明する。
【００５４】
初期状態では、データベース１０１ａと１０１ｂは完全に同一であり、サーバ管理表２０１は図７のようになっているものとする。また、トランザクション管理表２０２と差分情報蓄積部２０３は空であるとする。各サーバ１００ａ，１００ｂには、テーブルｔｅｓｔ＿ｔａｂｌｅが存在しているとする。
【００５５】
クライアント５００ａが172.17.1.1宛にトランザクション開始ＳＱＬを含んだパケットを送信すると、仲介装置２００はそのパケットを受信する（ステップＳ１）。サーバ制御部２１０は、トランザクションが開始されたことを検知し、トランザクション管理表２０２にクライアント５００ａのＩＰアドレスとトランザクション番号を登録する（ステップＳ２）。図８にこのときのトランザクション管理表２０２を示す。そして、このパケットに係るクエリを送信状態「未送信」で送信キュー２０４に入れる。
【００５６】
サーバ制御部２１０は、送信キュー２０４から当該「未送信」のクエリを取り出し、サーバ管理表２０１を見て正常稼働している全てのサーバ１００に該パケットを送信する。この場合、サーバ１００ａと１００ｂが正常稼働しているので、サーバ制御部２１０はサーバ１００ａとサーバ１００ｂへ該パケットを転送する（それぞれステップＳ３とＳ４）。そして、各サーバ１００への送信が完了したので送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。仲介装置２００は、トランザクションが正常に開始されたことを通知する応答パケットをサーバ１００ａから受信するが（ステップＳ５）、この時点では、未だ全ての応答パケットが揃っているわけではないので（この場合、サーバ１００ｂからの応答パケットが来ていない）、サーバ制御部２１０は何もせずにサーバ１００ｂからの応答パケットを待つ。そして、トランザクションが正常に開始されたことを通知する応答パケットをサーバ１００ｂから受信すると（ステップＳ６）、これで全ての応答パケットが揃ったので、サーバ制御部２１０はそれらの応答パケットを互いに比較することでサーバ１００に障害が発生しているか否かをチェックする（ステップＳ７）。この場合、２つの応答パケットは共にトランザクションが正常に開始されたことを示すパケットであるため、障害は無いと判断し応答パケットの１つをクライアント５００ａへ転送する（ステップＳ８）。
【００５７】
次に、クライアント５００ａは、テーブルｔｅｓｔ＿ｔａｂｌｅを更新するＳＱＬ（ＵＰＤＡＴＥ）を含んだパケットを172.17.1.1へ送信する（ステップＳ９）。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。そして、送信キュー２０４から当該クエリを取り出し、サーバ管理表２０１を見て正常稼働しているサーバ、この場合、サーバ１００ａと１００ｂへ該パケットを転送する（それぞれステップＳ１０とＳ１１）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。サーバ１００ａは正常にＵＰＤＡＴＥ完了したことを通知する応答パケットを仲介装置２００に送信し、仲介装置２００がこの応答パケットを受信する（ステップＳ１２）。この時点では全ての応答パケットが全て揃っているわけではないので、サーバ制御部２１０は何もせず待機する。そして、正常にＵＰＤＡＴＥ完了したことを通知する応答パケットをサーバ１００ｂから受信すると（ステップＳ１３）、これで応答パケットが全て揃ったので、サーバ制御部２１０はそれら応答パケットを互いに比較することでサーバ１００に障害が発生しているか否かをチェックする（ステップＳ１４）。この場合、２つの応答パケットは共にＵＰＤＡＴＥ成功したことを示すパケットであるため、障害は無いと判断し応答パケットの１つをクライアント５００ａへ転送する（ステップＳ１５）。
【００５８】
次に、クライアント５００ａは、テーブルｔｅｓｔ＿ｔａｂｌｅへの更新を確定する（実際にデータベースを更新する）ＳＱＬ（ＣＯＭＭＩＴ）を含んだパケットを172.17.1.1へ送信する（ステップＳ１６）。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。そして、送信キュー２０４から当該クエリを取り出し、サーバ管理表２０１を見て正常稼働しているサーバ、この場合、サーバ１００ａとサーバ１００ｂへ該パケットを転送する（それぞれステップＳ１７とＳ１８）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。サーバ１００ａは正常にＣＯＭＭＩＴ完了したことを通知するパケットを仲介装置２００に送信し、仲介装置２００がこの応答パケットを受信する（ステップＳ１９）。この時点では全ての応答パケットが全て揃っているわけではないので、サーバ制御部２１０は何もせず待機する。そして、正常にＣＯＭＭＩＴ完了したことを通知する応答パケットをサーバ１００ｂから受信すると（ステップＳ２０）、これで応答パケットが全て揃ったので、サーバ制御部２１０はそれら応答パケットを互いに比較することでサーバ１００に障害が発生しているか否かをチェックする（ステップＳ２１）。この場合、２つの応答パケットは共にＣＯＭＭＩＴ成功したことを示すパケットであるため、障害は無いと判断する。ＣＯＭＭＩＴが正常に完了したことから、トランザクションが終了したことが分かるので、サーバ制御部２１０はトランザクション管理表２０２からこのトランザクションの登録を削除する（ステップＳ２２）。このときのトランザクション管理表２０２は再び初期状態（すなわち空）になる。サーバ制御部２１０は応答パケットの１つをクライアント５００ａへ転送する（ステップＳ２３）。
【００５９】
次に、サーバ１００ｂが故障などで障害になった場合の動作を図９から図１１を参照して説明する。初期状態では、データベース１０１ａと１０１ｂは完全に同一であり、サーバ管理表２０１は前述した図７のようになっているとする。また、トランザクション管理表２０２と差分情報蓄積部２０３は空であるとする。
【００６０】
クライアント５００ａが172.17.1.1宛にトランザクション開始ＳＱＬ（ＢＥＧＩＮ）を含んだパケットを送信すると、仲介装置２００はそのパケットを受信する（ステップＳ３０）。サーバ制御部２１０は、トランザクションが開始されたことを検知し、トランザクション管理表２０２にクライアント５００ａのＩＰアドレスとトランザクション番号を登録する（ステップＳ３１）。図１０にこのときのトランザクション管理表２０２を示す。そして、このパケットに係るクエリを送信状態「未送信」で送信キュー２０４に入れる。
【００６１】
サーバ制御部２１０は、送信キュー２０４から当該「未送信」のクエリを取り出し、サーバ管理表２０１を見て正常稼働している全てのサーバ１００、この場合、サーバ１００ａと１００ｂへ該パケットを転送する（それぞれステップＳ３２とＳ３３）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。仲介装置２００は、トランザクションが正常に開始されたことを通知する応答パケットをサーバ１００ａから受信するが（ステップＳ３４）、この時点では、未だ全ての応答パケットが揃っているわけではないので（この場合、サーバ１００ｂからの応答パケットが来ていない）、サーバ制御部２１０は何もせずにサーバ１００ｂからの応答パケットを待つ。そして、トランザクションが正常に開始されたことを通知する応答パケットをサーバ１００ｂから受信すると（ステップＳ３５）、これで全ての応答パケットが揃ったので、サーバ制御部２１０はそれら応答パケットを互いに比較することでサーバ１００に障害が発生しているか否かをチェックする（ステップＳ３６）。この場合、２つの応答パケットは共にトランザクションが正常に開始されたことを示すパケットであるため、障害は無いと判断し応答パケットの１つをクライアント５００ａへ転送する（ステップＳ３７）。
【００６２】
ここで、サーバ１００ｂは、ステップＳ３５で応答パケットを返した後、故障などの障害が発生してダウンしたものとする（ステップＳ３８）。
【００６３】
次に、クライアント５００ａは、テーブルｔｅｓｔ＿ｔａｂｌｅを更新するＳＱＬ（ＵＰＤＡＴＥ）を含んだパケットを172.17.1.1へ送信する（ステップＳ３９）。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。そして、送信キュー２０４から当該クエリを取り出し、サーバ管理表２０１を見て正常稼働しているサーバ、この場合、サーバ１００ａと１００ｂへ該パケットを転送する（それぞれステップＳ４０とＳ４１）。この時点では、サーバ制御部２１０はサーバ１００ｂのダウンを知らないので、サーバ１００ｂが正常稼働しているという情報がサーバ管理表２０１に格納されたままである。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。サーバ１００ａは正常にＵＰＤＡＴＥ完了したことを通知する応答パケットを仲介装置２００に送信し、仲介装置２００がこの応答パケットを受信する（ステップＳ４２）。この時点では応答パケットが全て揃っているわけではないので、サーバ制御部２１０は何もせず待機する。しかし、サーバ１００ｂはダウンしているのでサーバ１００ｂからの応答パケットはいつまで経っても仲介装置２００には届かない。これによりサーバ制御部２１０はタイムアウトし、サーバ１００ｂのダウンを検知する。そして、サーバ制御部２１０はサーバ管理表２０１のサーバ１００ｂをａｃｔｉｖｅからｄｏｗｎ（サーバ停止状態）に書き換えることにより当該サーバ１００ｂをシステムから切り離す（ステップＳ４３）。そのときのサーバ管理表２０１を図１１に示す。次に、サーバ制御部２１０は、システムから切り離したサーバ１００ｂに対して再起動指示を送出する（ステップＳ４４）。もっとも、ここではサーバ１００ｂはダウンしているので、当該再起動指示に対する処理が行われることはない。次に、サーバ制御部２１０は応答パケットをクライアント５００ａへ転送する（ステップＳ４５）。ここでは、クライアント５００ａにとって、サーバ１００ｂが障害になったかどうかは認識せず、今までと同様に仮想サーバ８００からサービスを受けることができることに注目すべきである。
【００６４】
次に、クライアント５００ａは、テーブルｔｅｓｔ＿ｔａｂｌｅへの更新を確定するＳＱＬ（ＣＯＭＭＩＴ）を含んだパケットを172.17.1.1へ送信する（ステップＳ４６）。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。そして、送信キュー２０４から当該クエリを取り出し、サーバ管理表２０１を見て正常稼働しているサーバ、この場合、サーバ１００ａのみへ該パケットを転送する（ステップＳ４７）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。サーバ１００ａは正常にＣＯＭＭＩＴ完了したことを通知する応答パケットを送信し、仲介装置２００がこの応答パケットを受信する（ステップＳ４８）。ＣＯＭＭＩＴが正常に完了したことから、トランザクションが終了したことが分かるので、サーバ制御部２１０はトランザクション管理表２０２からこのトランザクションの登録を削除する（ステップＳ４９）。このときのトランザクション管理表２０２は再び初期状態（すなわち空）になる。サーバ制御部２１０は応答パケットをクライアント５００ａへ転送する（ステップＳ５０）。
【００６５】
ここで、ステップＳ４７によって、サーバ１００ａのデータベース１０１ａは、クライアント５００ａからのＵＰＤＡＴＥ（ステップＳ３９）が反映されているのに対して、サーバ１００ｂのデータベース１０１ｂにはクライアント５００ａからのＵＰＤＡＴＥ（ステップＳ３９）が反映されていない、つまり、データベース１０１ａとデータベース１０１ｂは非同期状態になったことに注目すべきである。
【００６６】
次に、並行処理される複数のトランザクションについて、各サーバ１００における処理順序が異なった場合について図１２及び図１３のシーケンスチャートを参照して説明する。ここでは、図５４のテーブルｔａｂｌｅ＿ｔｅｓｔに対して、図５５のトランザクションＴ１をクライアント５００ａが発行し、同図のトランザクションＴ２をクライアント５００ｂが発行したものとする。前述したように、この２つのトランザクションＴ１，Ｔ２の処理後におけるデータベース１０１のデータは、各トランザクションの処理順序によって異なった内容になることに注意されたい。
【００６７】
図１２に示すように、クライアント５００ａがトランザクションＴ１を開始するクエリ（ＢＥＧＩＮ）を仲介装置２００に送信し（ステップＳ１０１）、一方、クライアント５００ｂがトランザクションＴ２を開始するクエリ（ＢＥＧＩＮ）を仲介装置２００に送信する（ステップＳ１０２）。仲介装置２００のサーバ制御部２１０は、各クエリをそれぞれ正常稼働中のサーバ１００ａ及び１００ｂに転送する（ステップＳ１０３〜Ｓ１０６）。そして、各サーバ１００ａ及び１００ｂからのそれぞれ応答（ステップＳ１０７〜Ｓ１１０）について正当性をチェックし（図示省略）、正当な応答の１つをそれぞれの要求元のクライアント５００ａ又は５００ｂに転送する（ステップＳ１１１〜Ｓ１１２）。
【００６８】
仲介装置２００からＢＥＧＩＮに対する応答を受信したクライアント５００ａ及び５００ｂは、それぞれのトランザクションに属する次のクエリを仲介装置２００に送信する。本実施例では、クライアント５００ａはトランザクションＴ１のＵＰＤＡＴＥクエリを仲介装置２００に送信し（ステップＳ１１３）、クライアント５００ｂはトランザクションＴ２のＵＰＤＡＴＥクエリを仲介装置２００に送信する（ステップＳ１１４）。クライアント５００ａ及び５００ｂからクエリを受信した仲介装置２００のサーバ制御部２１０は、当該クエリをそれぞれ正常稼働中のサーバ１００ａ及び１００ｂに転送する（ステップＳ１１５〜Ｓ１１８）。
【００６９】
サーバ１００ａではトランザクションＴ１のＵＰＤＡＴＥクエリがトランザクションＴ２のＵＰＤＡＴＥクエリより先に処理されたとする。トランザクションＴ１のＵＰＤＡＴＥクエリを処理したサーバ１００ａは、処理結果を仲介装置２００に送信する（ステップＳ１１９）。このとき、トランザクションＴ１のＵＰＤＡＴＥクエリによるｔｅｓｔ＿ｔａｂｌｅの当該更新対象行は、トランザクションＴ１がＣＯＭＭＩＴされるまでロックされる。一方、トランザクションＴ２のＵＰＤＡＴＥクエリはロックされている行が更新対象となっているので、当該クエリの処理はロックが解除されるまで保留される（ステップＳ１２０）。
【００７０】
他方、サーバ１００ｂではトランザクションＴ２のＵＰＤＡＴＥクエリがトランザクションＴ１のＵＰＤＡＴＥクエリより先に処理されたとする。トランザクションＴ２のＵＰＤＡＴＥクエリを処理したサーバ１００ｂは、処理結果を仲介装置２００に送信する（ステップＳ１２１）。このとき、トランザクションＴ２のＵＰＤＡＴＥクエリによるｔｅｓｔ＿ｔａｂｌｅの当該更新対象行は、トランザクションＴ２がＣＯＭＭＩＴされるまでロックされる。一方、トランザクションＴ１のＵＰＤＡＴＥクエリはロックされている行が更新対象となっているので、当該クエリの処理はロックが解除されるまで保留される（ステップＳ１２２）。
【００７１】
ここで、サーバ１００ａからはトランザクションＴ１のＵＰＤＡＴＥクエリの応答（ステップＳ１１９）が、サーバ１００ｂからはトランザクションＴ２のＵＰＤＡＴＥクエリの応答（ステップＳ１２１）よりも先に仲介装置２００に到達したとする。
【００７２】
仲介装置２００のサーバ制御部２１０は、トランザクションＴ１のＵＰＤＡＴＥクエリについての応答を一方のサーバ１００ａから受信したが（ステップＳ１１９）、他方のサーバ１００ｂからの応答は受信していないので当該応答を待つ（ステップＳ１２３）。これは、前述したように、サーバ制御部２１０において、各サーバ１００ａ及び１００ｂからの応答を互いに比較して正当性を判断するためである。同様に、サーバ制御部２１０は、トランザクションＴ２のＵＰＤＡＴＥクエリについての応答を一方のサーバ１００ｂから受信したが（ステップＳ１２１）、他方のサーバ１００ａからの応答は受信していないので当該応答を待つ（ステップＳ１２４）。
【００７３】
前述のようにサーバ１００ｂにおいてトランザクションＴ１のＵＰＤＡＴＥクエリの処理はロック解除待ちされているので（ステップＳ１２２）、サーバ制御部２１０における当該クエリに対する応答待ち（ステップＳ１２３）はタイムアウトする（ステップＳ１２５）。これにより、サーバ制御部２１０は、サーバ１００ｂが障害になったと判断し、前記ステップＳ１２４の応答待ちをキャンセルし、さらにサーバ管理表２０１におけるサーバ１００ｂの稼働状態をｄｏｗｎに変更することで当該サーバ１００ｂをシステムから切り離す（ステップＳ１２６）。そして、サーバ制御部２１０は、図１３に示すように、システムから切り離したサーバ１００ｂに対して再起動指示を送信するとともに（ステップＳ１２７）、サーバ１００ｂからの応答待ちはキャンセルしてサーバ１００ａからの応答をクライアント５００ａに返す（ステップＳ１２８）。
【００７４】
サーバ１００ｂは、仲介装置２００からの再起動指示を受信すると、自身の再起動を開始する（ステップＳ１２９）。
【００７５】
トランザクションＴ１のＵＰＤＡＴＥクエリについて応答を受信したクライアント５００ａは、更新を確定するクエリ（ＣＯＭＭＩＴ）を仲介装置２００に送信する（ステップＳ１３０）。仲介装置２００のサーバ制御部２１０は、クライアント５００ａからクエリを受信すると、サーバ管理表２０１を参照して正常稼働中のサーバ１００ａに当該クエリを転送する（ステップＳ１３１）。
【００７６】
サーバ１００ａでは、トランザクションＴ１のＣＯＭＭＩＴクエリを処理することによりロックが解除されてトランザクションＴ２の処理が再開可能となる（ステップＳ１３２）。これにより、サーバ１００ａはトランザクションＴ１のＣＯＭＭＩＴクエリに対する応答を仲介装置２００に返し（ステップＳ１３３）、仲介装置２００のサーバ制御部２１０は当該応答をクライアント５００ａに転送する（ステップＳ１３４）。次いで、サーバ１００ａはトランザクションＴ２のＵＰＤＡＴＥクエリに対する応答を仲介装置２００に返し（ステップＳ１３５）、仲介装置２００のサーバ制御部２１０は当該応答をクライアント５００ｂに転送する（ステップＳ１３６）。
【００７７】
トランザクションＴ２のＵＰＤＡＴＥクエリについて応答を受信したクライアント５００ｂは、更新を確定するクエリ（ＣＯＭＭＩＴ）を仲介装置２００に送信する（ステップＳ１３７）。仲介装置２００のサーバ制御部２１０は、クライアント５００ｂからクエリを受信すると、サーバ管理表２０１を参照して正常稼働中のサーバ１００ａに当該クエリを転送する（ステップＳ１３８）。サーバ１００ａは当該クエリを処理して応答を仲介装置２００に返し（ステップＳ１３９）、仲介装置２００のサーバ制御部２１０は当該応答をクライアント５００ｂに転送する（ステップＳ１４０）。
【００７８】
ここで、システムから切り離されたサーバ１００ｂの再起動が完了したものとする（ステップＳ１４１）。サーバ１００ｂは、再起動が完了すると仲介装置２００に対してデータベース同期化要求を送信する（ステップＳ１４２）。仲介装置２００のサーバ制御部２１０は、正常稼働中のサーバ１００ａと協働して、サーバ１００ａのデータベース１０１ａと、サーバ１００ｂのデータベース１０１ｂとを同期化させる処理を行う（ステップＳ１４３）。この同期化処理の詳細については後述する。サーバ制御部２１０は、同期化処理が完了したら、サーバ管理表２０１についてサーバ１００ｂの稼働状態をａｃｔｉｖｅに変更することで当該サーバ１００ｂを再びシステムに組み込む（ステップＳ１４４）。
【００７９】
以上の処理により、並行処理される複数のトランザクションについて、各サーバ１００における処理順序が異なった場合であっても、各サーバ１００間でデータベース１０１の同期が保たれる。
【００８０】
次に、図５４のテーブルｔｅｓｔ＿ｔａｂｌｅに対して、図５６のトランザクションＴ３をクライアント５００ａが発行し、同図のトランザクションＴ４をクライアント５００ｂが発行した場合について図１４及び図１５のシーケンスチャートを参照して説明する。この２つのトランザクションＴ３，Ｔ４の処理後におけるデータベース１０１のデータは、各トランザクションの処理順序には影響されない。しかしながら、前述したように、トランザクションＴ４におけるＳＥＬＥＣＴの結果は各トランザクションＴ３，Ｔ４の処理順序によって異なった内容になることに注意されたい。
【００８１】
クライアント５００ａがトランザクションＴ３を開始するクエリ（ＢＥＧＩＮ）を仲介装置２００に送信すると（ステップＳ２０１）、仲介装置２００のサーバ制御部２１０は、サーバ管理表２０１を参照して正常稼働中のサーバ１００ａ及び１００ｂに転送する（ステップＳ２０２，Ｓ２０３）。サーバ制御部２１０は、各サーバ１００ａ及び１００ｂからの応答を受信すると（ステップＳ２０４，Ｓ２０５）、正当な応答の１つをクライアント５００ａに転送する（ステップＳ２０６）。
【００８２】
次いで、クライアント５００ａはトランザクションＴ３の更新クエリ（ＵＰＤＡＴＥ）を仲介装置２００に送信する（ステップＳ２０７）。一方、クライアント５００ｂはトランザクションＴ４を開始するクエリ（ＢＥＧＩＮ）を仲介装置２００に送信する（ステップＳ２０８）。
【００８３】
仲介装置２００のサーバ制御部２１０は、トランザクションＴ３のＵＰＤＡＴＥクエリを正常稼働中のサーバ１００ａ及び１００ｂに転送するとともに（ステップＳ２０９，Ｓ２１０）、トランザクションＴ４のＢＥＧＩＮクエリを正常稼働中のサーバ１００ａ及び１００ｂに転送する（ステップＳ２１１，Ｓ２１２）。そして、仲介装置２００のサーバ制御部２１０は、トランザクションＴ３のＵＰＤＡＴＥクエリに対する応答を各サーバ１００ａ及び１００ｂから受信すると（ステップＳ２１３，Ｓ２１４）、正当な応答の１つをクライアント５００ａに転送する（ステップＳ２１５）。また、トランザクションＴ４のＢＥＧＩＮクエリに対する応答を各サーバ１００ａ及び１００ｂから受信すると（ステップＳ２１６，Ｓ２１７）、正当な応答の１つをクライアント５００ｂに転送する（ステップＳ２１８）。
【００８４】
次いで、クライアント５００ａはトランザクションＴ３を確定するクエリ（ＣＯＭＭＩＴ）を仲介装置２００に送信する（ステップＳ２１９）。一方、クライアント５００ｂはトランザクションＴ４の参照クエリ（ＳＥＬＥＣＴ）を仲介装置２００に送信する（ステップＳ２２０）。
【００８５】
仲介装置２００のサーバ制御部２１０は、トランザクションＴ３のＣＯＭＭＩＴクエリを正常稼働中のサーバ１００ａ及び１００ｂに転送するとともに（ステップＳ２２１，Ｓ２２２）、トランザクションＴ４のＳＥＬＥＣＴクエリを正常稼働中のサーバ１００ａ及び１００ｂに転送する（ステップＳ２２３，Ｓ２２４）。
【００８６】
ここで、一方のサーバ１００ａでは、トランザクションＴ３のＣＯＭＭＩＴクエリがトランザクションＴ４のＳＥＬＥＣＴクエリより先に処理され（ステップＳ２２５，Ｓ２２６）、他方のサーバ１００ｂでは、トランザクションＴ４のＳＥＬＥＣＴクエリがトランザクションＴ３のＣＯＭＭＩＴクエリより先に処理されたものとする（ステップＳ２２７，Ｓ２２８）。これにより、トランザクションＴ４のＳＥＬＥＣＴクエリの応答は、サーバ１００ａからの応答（ステップＳ２２６）と、サーバ１００ｂからの応答（ステップＳ２２７）とは異なったものとなったとする。
【００８７】
仲介装置２００のサーバ制御部２１０は、トランザクションＴ４のＳＥＬＥＣＴクエリに対する応答が、各サーバ１００ａ及び１００ｂ間で不一致となっているので、何れかのサーバ１００ａ又は１００ｂを選定し、このサーバ１００ａからの応答を正当なものとする（ステップＳ２２９）。ここで、サーバ１００の選定方法としては、例えば予めＭａｓｔｅｒサーバを定めておいて、このＭａｓｔｅｒサーバを選定する方法、最初に応答を返したサーバを選定する方法、ラウンドロビンにより選定サーバを順次選定する方法、ランダムに選定する方法、各サーバの処理能力・処理負荷などにより選定する方法などが挙げられる。本実施の形態では、サーバ１００ａをＭａｓｔｅｒサーバとして該サーバ１００ａを正当な応答を返したサーバとして選定する。サーバ制御部２１０は、正当でない応答を返したサーバ１００ｂについて、サーバ管理表２０１の稼働状態をｄｏｗｎに変更することにより当該サーバ１００ｂをシステムから切り離す（ステップＳ２３０）。そして、図１５に示すように、当該サーバ１００ｂに対して再起動指示を送信する（ステップＳ２３１）。
【００８８】
サーバ１００ｂは、仲介装置２００からの再起動指示を受信すると、自身の再起動を開始する（ステップＳ２３２）。
【００８９】
仲介装置２００のサーバ制御部２１０は、選定したサーバ１００ａから受信した、トランザクションＴ４のＳＥＬＥＣＴクエリに対する応答及びトランザクションＴ３のＣＯＭＭＩＴクエリに対する応答を、それぞれ要求元のクライアント５００ａ，５００ｂに転送する（ステップＳ２３３，Ｓ２３４）。以降、各クライアント５００ａ，５００ｂからのクエリは、正常稼働中のサーバ１００ａで処理する。図１５の例では、クライアント５００ｂがトランザクションＴ４のＣＯＭＭＩＴクエリを仲介装置２００に送信すると（ステップＳ２３５）、仲介装置２００は当該クエリを正常稼働中のサーバ１００ａに転送する（ステップＳ２３６）。そして、仲介装置２００は、当該クエリに対する応答をサーバ１００ａから受信すると（ステップＳ２３７）、この応答を要求元のクライアント５００ｂに返す（ステップＳ２３８）。
【００９０】
ここで、システムから切り離されたサーバ１００ｂの再起動が完了したものとする（ステップＳ２３９）。サーバ１００ｂは、再起動が完了すると仲介装置２００に対してデータベース同期化要求を送信する（ステップＳ２４０）。仲介装置２００のサーバ制御部２１０は、正常稼働中のサーバ１００ａと協働して、サーバ１００ａのデータベース１０１ａと、サーバ１００ｂのデータベース１０１ｂとを同期化させる処理を行う（ステップＳ２４１）。この同期化処理の詳細については後述する。サーバ制御部２１０は、同期化処理が完了したら、サーバ管理表２０１についてサーバ１００ｂの稼働状態をａｃｔｉｖｅに変更することで当該サーバ１００ｂを再びシステムに組み込む（ステップＳ２４２）。
【００９１】
以上の処理により、並行処理される複数のトランザクションについて、各サーバ１００における処理順序が異なった場合であっても、クライアント５００には１つの正しい応答のみが処理結果として返される。
【００９２】
なお、この例では、２つのトランザクションＴ３及びＴ４に属するクエリの処理順序が異なっても当該トランザクションＴ３及びＴ４に属する各クエリの中で同一行を更新するクエリは存在しないので、クエリの処理順序が異なることによる各データベース１０１間の不整合は生じない。したがって、この例に限定して考えると、データベース１０１の同期化のための各処理（ステップＳ２３０〜Ｓ２３２，Ｓ２３９〜Ｓ２４２）は不要であるとも考えられる。しかし、本実施の形態では、何らかの原因でデータベース１０１の不整合が発生し、当該不整合について前記ステップＳ２２９を契機に検出した場合にも対処できるように、データベース１０１の同期化のための各処理を実施するようにした。
【００９３】
次に、前記ステップＳ１４３及びＳ２４１における同期化処理の詳細について説明する。本発明における同期化処理では、同期化処理開始時において正常稼働しているサーバ１００でデータベース１０１のスナップショットを作成し、このスナップショットを同期化対象の新規サーバ１００に転送する。そして新規サーバ１００においてスナップショットからデータベース１０１の復元を行う。さらに、この処理中に受信したクライアント５００からのクエリを仲介装置２００において差分情報として蓄積する。そして、新規サーバ１００がスナップショットからのデータベース１０１の復元が完了したら仲介装置２００から差分情報を取得して、この差分情報を処理する。
【００９４】
なお、前述したように、サーバ１００は自身が起動されるとデータベース同期化要求を仲介装置２００に送信するので、同期化処理の実施は、仲介装置２００からの再起動指示に応じた再起動時に限られない。すなわち、サーバ１００が障害となってシステムから切り離され、その後にシステムに再び組み込む際にも実施される。また、システムを構成するサーバを増設する場合にも実施される。
【００９５】
以下に、サーバ１００ｂをシステムに組み込む場合の同期化動作を図１６から図２４を参照して説明する。このとき注目すべきポイントは、クライアント５００ａ及び５００ｂに対するサービスを続けたままサーバ１００ｂを追加する、つまり、システムダウンさせずにデータベース１０１ａと１０１ｂを同期させることである。
【００９６】
データベース１０１ｂはデータベース１０１ａと同期がとれていない状態、つまり、同一ではない状態である。例えば、データベース１０１ｂは、再起動直前のデータ又は障害発生直前のデータを保持しているかもしれないし、全く新しいサーバの場合には、データを全く持っていない状態かもしれない。本発明では、前者の場合でも古いデータは削除し、データベース１０１ｂはデータを全く保持していないものとしてシステムに組み込む。つまり、古いデータを保持している必要はない。
【００９７】
ここでは、サーバ管理表２０１は図１９のようになっているとする。また、トランザクション管理表２０２と差分情報蓄積部２０３は空であるとする。
【００９８】
図１６に示すように、クライアント５００ａが172.17.1.1宛のトランザクション開始ＳＱＬ（ＢＥＧＩＮ）を含んだパケットを送信すると、仲介装置２００はそのパケットを受信する（ステップＳ３０１）。サーバ制御部２１０は、トランザクションが開始されたことを検知し、トランザクション管理表２０２にクライアント５００ａのＩＰアドレスとトランザクション番号を登録する（ステップＳ３０２）。図２０にこのときのトランザクション管理表２０２を示す。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。そして、送信キュー２０４から当該クエリを取り出し、サーバ管理表２０１を見て正常稼働しているサーバ、この場合、サーバ１００ａへ該パケットを転送する（ステップＳ３０３）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。仲介装置２００は、トランザクションが正常に開始されたことを通知する応答パケットをサーバ１００ａから受信すると（ステップＳ３０４）、応答パケットをクライアント５００ａへ転送する（ステップＳ３０５）。
【００９９】
ここで、サーバ１００ｂが再起動したものとする（ステップS３０６）。これにより、サーバ１００ｂのデータベース制御部１０２ｂは、データベース同期化要求を仲介装置２００へ送信する（ステップＳ３０７）。
【０１００】
データベース同期化要求を受信したサーバ制御部２１０は、トランザクション管理表２０２をチェックし現在実行中のトランザクションが存在するかどうかを確認するとともに、実行中トランザクションの情報を記録しておく（ステップＳ３０８）。図２０より、クライアント５００ａ，トランザクション番号３のトランザクションが実行中なので、データベース同期化動作はこのトランザクションの終了を待つと同時に、新しいトランザクション開始要求を受け取った場合は、その要求をサーバ１００ａへ転送することを遅らせる（ステップＳ３０９）。つまり、同期化動作は実行中のトランザクションが全くない状態で始める。この新規トランザクションの開始要求についての転送遅延処理は、送信キュー２０４での保留という手段で実現する。
【０１０１】
次に、クライアント５００ａは、テーブルｔｅｓｔ＿ｔａｂｌｅを更新するＳＱＬ（ＵＰＤＡＴＥ）を含んだパケットを172.17.1.1へ送信する（ステップＳ３１０）。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。このクエリは前記ステップＳ３０８で記憶したトランザクション情報からデータベース同期化要求時に実行していたトランザクションに属するものと判定できるので、サーバ制御部２１０は、送信キュー２０４から当該クエリを取り出し、サーバ管理表２０１を見て正常稼働しているサーバ、この場合、サーバ１００ａへ該パケットを転送する（ステップＳ３１１）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。サーバ１００ａは正常にＵＰＤＡＴＥ完了したことを通知する応答パケットを仲介装置２００に送信し、仲介装置２００がこの応答パケットを受信する（ステップＳ３１２）。サーバ制御部２１０は、応答パケットをクライアント５００ａへ転送する（ステップＳ３１３）。
【０１０２】
次に、クライアント５００ｂが172.17.1.1宛にトランザクション開始ＳＱＬ（ＢＥＧＩＮ）を含んだパケットを送信すると、仲介装置２００はそのパケットを受信する（ステップＳ３１４）。サーバ制御部２１０は、このパケットによりトランザクションが開始されたことを検知し、トランザクション管理表２０２にクライアント５００ｂのＩＰアドレスとトランザクション番号を登録する（ステップＳ３１５）。図２１にこのときのトランザクション管理表２０２を示す。そして、このパケットに係るクエリを送信状態「未送信」で送信キュー２０４に入れる。しかし、この時点では同期化処理準備のため、新規トランザクション開始クエリは送信キュー２０４に保持したままサーバ１００ａへは転送しない（ステップＳ３１６）。
【０１０３】
次に、クライアント５００ａは、テーブルｔｅｓｔ＿ｔａｂｌｅへの更新を確定するＳＱＬ（ＣＯＭＭＩＴ）を含んだパケットを172.11.1.1へ送信する（ステップＳ３１７）。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。このクエリは前記ステップＳ３０８で記憶したトランザクション情報からデータベース同期化要求時に実行していたトランザクションに属するものと判定できるので、サーバ制御部２１０は、送信キュー２０４から当該クエリを取り出し、サーバ管理表２０１を見て正常稼働しているサーバ、この場合、サーバ１００ａのみへ該パケットを転送する（ステップＳ３１８）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。サーバ１００ａは正常にＣＯＭＭＩＴ完了したことを通知する応答パケットを仲介装置２００に送信し、仲介装置２００がこの応答パケットを受信する（ステップＳ３１９）。ＣＯＭＭＩＴが正常に完了したことから、トランザクションが終了したことが分かるので、サーバ制御部２１０はトランザクション管理表２０２からこのトランザクションの登録を削除する（ステップＳ３２０）。この時のトランザクション管理表２０２を図２２に示す。サーバ制御部２１０は応答パケットをクライアント５００ａへ転送する（ステップＳ３２１）。
【０１０４】
ここで、新規サーバ１００ｂからのデータベース同期化要求時に実行していたトランザクションが全て無くなったので、サーバ制御部２１０は同期化動作を開始する（ステップＳ３２２）。具体的には、図１７に示すように、まず、サーバ制御部２１０は、正常稼働しているサーバ１００ａに対して同期化指示（スナップショット作成指示）のパケットを送信する（ステップＳ３２３）。なお、前記ステップＳ３２２において、トランザクション管理表２０２に記録されているトランザクションがデータベース同期化要求時に実行中であったものか、又は、その後にクライアント５００から受信したものかを判定するには、前記ステップＳ３０８で記録しておいたデータベース同期要求時のトランザクション情報を参照すればよい。
【０１０５】
同期化指示を受け取ったサーバ１００ａのデータベース制御部１０２ａは、データベース１０１ａのスナップショットを作り出す（ステップＳ３２４）。ここで、このスナップショットは、同期化指示を受け取った時点でのデータベース全体のバックアップデータやデータベースを復元するための情報であり、同期化指示後の更新は反映されていないことに注目すべきである。
【０１０６】
サーバ１００ａのデータベース制御部１０２ａは、スナップショット作成が完了すると（ステップＳ３２５）、その旨を仲介装置２００へ通知する（ステップＳ３２６）。
【０１０７】
データベース制御部１０２ａは作成したスナップショットをサーバ１００ｂへ転送し、サーバ１００ｂのデータベース制御部１０２ｂは、サーバ１００ａから受信したスナップショットからデータベースを復元する（ステップＳ３２７）。このスナップショットの転送とデータベースの復元は、データベース１０１ａのサイズが大きければ大きいほど時間がかかるが、クライアントからのデータベースアクセスと並行して実行されるのでクライアントに対するサービスを止めることはない。
【０１０８】
スナップショット作成完了通知を受け取った仲介装置２００のサーバ制御部２１０は、クライアント５００へのサービスを再開する。この場合、処理せずに送信キュー２０４に保持していた、クライアント５００ｂからのＢＥＧＩＮを含んだパケットの処理を再開する。すなわち、サーバ制御部２１０は、転送せずに保持していたクライアント５００ｂからのＢＥＧＩＮ  ＳＱＬを含んだパケットを送信キュー２０４から取り出して差分情報蓄積部２０３に保存するとともに（ステップＳ３２８）、サーバ１００ａへ転送する（ステップＳ３２９）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。
【０１０９】
なお、ここではステップＳ３２９の処理をステップＳ３２７の後に説明したが、ステップＳ３２７の動作（スナップショットの転送）はクライアントへのサービスを妨げるものではないので、スナップショットの転送中にステップＳ３２９や後述のステップＳ３３０が行われてもよい。
【０１１０】
サーバ１００ａは、トランザクションが正常に開始されたことを通知する応答パケットを仲介装置２００に送信し、仲介装置２００がこの応答パケットを受信する（ステップＳ３３０）。仲介装置２００は、この応答パケットをクライアント５００ｂへ転送する（ステップＳ３３１）。
【０１１１】
次いで、クライアント５００ｂがテーブルｔｅｓｔ＿ｔａｂｌｅの更新ＳＱＬ（ＵＰＤＡＴＥ）のパケットを仲介装置２００に送信すると（ステップＳ３３２）、サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。そして、送信キュー２０４から当該クエリを取り出し、当該クエリを差分情報蓄積部２０３に保存するとともに（ステップＳ３３３）、正常稼働中のサーバ１００ａに当該パケットを送信する（ステップＳ３３４）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。ここで、サーバ１００ａはＵＰＤＡＴＥに失敗し、その旨を通知する応答パケットを仲介装置２００に送信したものとする（ステップＳ３３５）。仲介装置２００は、この応答パケットをクライアント５００ｂに送信する（ステップＳ３３６）。
【０１１２】
ＵＰＤＡＴＥ失敗の応答パケットを受信したクライアント５００ｂは、トランザクションを取り消すＳＱＬ（ＲＯＬＬＢＡＣＫ）のパケットを仲介装置に送信する（ステップＳ３３７）。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。そして、送信キュー２０４から当該クエリを取り出し、当該ＳＱＬを差分情報蓄積部２０３に保存するとともに（ステップＳ３３８）、正常稼働中のサーバ１００ａに当該パケットを送信する（ステップＳ３３９）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。そして、サーバ１００ａから正常にトランザクションがＲＯＬＬＢＡＣＫされたことを通知する応答パケットを受信すると（ステップＳ３４０）、トランザクション管理表２０２から当該トランザクションの登録を削除するとともに（ステップＳ３４１）、この応答パケットをクライアント５００ｂに送信する（ステップＳ３４２）。この時点での差分情報蓄積部２０３を図２３に示す。また、トランザクション管理表２０２は空になる。
【０１１３】
ここで、サーバ１００ｂにおいてスナップショットからのデータベース１０１ｂの復元が完了したものとする（ステップＳ３４３）。サーバ１００ｂはデータベース１０１ｂの復元が完了すると差分情報転送要求を仲介装置２００に送信する（ステップＳ３４４）。仲介装置２００のサーバ制御部２１０は、差分情報転送要求を受信すると、図１８に示すように、差分情報蓄積部２０３に蓄積されているデータを古いものから順にサーバ１００ｂに転送する処理を開始する（ステップＳ３４５）。
【０１１４】
前記ステップＳ３４５で差分情報蓄積部２０３に蓄積されている全てのクエリが転送・処理されることでデータベース１０１ａと１０１ｂは完全に一致した状態（同期状態）になるが、この転送処理中にクライアント５００から新たなクエリを受信する場合がある。例えば、図１８に例示するように、仲介装置２００は、クライアント５００ｂから新規トランザクションを開始するクエリ（ＢＥＧＩＮ）を受信する（ステップＳ３４６）。仲介装置２００は、当該新規トランザクションをトランザクション管理表２０２に登録する（ステップＳ３４７）。そして、当該クエリを送信キュー２０４に入れる。次いで、送信キュー２０４から当該クエリを取り出し、差分情報蓄積部２０３の最後に当該クエリを追加するとともに（ステップＳ３４８）、正常稼働中のサーバ１００ａに送信する（ステップＳ３４９）。そして、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。次いで、サーバ１００ａから応答パケットを受信すると（ステップＳ３５０）、当該応答パケットをクライアント５００ｂに転送する（ステップＳ３５１）。
【０１１５】
このように差分情報転送中にクライアント５００から受信したクエリは、正常稼働中のサーバ１００で処理するとともに、差分情報蓄積部２０３に蓄積していく。この処理を継続していくと、やがて差分情報蓄積部２０３に蓄積されているクエリは全て新規サーバ１００ｂに転送され、差分情報蓄積部２０３は空になり、これを契機に差分情報転送処理が終了する（ステップＳ３５２）。これによりデータベース１０１ａと１０１ｂは完全に一致した状態（同期状態）となるので同期化処理を終了する。以上で同期化処理は完了するので、図１３及び図１５を参照して前述したように、新規サーバ１００ｂについてのサーバ管理表２０１の稼働状態をａｃｔｉｖｅに変更することでシステムに当該サーバ１００ｂを追加することができる（図１３のステップＳ１４４，図１５のステップＳ２４２）。
【０１１６】
このような同期化処理により、もともとシステムに組み込まれていたが再起動や障害等のためにシステムから切り離されたサーバであっても、新規のサーバであっても、理論的には幾らでも追加できる。つまり、追加できるサーバ数に制限はない。
【０１１７】
なお、上記実施形態では、クライアント５００ａ及び５００ｂからの処理要求のみ多重化データベースシステムで処理する場合について説明したが、データベース一致検査装置６００からの処理要求も同様に処理すればよい。これは、多重化データベースシステムから見るとデータベース一致検査装置６００もクライアントコンピュータの１つだからである。ところで、データベース一致検査装置６００は、前述したように、定期的に又は必要に応じてデータベース一致検査用の参照クエリを仲介装置２００に送信する。これにより、何らかの理由でデータベース１０１間でデータの矛盾が生じた場合であっても、当該クエリによりデータベース１０１間の矛盾が検出され上記同期化処理が実行される。これにより、データベース１０１間の同期をより確実に図ることができる。
【０１１８】
以上のように本実施の多重化データベースシステムによれば、複数のトランザクションを並行処理しても各データベース間で矛盾の生じることがなく同期状態を保つことができる。
【０１１９】
本実施の形態の変形例について説明する。上記実施形態におけるデータベース同期化処理では、差分情報転送中にクライアント５００から新たなクエリを受信すると、当該クエリを差分情報蓄積部２０３に追記していた。このような処理では、差分情報の処理に時間がかかる場合や、クライアントからの受信するクエリの受信間隔が短い場合には、差分情報蓄積部２０３のデータが何時までたっても空にならなかったり空になるまで長時間要することになり、結果として新規サーバ１００ｂの組み込み処理完了まで長時間要することが考えられる。そこで、差分情報転送中に差分情報蓄積部２０３のエントリ数が所定数以下となったら、新規クエリの処理を一時保留して専ら差分情報の転送のみを行って差分情報蓄積部２０３を空にしてしまうと良い。以下、このような処理について図２４を参照して説明する。
【０１２０】
ここでは、新規のサーバ１００ｂがスナップショットからデータベース１０１ｂの復元処理中であるとする（ステップＳ４００）。そして、サーバ１００ｂにおいてデータベース１０１ｂの復元処理が完了し（ステップＳ４０１）、サーバ１００ｂが仲介装置２００に差分情報転送要求を送信した時点で（ステップＳ４０２）、差分情報蓄積部２０３には所定件数以上の差分情報が蓄積されているものとする。図２４の例では、ステップＳ４０３〜ステップＳ４０７によるＵＰＤＡＴＥのクエリが最新の差分情報として差分情報蓄積部２０３に記憶されているものとする。
【０１２１】
図２４に示すように、仲介装置２００のサーバ制御部２１０は、サーバ１００ｂから差分情報転送要求を受信すると、前述したように、差分情報蓄積部２０３に記憶されている各クエリを古いものから順にサーバ１００ｂに転送する処理を開始する（ステップＳ４０８）。
【０１２２】
サーバ制御部２１０は、クライアント５００ｂから新たなクエリを受信したとする。図２４の例では、サーバ制御部２１０は、クライアント５００ｂからデータを追加するＳＱＬ（ＩＮＳＥＲＴ）を含むパケットを受信する（ステップＳ４０９）。差分情報転送中に新規クエリを受信したサーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。そして、送信キュー２０４から当該クエリを取り出し、差分情報蓄積部２０３に蓄積されている未転送のクエリの件数が所定件数より多い場合には、このクエリを差分情報蓄積部２０３の最後に追記するとともに（ステップＳ４１０）、正常稼働中のサーバ１００ａに該パケットを転送する（ステップＳ４１１）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。サーバ制御部２１０は、ＩＮＳＥＲＴが成功したことを示す応答パケットをサーバ１００ａから受信すると（ステップＳ４１２）、この応答パケットをクライアント５００ｂに転送する（ステップＳ４１３）。
【０１２３】
ここで、仲介装置２００からサーバ１００ｂへの差分情報の転送は並行して行われており、これにより差分情報蓄積部２０３に記憶されている未転送のクエリが所定数以下となったとする。
【０１２４】
サーバ制御部２１０は、クライアント５００ｂからデータを更新するＳＱＬ（ＵＰＤＡＴＥ）を含むパケットを受信すると（ステップＳ４１４）、受信したクエリを送信キュー２０４に入れる。ここでは、差分情報蓄積部２０３に蓄積されている未転送のクエリの件数が所定件数以下となっているので、この新規クエリの処理は保留する（ステップＳ４１５）。すなわち、この新規クエリの差分情報蓄積部２０３への記憶及びサーバ１００ａへの転送は行わない。この保留処理は、差分情報蓄積部２０３に記憶されているクエリを全てサーバ１００ｂに転送し、サーバ１００ｂがシステムへ組み込まれるまで継続する。
【０１２５】
差分情報の転送が終了すると（ステップＳ４１６）、差分情報蓄積部２０３に蓄積されている全てのクエリが転送・処理されることでデータベース１０１ａと１０１ｂは完全に一致した状態（同期状態）になる。以上で同期化処理は完了するので、サーバ制御部２１０は、サーバ管理表２０１のサーバ１００ｂの稼働状態をａｃｔｉｖｅに変更することでシステムにサーバ１００ｂを追加する（ステップＳ４１７）。なお、このステップＳ４１７の処理は、図１３のステップＳ１４４及び図１５のステップＳ２４２に相当する。
【０１２６】
以降、サーバ制御部２１０は、前記ステップＳ４１５で保留していた新規クエリの処理を再開する。この時点では既に同期化が終了しているので、以降の処理は図６を参照して前述したものと同様となる。すなわち、サーバ制御部２１０は、当該クエリを送信キュー２０４から取り出して正常稼働中のサーバ、この場合サーバ１００ａ及び１００ｂに転送する（ステップＳ４１８，Ｓ４１９）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。そして、各サーバ１００ａ及び１００ｂから受信した応答パケットを比較して障害発生の有無をチェックし（ステップＳ４２０〜Ｓ４２２）、正常な応答パケットの１つをクライアント５００ｂへ転送する（ステップＳ４２３）。
【０１２７】
このような処理により、差分情報の転送中にクライアントから受信したクエリは、未転送の差分情報が所定数より多い場合には差分情報蓄積部２０３への記憶及びサーバ１００ｂへの転送が行われる。一方、未転送の差分情報が所定数以下の場合には新規クエリは保留される。これにより、差分情報の処理に時間がかかる場合やクライアントからの受信するクエリの受信間隔が短い場合であっても、データベースの同期を短時間に行うことができる。なお、閾値となる「所定件数」は、大きく設定すると新規クエリの保留時間が長くなる一方、小さく設定すると同期化処理完了までの時間が長引くことになるというトレードオフの関係にある。したがって、この「所定件数」は各装置の処理負荷やネットワーク速度などシステムの要件に応じて個々に最適な値を設定すればよい。また、本変形例において閾値を０以下に設定すれば、図１６〜図２３を参照して前述した実施例と同様の処理となる。
【０１２８】
（第２の実施の形態）
本発明の第２の実施の形態に係る多重化データベースシステムについて説明する。本実施の形態に係る多重化データベースシステムが第１の実施の形態と異なる点は、同期化処理における仲介装置から新規のサーバに転送する差分情報の内容にある。他の構成・動作等については第１の実施の形態と同様なので、ここでは相違点のみを説明する。
【０１２９】
第１の実施の形態では差分情報蓄積部２０３にはクライアント５００から受信した全てのクエリを保存・転送していた。これにより、同期化処理を実施している間に正常稼働中のサーバ１００で処理されたクエリを、新規のサーバ１００においても忠実に再現することができるので、完全な同期化を図ることができる。
【０１３０】
ところで、仲介装置から新規のサーバに転送する差分情報は専ら同期処理用にのみ用いられるので、該同期化において不要なクエリは転送する必要がない。具体的には、参照系クエリのＳＱＬ（ＳＥＬＥＣＴ）は不要である。なお、ここでは、ＳＥＬＥＣＴ  ＦＯＲ  ＵＰＤＡＴＥ文は、ＳＥＬＥＣＴ文の一種であるが更新処理に影響を与えるので、ここでは参照系クエリではなく更新系クエリとして取り扱うものとする。
【０１３１】
そこで、本実施の形態では、第１の実施の形態と異なり、クライアント５００から受信したクエリのうち、参照系クエリを除いたものを差分情報として新規のサーバ１００に転送する。例えば、クライアント５００から図２５（ａ）に示すようなＳＱＬ文を受信したとすると、新規のサーバ１００には図２５（ｂ）に示すようなＳＱＬ文を転送してやればよい。
【０１３２】
このような処理を行うため、本実施の形態に係るサーバ制御部２１０は、第１の実施の形態と同様にクライアント５００からクエリを受信した全てのクエリを差分情報蓄積部２０３に記憶する。そして、差分情報を新規サーバ１００に転送するにあたって、まず該クエリが参照系クエリであるかを判別し、参照系クエリ以外を新規サーバ１００に転送する。他の処理については第１の実施の形態と同様である。
【０１３３】
本実施の形態によれば、第１の実施の形態と比較すると、新規サーバ１００は同期化処理時において参照系クエリを処理する必要がないので同期化処理の短縮化を図ることができる。これは、複雑な参照系ＳＱＬや集合関数を含む参照系ＳＱＬなど処理負荷が大きい参照系ＳＱＬをクライアント５００が発行している場合には特に有効である。他の効果については第１の実施の形態と同様である。
【０１３４】
本実施の形態の変形例としては、サーバ制御部２１０が、同期化処理中にクライアント５００からクエリを受信し、このクエリを差分情報として差分情報蓄積部２０３に蓄積するにあたって、まず該クエリが参照系クエリであるかを判別し、参照系クエリ以外を差分情報蓄積部２０３に記憶する。そして、差分情報の転送は差分情報蓄積部２０３に記憶されている全てのクエリを対象に行う方法が挙げられる。この変形例は、差分情報蓄積部２０３の記憶容量をさらに節約できるという効果を有する。
【０１３５】
（第３の実施の形態）
本発明の第３の実施の形態に係る多重化データベースシステムについて説明する。本実施の形態に係る多重化データベースシステムが第１の実施の形態と異なる点は、データベース同期化動作中における差分情報の蓄積処理にある。他の構成・動作等については第１の実施の形態と同様なので、ここでは相違点のみを説明する。
【０１３６】
第１の実施の形態では、サーバ制御部２１０は、クライアント５００から受信した全てのパケットを差分情報蓄積部２０３に保存していた。すなわち、トランザクション制御ＳＱＬ、参照系ＳＱＬ及び更新系ＳＱＬの全てのＳＱＬについて差分情報蓄積部２０３に保存し、サーバ１００には差分情報蓄積部２０３に記憶されている全てのデータを古いものから順に送信していた。
【０１３７】
一方、本実施の形態では、サーバ制御部２１０は、データベース同期化動作中にクライアント５００から受信したパケットのうち、トランザクションの開始ＳＱＬ（ＢＥＧＩＮ）や確定ＳＱＬ（ＣＯＭＭＩＴ）や取消ＳＱＬ（ＲＯＬＬＢＡＣＫ）等のトランザクション制御ＳＱＬ、及び、ＳＥＬＥＣＴなど参照系のＳＱＬについては保存せず、ＵＰＤＡＴＥやＩＮＳＥＲＴなどの更新系のＳＱＬのうち正常稼働中のサーバ１００でＣＯＭＭＩＴされたもののみを差分情報蓄積部２０３に保存する。
【０１３８】
ここで注意すべき点は、差分情報蓄積部２０３には、クライアント５００から受信した順番ではなく、正常稼働中のサーバ１００で処理された順番に更新クエリを蓄積することである。これは、更新対象が重複する更新クエリについては、その処理順序によってデータベース１０１の内容が異なってしまう可能性があるためである。
【０１３９】
このような処理を実現するために、本実施の形態では、図２６に示すような差分情報一時蓄積部２０５を新たに設けた。この差分情報一時蓄積部２０５のデータ構造は、差分情報蓄積部２０３と同様に、クライアントから受信したクエリと該クエリが属するトランザクションのＩＤとからなる。
【０１４０】
サーバ制御部２１０は、同期化処理中にクライアント５００からクエリを受信すると、更新系のもののみを順次、差分情報一時蓄積部２０５に蓄積するとともに、正常稼働中のサーバ１００に転送する。一方、更新係以外のものについては、差分情報一時蓄積部２０５に蓄積することなく正常稼働中のサーバ１００に転送する。
【０１４１】
ここで、サーバ制御部２１０は、正常稼働中のサーバ１００から更新クエリの実行が失敗したことを示す応答パケットを受信すると、当該更新クエリを差分情報一時蓄積部２０５から削除する。また、正常稼働中のサーバ１００からトランザクションのＲＯＬＬＢＡＣＫが正常に完了したことを示す応答パケットを受信すると、サーバ制御部２１０は、当該トランザクションに属する全ての更新クエリを差分情報一時蓄積部２０５から削除する。一方、正常稼働中のサーバ１００からトランザクションのＣＯＭＭＩＴが正常に終了した応答パケットを受信すると、サーバ制御部２１０は、当該トランザクションに属する更新クエリについて差分情報一時蓄積部２０５から差分情報蓄積部２０３に順次移動させる。
【０１４２】
以上のような処理により差分情報蓄積部２０３には、正常稼働中のサーバ１００でＣＯＭＭＩＴされた更新クエリのみが、その処理された順番で蓄積される。したがって、後に新規サーバ１００から差分情報転送要求があったら、差分情報蓄積部２０３に記憶されている差分情報を蓄積されている順番で新規のサーバ１００に転送すればよい。なお、新規のサーバ１００のデータベース１０１は、仲介装置２００からの更新クエリを順次処理するのみなので、この更新クエリはオートコミットモードで処理する。
【０１４３】
このように、本実施の形態によれば、同期化処理には不要の参照系クエリ、ＢＥＧＩＮやＲＯＬＬＢＡＣＫなどのトランザクション制御ＳＱＬを差分情報蓄積部２０３に蓄積することがないので、第１の実施形態と比較すると、差分情報の転送時間及びサーバでの処理時間を短縮化できる。他の効果については第１の実施の形態と同様である。
【０１４４】
なお、本実施形態では、クライアント５００から受信したクエリは、当該クエリの属するトランザクションが正常稼働中のサーバ１００でＣＯＭＭＩＴされた時点で、差分情報一時記憶部２０５から差分情報記憶部２０３へ移動されていたが、その変形例として、当該クエリが正常稼働中のサーバ１００で正常処理された時点で移動するようにしてもよい。この場合には、トランザクションがＲＯＬＬＢＡＣＫしたら該トランザクションに属する更新クエリを差分情報記憶部２０３から削除すればよい。このような処理は、例えばＰｏｓｔｇｒｅＳＱＬのように、更新順序によって行の順番が変わるＤＢＭＳのデータベースを完全一致させるために有効である。
【０１４５】
（第４の実施の形態）
本発明の第４の実施の形態に係る多重化データベースシステムについて説明する。本実施の形態に係る多重化データベースシステムが第１の実施の形態と異なる点は、差分情報蓄積部の構造にある。他の構成・動作等については第１の実施の形態と同様なので、ここでは相違点のみを説明する。
【０１４６】
本実施の形態に係る仲介装置２００は、図２７に示すように、第１の実施の形態とは異なり差分情報蓄積部２０３は設けず、送信キュー２０６に第１の実施形態における差分情報蓄積部２０３と送信キュー２０４の機能を統合させている。
【０１４７】
本実施の形態に係る送信キュー２０６のデータ構造について図２８を参照して説明する。送信キュー２０６は、クライアント５００から受信したクエリの内容と、そのクエリの属するトランザクションＩＤと、各サーバ１００への送信状態とを記憶する。トランザクションＩＤは、第１の実施の形態と同様に、トランザクション管理表２０２から取得される。各サーバ１００への送信状態は、システムに属する各サーバ１００毎に記憶される。
【０１４８】
送信キュー２０６の各サーバ１００への送信状態は、「未送信」，「送信完了」，「保留」の３つの値を取りうる。「未送信」は、クライアント５００から受信したクエリが未だ当該サーバ１００に送信されていない状態である。「送信完了」は、当該サーバ１００への送信が完了した状態である。「保留」は、新規サーバ１００のシステムへの組み込み処理中に、当該サーバ１００へ転送されることなく保留されている状態である。全てのサーバ１００についての送信状態が「送信完了」になると、当該エントリは送信キュー２０６から削除される。
【０１４９】
次に、サーバ制御部２１０の動作について説明する。サーバ制御部２１０は、クライアント５００からクエリを受信すると、当該クエリがトランザクション開始ＳＱＬ（ＢＥＧＩＮ）の場合は当該トランザクションに対して新たなトランザクションＩＤを振り出してトランザクション管理表２０２に登録する。そして、当該クエリ内容，新規トランザクションＩＤ，各サーバ１００の送信状態を「未送信」で送信キュー２０６に登録する。また、クライアント５００から受信したクエリがトランザクション開始ＳＱＬ（ＢＥＧＩＮ）以外の場合は、当該クエリの属するトランザクションＩＤをトランザクション管理表２０２から取得し、当該クエリ内容，トランザクションＩＤ，各サーバ１００の送信状態を「未送信」で送信キュー２０６に登録する。
【０１５０】
サーバ制御部２１０は、送信キュー２０６に記録されているクエリを、その送信状態が「未送信」となっているサーバ１００に対して送信し、当該サーバ１００についての送信状態を「送信完了」に変更する。全てのサーバ１００について送信状態が「送信完了」になったクエリについては送信キュー２０６から削除する。
【０１５１】
仲介装置２００からクエリを受信した各サーバ１００は、当該クエリの処理を行い、応答パケットを仲介装置２００に返す。仲介装置２００のサーバ制御部２１０は、各サーバ１００から受信した応答パケットを対比して障害発生の有無を確認し、正常な応答パケットの１つをクライアント５００に返す。
【０１５２】
一方、サーバ１００から正当でない応答が仲介装置２００に返ってきたり、応答そのものが返ってこない場合には、当該サーバ１００に障害が発生したものとしてシステムから切り離す。具体的には、サーバ管理表２０１における当該サーバの稼働状態を「ｄｏｗｎ」に変更するとともに、送信キュー２０６の送信状態の欄について当該サーバに関する項目を削除する。図２９は、送信キュー２０６が図２８に示すような状態でサーバ１００ｂがシステムから切り離された場合の送信キュー２０６の一例である。
【０１５３】
次に、新規サーバ１００からデータベース同期化要求（システムへの組み込み要求）を受信した場合の動作について説明する。サーバ制御部２１０は、第１の実施の形態と同様に、データベース同期化要求受信時に実行中のトランザクションが終了するまで、新規トランザクションの開始は保留する。具体的には、クライアント５００から受信したクエリが新規トランザクションに係るものの場合には、送信状態を「保留」として送信キュー２０６に保存する。一方、クライアント５００から受信したクエリがデータベース同期化要求時に実行中のトランザクションに係るものの場合には、送信状態を「未送信」として送信キュー２０６に保存する。図３０は、送信キュー２０６が図２９に示すような状態でクライアント５００から新たにクエリを受信した場合の送信キュー２０６の一例である。図３０の例では、三行目のトランザクションＩＤ＝３のＢＥＧＩＮを除いて上のクエリから順に（古いクエリから順に）、トランザクションＩＤ＝２のＳＥＬＥＣＴ，トランザクションＩＤ＝１のＣＯＭＭＩＴ，トランザクションＩＤ＝２のＣＯＭＭＩＴの順に正常稼働中のサーバ１００ａへ転送され、その送信状態が「未送信」から「送信完了」に変更される。トランザクションＩＤ＝３のＢＥＧＩＮは、新規のサーバ１００ｂからスナップショット作成完了通知を受けた後に転送されることになる。
【０１５４】
そして、データベース同期化要求受信時に実行中のトランザクションに係るクエリを全て正常稼働中のサーバ１００に送信し終えると、サーバ制御部２１０は、送信キュー２０６に組み込み対象である新規のサーバ１００の項目を追加する。ここで、送信キュー２０６には送信状態が「保留」となっているクエリが記憶されている場合がある。この場合、サーバ制御部２１０は、送信キュー２０６に記憶されているクエリーに対して、新規サーバ１００についての送信状態を「保留」とする。図３１は、図３０の送信キュー２０６に対して新規サーバ１００ｂの登録をした場合を示している。また、サーバ制御部２１０は、データベース同期化要求受信時に実行中のトランザクションに係るクエリを全て正常稼働中のサーバ１００に送信し終えると、第１の実施の形態と同様に、正常稼働中のサーバ１００に対して同期化指示（スナップショットの作成指示）を送出する。
【０１５５】
サーバ制御部２１０は、正常稼働中のサーバ１００からスナップショット作成完了通知を受信すると、正常稼働中のサーバ１００へのクエリの送信を再開する。具体的には、まず送信キュー２０６に記憶されている全てのクエリ（この時点では全てのクエリの送信状態は全てのサーバ１００について「保留」になっている）について、正常稼働中のサーバ１００の送信状態を「未送信」に変更する。そして、サーバ制御部２１０は、送信状態が「未送信」のクエリを当該サーバ１００に順次送信し、送信が完了したら送信状態を「送信完了」に修正する。また、新たにクライアント５００から受信したクエリは、正常稼働中のサーバ１００についての送信状態は「未送信」、新規のサーバ１００についての送信状態は「保留」にして送信キュー２０６に記憶する。図３２は、図３１の送信キュー２０６に対してスナップショット完了通知受信後に新たなクエリを受信した場合を示している。また、図３３のように、正常稼働中のサーバ１００ａに対しては「送信完了」となっても新規のサーバ１００ｂに対しては「送信完了」になっていない（「保留」になっている）ので、送信キュー２０６から当該クエリは削除しない。
【０１５６】
新規のサーバ１００が正常稼働中のサーバ１００から受信したスナップショットを用いてデータベース１０１の復元が完了すると、サーバ制御部２１０は新規のサーバ１００から差分情報転送要求を受信する。サーバ制御部２１０は、送信キュー２０６に記憶されているクエリであって、送信状態が「保留」となっているものを当該「保留」となっていたサーバ１００、すなわち新規のサーバ１００に古いものから順次送信する。送信したクエリについては、送信キュー２０６における当該サーバ１００の送信状態を「送信完了」にし、全てのサーバ１００についての送信状態が「送信完了」になったら当該エントリは削除する。なお、送信状態が「保留」となっているクエリの送信中にクライアント５００からクエリを受信した場合、正常稼働中のサーバについては送信状態を「未送信」、新規のサーバ１００については送信状態を「保留」にして、当該クエリを送信キュー２０６に記憶する。
【０１５７】
サーバ制御部２１０は、送信状態が「保留」となっているクエリが送信キュー２０６に存在しなくなると、サーバ管理表２０１に新規のサーバ１００を「ａｃｔｉｖｅ」として追加することで、当該サーバ１００をシステムに組み込む。以降の動作は各サーバ１００が正常動作している場合のものと同様になる。
【０１５８】
以上のように本実施の形態に係る仲介装置２００では、第１の実施の形態における差分情報蓄積部２０３と送信キュー２０４の機能を、１つの送信キュー２０６に統合しているので、メモリの利用効率や処理効率が向上する。また、送信キュー２０６の各クエリに対して、各サーバ１００への送信状態を記憶するようにしているので、新規サーバ１００を組み込む際には当該サーバ１００の送信状態を追加すればよい。これにより、一度に複数台のサーバ１００をシステムに組み込むことができる。他の作用効果については第１の実施の形態と同様である。
【０１５９】
なお、本実施の形態は、第１の実施の形態の変形例として説明したが、上記第２〜第３の実施の形態において同様の変形を適用できることは言うまでもない。
【０１６０】
（第５の実施の形態）
本発明の第５の実施の形態に係る多重化データベースシステムについて説明する。本実施の形態に係る多重化データベースシステムが第４の実施の形態と異なる点は、差分情報の蓄積方法にある。他の構成・動作等については第４の実施の形態と同様なので、ここでは相違点のみを説明する。
【０１６１】
上述の第１の〜第４の実施の形態では、仲介装置２００が正常稼働中のサーバ１００にスナップショットの作成指示を送信するタイミングは、正常稼働中のサーバ１００において実行中のトランザクションが無くなったときである。具体的には、新規サーバ１００からのデータベース同期化要求を受信した時点で実行中のトランザクションについて正常稼働中のサーバ１００で処理を行うのと並行して、データベース同期化要求受信時以降にクライアント５００から受信した新規トランザクションの開始要求を保留していた。そして、データベース同期化要求を受信した時に実行中のトランザクションが無くなった時点で、スナップショットの作成指示を送信している。これは、ＤＢＭＳによっては、スナップショット作成時にトランザクションが実行中だと、そのトランザクションに属する更新クエリによるデータ更新がスナップショットに反映されるか否かが不確定となる場合を考慮したためである。
【０１６２】
一方、本実施の形態では、サーバ１００として、スナップショット作成時に実行中のトランザクションに属する更新クエリ及びスナップショット作成処理中に受信した更新クエリについては、当該スナップショットには反映しないという動作を行うものを用いる。すなわち、もしスナップショット作成中にトランザクションが終了しＣＯＭＭＩＴされても、そのトランザクションによる更新はスナップショットに反映されない。これにより、本実施の形態に係る仲介装置２００のサーバ制御部２１０は、データベース同期化要求受信時に実行中のトランザクションの終了を待つことなく、スナップショット作成指示の送信及び新規トランザクションの開始を行うことができる。なお、仲介装置２００がスナップショット作成完了を待つ必要がないので、サーバ１００のデータベース制御部１０２は、スナップショット作成が完了しても仲介装置２００には完了通知を送信する必要はない。
【０１６３】
このような処理を行うため、本実施の形態に係る仲介装置２００のサーバ制御部２１０は、送信キュー２０６に記憶されている各クエリについて、全てのサーバ１００について送信状態が「送信完了」となり、且つ、当該クエリに属するトランザクションが終了した場合に、当該クエリの登録を削除する。
【０１６４】
以下、新規サーバ１００をシステムに組み込む際の動作について図３４〜図３８を参照して説明する。いま、システムにはサーバ１００ａのみが組み込まれており、これから新たにサーバ１００ｂを組み込むものとする。
【０１６５】
サーバ制御部２１０は、新規サーバ１００ｂからデータベース同期化要求を受信すると、正常稼働中のサーバ１００ａに対して同期化指示（スナップショット作成指示）を送信する。新規サーバ１００ｂが仲介装置２００に対してデータベース同期化要求を送信した際の送信キュー２０６の一例を図３４に示す。前述したように、送信キュー２０６に記憶されたクエリは、当該クエリが送信完了しても該クエリの属するトランザクションが完了していないものは削除されずに残っている。同期化指示を受信したサーバ１００ａは、スナップショットの作成を開始する。ここで作成されるスナップショットは、送信キュー２０６に記憶されているクエリは反映されていないものである。また、サーバ制御部２１０は、新規サーバ１００ｂからデータベース同期化要求を受信すると、送信キュー２０６に記憶されている全てのクエリについて、当該新規サーバ１００ｂの送信状態を「保留」にして追加する。この時の、送信キュー２０６の一例を図３５に示す。
【０１６６】
サーバ制御部２１０は、データベース同期化要求受信時以降にクライアント５００からクエリを受信すると、正常稼働中のサーバ１００ａについては送信状態を「未送信」、新規サーバ１００ｂについては送信状態を「保留」にして送信キュー２０６に順次追加する。そして、送信状態が「未送信」となっているクエリについては当該「未送信」のサーバ１００ａに対して順次転送し、送信状態を「送信完了」に変更していく。このとき、図３６に示すように、送信キュー２０６に記憶されているクエリは、正常稼働中のサーバ１００ａについてはトランザクション単位で送信状態が「送信完了」となっているが、新規サーバ１００ｂについては「保留」となっているので、ここではクエリの削除は行わない。
【０１６７】
一方、仲介装置２００からスナップショットの作成指示を受信したサーバ１００ａは、作成したスナップショットを新規のサーバ１００ｂに送信する。新規のサーバ１００ｂのデータベース制御部１０２ｂは、受信したスナップショットからデータベース１０１ｂを復元し、仲介装置２００に差分情報転送要求を送信する。
【０１６８】
差分情報転送要求を受信したサーバ制御部２１０は、送信キュー２０６に記憶されている送信状態が「保留」となっているクエリを差分情報として順次新規サーバ１００ｂに送信し、図３７に示すように、送信状態を「送信完了」に変更する。そして、前述したように、全てのサーバについて送信状態が「送信完了」となり、且つ、当該クエリのトランザクションが完了したら、そのクエリを削除する。以降、送信状態が「保留」のクエリの送信中にクライアント５００からクエリを受信すると、図３８に示すように、正常稼働中のサーバ１００ａの送信状態を「未送信」，新規サーバ１００ｂの送信状態を「保留」で送信キュー２０６へ記憶する。そして、送信状態が「保留」のクエリが無くなった時点でデータベース１０１ａとデータベース１０１ｂの同期が完了したことになる。
【０１６９】
本実施形態によれば、システムで用いるサーバ１００の機能的要件が限定されるためサーバ選択の幅が狭くなるものの、仲介装置２００での処理が簡略化されるので処理効率の高いものとなる。
【０１７０】
なお、本実施の形態では、サーバ１００として、（１）トランザクション実行中でもスナップショットの作成開始ができ、（２）スナップショット作成中にクエリを処理可能であり且つ当該クエリがスナップショットに反映されないものを用いたが、（１’）トランザクション実行中でもスナップショットの作成開始ができるが、（２’）スナップショット作成中にはクエリを処理できない又はスナップショット作成中にクエリを処理すると当該処理がスナップショットに反映される場合があるようなサーバ１００を用いることもできる。
【０１７１】
ただし、この場合には、新規サーバ１００からデータベース同期化要求を受信すると直ちに正常稼働中のサーバ１００に対してスナップショット作成指示を送信してよいが、スナップショット作成開始から作成完了までは正常稼働中のサーバ１００に対するクエリの送信を保留する必要がある。つまり、スナップショット作成中にクライアント５００から受信するクエリは送信キューに保持しておく。また、仲介装置２００がスナップショットの作成完了を認識するために、スナップショットの作成が完了したサーバ１００は、スナップショット作成完了を仲介装置２００に通知する必要がある。これにより、本実施の形態よりもサーバ選択の幅が広いものとなる。
【０１７２】
（第６の実施の形態）
本発明の第６の実施の形態に係る多重化データベースシステムについて説明する。本実施の形態に係る多重化データベースシステムが第１の実施の形態と異なる点は、第１の実施の形態では同期化処理中におけるクライアントからのクエリの処理とスナップショットの作成を同一のサーバで行っていたが、本実施の形態ではそれぞれ別のサーバで行うところにある。このため、図３９に示すようにサーバ１００は３台以上必要になる。他の構成・動作等については第１の実施の形態と同様なので、ここでは相違点のみを説明する。
【０１７３】
以下に本実施の形態に係る多重化データベースシステムにおけるデータベース同期化処理時の動作について図４０〜図４８を参照して説明する。
【０１７４】
今、データベース１０１ｃはデータベース１０１ａ及び１０１ｂと同期がとれていない状態、つまり、同一ではない状態とする。例えば、データベース１０１ｃは、再起動直前のデータ又は障害発生直前のデータを保持しているかもしれないし、全く新しいサーバの場合には、データを全く持っていない状態かもしれない。本発明では、前者の場合でも古いデータは削除し、データベース１０１ｃはデータを全く保持していないものとしてシステムに組み込む。
【０１７５】
ここでは、サーバ管理表２０１は図４３のようになっているとする。また、トランザクション管理表２０２と差分情報蓄積部２０３は空であるとする。
【０１７６】
図４０に示すように、クライアント５００ａが172.17.1.1宛のトランザクション開始ＳＱＬ（ＢＥＧＩＮ）を含んだパケットを送信すると、仲介装置２００はそのパケットを受信する（ステップＳ５００）。サーバ制御部２１０は、トランザクションが開始されたことを検知し、トランザクション管理表２０２にクライアント５００ａのＩＰアドレスとトランザクション番号を登録する（ステップＳ５０１）。図４４にこのときのトランザクション管理表２０２を示す。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。そして、送信キュー２０４から当該クエリを取り出し、サーバ管理表２０１を見て正常稼働しているサーバ、この場合、サーバ１００ａ及び１０１ｂへ該パケットを転送する（ステップＳ５０２，Ｓ５０３）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。仲介装置２００は、応答パケットを各サーバ１００から受信すると（ステップＳ５０４，Ｓ５０５）、各応答パケットを比較して障害有無をチェックし（ステップＳ５０６）、正当な応答パケットの１つをクライアント５００ａへ転送する（ステップＳ５０７）。
【０１７７】
ここで、新規サーバ１００ｃは再起動されたものとする。これにより、サーバ１００ｃのデータベース制御部１０２ｃは、データベース同期化要求（組込要求）を仲介装置２００へ送信する（ステップＳ５０８）。
【０１７８】
データベース同期化要求を受信したサーバ制御部２１０は、トランザクション管理表２０２をチェックし現在実行中のトランザクションが存在するかどうかを確認するとともに、実行中トランザクションの情報を記録しておく（ステップＳ５０９）。図４４より、クライアント５００ａ，トランザクション番号３のトランザクションが実行中なので、データベース同期化動作はこのトランザクションの終了を待つと同時に、新しいトランザクション開始要求を受け取った場合は、その要求をサーバ１００へ転送することを遅らせる（ステップＳ５１０）。つまり、同期化動作は実行中のトランザクションが全くない状態で始める。この新規トランザクションの開始要求についての転送遅延処理は、送信キュー２０４での保留という手段で実現する。
【０１７９】
次に、クライアント５００ａは、テーブルｔｅｓｔ＿ｔａｂｌｅを更新するＳＱＬ（ＵＰＤＡＴＥ）を含んだパケットを172.17.1.1へ送信する（ステップＳ５１１）。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。このクエリは前記ステップＳ５０９で記憶したトランザクション情報を参照することでデータベース同期化要求時に実行していたトランザクションに属するものと判定できるので、サーバ制御部２１０は、送信キュー２０４から当該クエリを取り出し、サーバ管理表２０１を見て正常稼働しているサーバ、この場合、サーバ１００ａ及び１００ｂへ該パケットを転送する（ステップＳ５１２，Ｓ５１３）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。仲介装置２００は、正常稼働中の各サーバ１００ａ及び１００ｂから応答パケットを受信（ステップＳ５１４，Ｓ５１５）するまで待ち、各応答パケットが揃うと該パケットから障害の有無を判定する（ステップＳ５１６）。そして、サーバ制御部２１０は、正当な応答パケットの１つをクライアント５００ａへ転送する（ステップＳ５１７）。
【０１８０】
次に、クライアント５００ｂが172.17.1.1宛にトランザクション開始ＳＱＬ（ＢＥＧＩＮ）を含んだパケットを送信すると、仲介装置２００はそのパケットを受信する（ステップＳ５１８）。サーバ制御部２１０は、このパケットによりトランザクションが開始されたことを検知し、トランザクション管理表２０２にクライアント５００ｂのＩＰアドレスとトランザクション番号を登録する（ステップＳ５１９）。図４５にこのときのトランザクション管理表２０２を示す。そして、このパケットに係るクエリを送信状態「未送信」で送信キュー２０４に入れる。しかし、この時点では同期化処理準備のため、新規トランザクション開始クエリは送信キュー２０４に保持したまま、正常稼働中のサーバ１００ａ，１００ｂへは転送しない（ステップＳ５２０）。
【０１８１】
次に、クライアント５００ａは、テーブルｔｅｓｔ＿ｔａｂｌｅへの更新を確定するＳＱＬ（ＣＯＭＭＩＴ）を含んだパケットを172.11.1.1へ送信する（ステップＳ５２１）。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。このクエリは前記ステップＳ５０９で記憶したトランザクション情報を参照することでデータベース同期化要求時に実行していたトランザクションに属するものと判定できるので、サーバ制御部２１０は、送信キュー２０４から当該クエリを取り出し、サーバ管理表２０１を見て正常稼働しているサーバ、この場合、サーバ１００ａ及び１００ｂへ該パケットを転送する（ステップＳ５２２，Ｓ５２３）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。仲介装置２００は、正常稼働中の全てのサーバ１００ａ及び１００ｂから応答パケットを受信（ステップＳ５２４，Ｓ５２５）するまで待ち、全ての応答パケットが揃ったら該パケットから障害の有無をチェックする（ステップＳ５２６）。また、ＣＯＭＭＩＴが正常に完了したことから、トランザクションが終了したことが分かるので、サーバ制御部２１０はトランザクション管理表２０２からこのトランザクションの登録を削除する（ステップＳ５２７）。この時のトランザクション管理表２０２を図４６に示す。サーバ制御部２１０は正当な応答パケットの１つをクライアント５００ａへ転送する（ステップＳ５２８）。
【０１８２】
ここで、新規サーバ１００ｃからのデータベース同期化要求時に実行していたトランザクションが全て無くなったので、サーバ制御部２１０は同期化動作を開始する（ステップＳ５２９）。具体的には、まず、サーバ制御部２１０は、正常稼働中のサーバ１００ａ及び１００ｂの中から同期化用サーバ１００を１つ選定する（ステップＳ５３０）。本実施の形態ではサーバ１００ｂを選択したものとする。そして、同期化用サーバ１００ｂに対して同期化指示（スナップショット作成指示）を送出する（ステップＳ５３１）。また、サーバ管理表２０１のサーバ１００ｂについて状態を「ｓｙｎｃ」に変更し、サーバ１００ｂを一旦システムから切り離す（ステップＳ５３２）。ここで、サーバ管理表２０１の状態「ｓｙｎｃ」とは、当該サーバ１００が同期処理中であることを意味する。この時のサーバ管理表２０１を図４７に示す。なお、前記ステップＳ５２９において、トランザクション管理表２０２に記録されているトランザクションがデータベース同期化要求時に実行中であったものか、又は、その後にクライアント５００から受信したものかを判定するには、前記ステップＳ５０９で記録しておいたデータベース同期要求時のトランザクション情報を参照すればよい。
【０１８３】
同期化指示を受け取った同期化用サーバ１００ｂのデータベース制御部１０２ｂは、データベース１０１ｂのスナップショットを作り出す（ステップＳ５３３）。ここで、このスナップショットは、同期化指示を受け取った時点でのデータベース全体のバックアップデータやデータベースを復元するための情報であり、同期化指示後の更新は反映されていないことに注目すべきである。
【０１８４】
同期化用サーバ１００ｂのデータベース制御部１０２ｂは、スナップショット作成が完了すると（ステップＳ５３４）、作成したスナップショットを新規サーバ１００ｃへ転送する。このスナップショットの転送とデータベースの復元は、データベース１０１ｂのサイズが大きければ大きいほど時間がかかるが、クライアントからのデータベースアクセスと並行して実行されるのでクライアントに対するサービスを止めることはない。
【０１８５】
新規サーバ１００ｃのデータベース制御部１０２ｃは、同期化用サーバ１００ｂから受信したスナップショットからデータベースを復元する（ステップＳ５３５）。
【０１８６】
仲介装置２００のサーバ制御部２１０は、サーバ１００ｂについてサーバ管理表２０１の状態を「ｓｙｎｃ」に変更すると（前記ステップＳ５３２）、クライアント５００へのサービスを再開する。ここで、クライアント５００から処理要求を処理するサーバは、状態が「ａｃｔｉｖｅ」のサーバ１００ａである。つまり、同期化用サーバ１００ｂは、一時的にシステムから切り離され専ら同期化処理のみを行うことになる。また、ここでは、処理せずに送信キュー２０４に保持していた、クライアント５００ｂからのＢＥＧＩＮを含んだパケットの処理を再開する。すなわち、サーバ制御部２１０は、転送せずに保持していたクライアント５００ｂからのＢＥＧＩＮ  ＳＱＬを含んだパケットを送信キュー２０４から取り出して差分情報蓄積部２０３に保存するとともに（ステップＳ５３５）、正常稼働中のサーバ１００ａへ転送する（ステップＳ５３６）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。
【０１８７】
正常稼働中のサーバ１００ａは、応答パケットを仲介装置２００に送信し、仲介装置２００がこの応答パケットを受信する（ステップＳ５３７）。仲介装置２００は、この応答パケットをクライアント５００ｂへ転送する（ステップＳ５３８）。
【０１８８】
次いで、クライアント５００ｂがテーブルｔｅｓｔ＿ｔａｂｌｅの更新ＳＱＬ（ＵＰＤＡＴＥ）のパケットを仲介装置２００に送信すると（ステップＳ５３９）、サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。そして、送信キュー２０４から当該クエリを取り出し、当該クエリを差分情報蓄積部２０３に保存するとともに（ステップＳ５４０）、正常稼働中のサーバ１００ａに当該パケットを送信する（ステップＳ５４１）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。ここで、サーバ１００ａはＵＰＤＡＴＥに失敗し、その旨を通知する応答パケットを仲介装置２００に送信したものとする（ステップＳ５４２）。仲介装置２００は、この応答パケットをクライアント５００ｂに送信する（ステップＳ５４３）。
【０１８９】
ＵＰＤＡＴＥ失敗の応答パケットを受信したクライアント５００ｂは、トランザクションを取り消すＳＱＬ（ＲＯＬＬＢＡＣＫ）のパケットを仲介装置に送信する（ステップＳ５４４）。サーバ制御部２１０は、受信したクエリを送信キュー２０４に入れる。そして、送信キュー２０４から当該クエリを取り出し、当該ＳＱＬを差分情報蓄積部２０３に保存するとともに（ステップＳ５４５）、正常稼働中のサーバ１００ａに当該パケットを送信する（ステップＳ５４６）。次いで、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。そして、サーバ１００ａから正常にトランザクションがＲＯＬＬＢＡＣＫされたことを通知する応答パケットを受信すると（ステップＳ５４７）、トランザクション管理表２０２から当該トランザクションの登録を削除するとともに（ステップＳ５４８）、この応答パケットをクライアント５００ｂに送信する（ステップＳ５４９）。この時点での差分情報蓄積部２０３を図４８に示す。また、トランザクション管理表２０２は空になる。
【０１９０】
ここで、新規サーバ１００ｃにおいてスナップショットからのデータベース１０１ｃの復元が完了したものとする（ステップＳ５５０）。新規サーバ１００ｃはデータベース１０１ｃの復元が完了すると差分情報転送要求を仲介装置２００に送信する（ステップＳ５５１）。仲介装置２００のサーバ制御部２１０は、差分情報転送要求を受信すると、差分情報蓄積部２０３に蓄積されているデータを古いものから順に新規サーバ１００ｃ及び同期化用サーバ１００ｂに転送する処理を開始する（ステップＳ５５２）。
【０１９１】
前記ステップＳ５５２で差分情報蓄積部２０３に蓄積されている全てのクエリが転送・処理されることでデータベース１０１ａとデータベース１０１ｂ及び１０１ｃとは完全に一致した状態（同期状態）になるが、この転送処理中にクライアント５００から新たなクエリを受信する場合がある。例えば、図４２に示すように、仲介装置２００は、クライアント５００ｂから新規トランザクションを開始するクエリ（ＢＥＧＩＮ）を受信する（ステップＳ５５３）。仲介装置２００は、当該新規トランザクションをトランザクション管理表２０２に登録する（ステップＳ５５４）。そして、当該クエリを送信キュー２０４に入れる。次いで、送信キュー２０４から当該クエリを取り出し、差分情報蓄積部２０３の最後に当該クエリを追加するとともに（ステップＳ５５５）、正常稼働中のサーバ１００ａに送信する（ステップＳ５５６）。そして、送信キュー２０４の送信状態を「送信完了」にして当該エントリを削除する。次いで、サーバ１００ａから応答パケットを受信すると（ステップＳ５５７）、当該応答パケットをクライアント５００ｂに転送する（ステップＳ５５８）。
【０１９２】
このように差分情報転送中にクライアント５００から受信したクエリは、正常稼働中のサーバ１００で処理するとともに、差分情報蓄積部２０３に蓄積していく。この処理を継続していくと、やがて差分情報蓄積部２０３に蓄積されているクエリは全て新規サーバ１００ｃ及び同期化用サーバ１００ｂに転送され、差分情報蓄積部２０３は空になり、これを契機に差分情報転送処理が終了する（ステップＳ５５９）。これによりデータベース１０１ａとデータベース１０１ｂ及び１０１ｃは完全に一致した状態（同期状態）となる。以上で同期化処理は完了するので、図１３及び図１５を参照して前述した第１の実施の形態と同様に、同期化用サーバ１００ｂ及び新規サーバ１００ｃについてのサーバ管理表２０１の稼働状態をともにａｃｔｉｖｅに変更することでシステムに当該サーバ１００ｂ及び１００ｃを追加することができる（図１３のステップＳ１４４，図１５のステップＳ２４２）。なお、この時のサーバ管理表２０１を図４９に示す。
【０１９３】
以上のように本実施の形態によれば、サーバ１００のデータベース同期化処理の際には、正常稼働中の複数のサーバ１００の中から同期化処理用のサーバ１００を選定し、この同期化処理用サーバ１００を用いてスナップショットの作成・転送を行っているので、これと並行してクライアント５００からの処理要求を正常稼働中の他のサーバ１００を用いて処理できる。したがって、組込処理とクライアントからの処理要求に係る処理が異なるサーバで処理されるので負荷が分散されるとともに、スナップショットの作成中にもクライアント５００からの処理要求に応じることができるので、クライアント５００に対して円滑なサービスの提供を継続できる。
【０１９４】
なお、本実施の形態は第１の実施の形態の変形例として説明したが、本実施の形態に対して更に上述した第２〜第５の実施形態における変形を施しても本発明を実施できる。
【０１９５】
（第７の実施の形態）
本発明の第７の実施の形態に係る多重化データベースシステムについて図面を参照して説明する。本実施の形態に係る多重化データベースシステムが前述の第６の実施の形態と異なる点は、同期化用サーバ及び新規サーバへの差分情報の送出タイミングにある。
【０１９６】
すなわち、上記第６の実施の形態では、仲介装置は新規サーバから差分情報転送要求を受信すると、新規サーバ及び同期化用サーバの双方に同時に差分情報の送出を行っていた。一方、本実施の形態では、同期化用サーバに対する差分情報の送出処理と新規サーバに対する差分情報の送出処理とを非同期でそれぞれ並行して実施する。このため、本実施の形態に係る仲介装置は、複数のサーバに対する差分情報を互いに独立して蓄積する必要があるので、前述の第４の実施の形態に係る仲介装置と同じ構成とした。すなわち、送信キュー２０６において、各サーバ毎に差分情報を記憶する。
【０１９７】
仲介装置２００は、前記各実施の形態とは異なり、新規サーバ１００からだけでなく同期化用サーバ１００からも差分情報転送要求を受信する。そして、差分情報転送要求を受信すると、送信キュー２０６における要求元のサーバについての送信状態が「保留」となっているクエリを、当該要求元のサーバに順次送出し、当該サーバについての送信状態を「送信完了」に更新する。そして、差分情報転送要求元のサーバについて「保留」となっているクエリの送出が完了すると、当該サーバについてサーバ管理表２０１を更新してシステムに組み込む。差分情報転送処理時におけるクライアント５００からのクエリの処理など他の処理については前述した第４の実施の形態と同様である。例えば、全てのサーバ１００について送信状態が「送信完了」になったクエリは送信キュー２０６から削除する点などは、第４の実施の形態と同様である。
【０１９８】
同期化用サーバ１００は、仲介装置２００から同期化指示（スナップショット作成指示）を受信すると、スナップショットの作成を開始する。次に、スナップショットの作成が完了すると、仲介装置２００に対して差分情報転送要求を送信するとともに、新規サーバ１００に対するスナップショットの転送を開始する。この差分情報転送要求に応じて仲介装置２００から差分情報を順次受信するので、同期化用サーバ１００はこの差分情報の処理を行う。
【０１９９】
次に、新規サーバ１００をシステムに組み込む際の動作について図５０及び図５１のシーケンスチャートを参照して具体的に説明する。
【０２００】
今、新規サーバ１００ｃが仲介装置２００にデータベース同期化要求（システムへの組込要求）を送信し、仲介装置２００がサーバ１００ｂを同期化用サーバとして選定して、該同期化用サーバ１００ｂに同期化指示を送信するとともに（ステップＳ６０１）、該サーバ１００ｂをシステムから切り離したとする（ステップＳ６０２）。
【０２０１】
同期化用サーバ１００ｂは、仲介装置２００から同期化指示を受信すると（ステップＳ６０１）、スナップショットの作成を開始する（ステップＳ６０３）。そして、スナップショットの作成が完了すると（ステップＳ６０４）、仲介装置２００に対して差分情報転送要求を送信するとともに（ステップＳ６０５）、当該スナップショットを新規サーバ１００ｃへ転送する処理を開始する（ステップＳ６０６）。
【０２０２】
仲介装置２００は、同期化用サーバ１００ｂから差分情報転送要求を受信すると、当該サーバ１００ｂに対する差分情報の送出を開始する（ステップＳ６０７）。具体的には、送信キュー２０６に蓄積されているクエリのうち同期化用サーバ１００ｂについての送信状態が「保留」となっているものを、古いものから順に同期化用サーバ１００ｂに送信する。そして、当該クエリについて送信キュー２０６における同期化用サーバ１００ｂの送信状態を「送信完了」に更新する。
【０２０３】
同期化用サーバ１００ｂへの差分情報転送中に、クライアント５００からクエリ（図５０ではＵＰＤＡＴＥ）を受信すると（ステップＳ６０８）、仲介装置２００は当該クエリを差分情報として記憶する（ステップＳ６０９）。具体的には、当該クエリを、正常稼働中のサーバ１００ａについては送信状態を「未送信」で、同期化用サーバ１００ｂ及び新規サーバ１００ｃについては送信状態を「保留」にして、送信キュー２０６に蓄積する。次に、仲介装置２００は、当該クエリを含んだパケットを正常稼働中のサーバ１００ａに転送し（ステップＳ６１０）、送信キュー２０６のサーバ１００ａについての送信状態を「送信完了」に更新する。そして、正常稼働中のサーバ１００ａからの応答パケット（ステップＳ６１１）を、要求元のクライアント５００に返す（ステップＳ６１２）。
【０２０４】
新規サーバ１００ｃは、スナップショットに基づきデータベース１０１ｃの復元を完了すると（ステップＳ６１３）、仲介装置２００に対して差分情報転送要求を送信する（ステップＳ６１４）。
【０２０５】
仲介装置２００は、新規サーバ１００ｃから差分情報転送要求を受信すると（ステップＳ６１４）、当該サーバ１００ｃに対する差分情報の送出を開始する（ステップＳ６１５）。具体的には、送信キュー２０６に蓄積されているクエリのうち新規サーバ１００ｃについての送信状態が「保留」となっているものを、古いものから順に新規サーバ１００ｃに送信し、当該クエリについて新規サーバ１００ｃの送信状態を「送信完了」に更新する。本実施の形態は、同期化用サーバ１００ｂへの差分情報転送と、新規サーバ１００ｃへの差分情報転送は、互いに並行して非同期で行うことが特徴的な点である。
【０２０６】
同期化用サーバ１００ｂ及び新規サーバ１００ｃへの差分情報転送中に、クライアント５００からクエリ（図５０ではＩＮＳＥＲＴ）を受信すると（ステップＳ６１６）、仲介装置２００は当該クエリを差分情報として記憶する（ステップＳ６１７）。具体的には、当該クエリを、正常稼働中のサーバ１００ａについての送信状態を「未送信」にして、同期化用サーバ１００ｂ及び新規サーバ１００ｃについて送信状態を「保留」で送信キュー２０６に蓄積する。次に、仲介装置２００は、正常稼働中のサーバ１００ａに転送し（ステップＳ６１８）、送信キュー２０６のサーバ１００ａについての送信状態を「送信完了」に更新する。そして、正常稼働中のサーバ１００ａからの応答パケット（ステップＳ６１９）を、要求元のクライアント５００に返す（ステップＳ６２０）。
【０２０７】
仲介装置２００は、同期化用サーバ１００ｂ又は新規サーバ１００ｃについて送信状態が「保留」となっているクエリが送信キュー２０６からなくなると、差分情報の送出が完了したことになるので、当該サーバ１００ｂ，１００ｃについてそれぞれサーバ管理表２０１を更新してシステムに組み込む。
【０２０８】
通常は、図５１に示すように、同期化用サーバ１００ｂへの差分情報送出は新規サーバ１００ｃより先に終了し（ステップＳ６２１）、仲介装置２００は、同期化用サーバ１００ｂについてサーバ管理表２０１の稼働状態をａｃｔｉｖｅに変更してシステムに組み込む（ステップＳ６２２）。
【０２０９】
以降、新規サーバ１００ｃへの差分情報転送中にクライアント５００からのクエリ（図５１ではＵＰＤＡＴＥ）は、正常稼働中のサーバ１００ａ及び前記ステップＳ６２２で組み込まれたサーバ１００ｂで処理される。すなわち、まず、当該クライアント５００からクエリを受信すると（ステップＳ６２３）、仲介装置２００は当該クエリを差分情報として記憶する（ステップＳ６２４）。具体的には、当該クエリを、正常稼働中のサーバ１００ａ及び１００ｂについて送信状態を「未送信」にして、新規サーバ１００ｃについて送信状態を「保留」で送信キュー２０６に蓄積する。次に、仲介装置２００は、正常稼働中のサーバ１００ａ及び１００ｂに転送し（ステップＳ６２５，Ｓ６２６）、送信キュー２０６のサーバ１００ａ及び１００ｂについての送信状態を「送信完了」に更新する。そして、正常稼働中のサーバ１００ａ及び１００ｂからの応答パケット（ステップＳ６２７，Ｓ６２８）の正当性をチェックし（ステップＳ６２９）、正しい応答の１つを要求元のクライアント５００に返す（ステップＳ６３０）。
【０２１０】
次に、仲介装置２００は、新規サーバ１００ｃについて送信状態が「保留」となっているクエリが送信キュー２０６からなくなると、差分情報の送出が完了したことになるので（ステップＳ６３１）、当該新規サーバ１００ｃについてサーバ管理表２０１の稼働状態を「ａｃｔｉｖｅ」で追加してシステムに組み込む（ステップＳ６３２）。
【０２１１】
本実施の形態によれば、上記第６の実施の形態と比較して、同期化用サーバ１００のシステムの組込復帰の時期が早くなるので、システムに組み込まれているサーバの数が通常時よりも少なくなっている期間を短縮することができる。したがって、システムの耐故障性が向上する。
【０２１２】
なお、本実施形態では、同期化用サーバ１００ｂが新規サーバ１００ｃよりも先にシステムに組み込まれた例について説明したが、状況によっては新規サーバ１００ｃの方が先にシステムに組み込まれる場合も考えられる。
【０２１３】
以上、本発明の実施形態について詳述したが、上記実施の形態は例示的なものであり、本発明はこれに限定されるものではない。本発明の範囲は特許請求の範囲に示されており、この特許請求の範囲の意味に入る全ての変形例は本発明に含まれるものである。
【０２１４】
例えば、各サーバは要求に応じて同じ応答をするならば同じ実装である必要はない。すなわち、バージョン、仕様、プログラム言語、コンパイラの種類、コンパイラオプション、ハードウェアかソフトウェアか、などが異なっていてもよい。サーバには、ＰｏｓｔｇｒｅＳＱＬなどのフリーソフトウェアやＯｒａｃｌｅなどの市販のソフトウェア、独自開発のソフトウェア、いずれを使ってもよい。また、それらが混在していてもよい。例えば、サーバ１００ａはＰｏｓｔｇｒｅＳＱＬでサーバ１００ｂはＯｒａｃｌｅでも良い。
【０２１５】
ＤＢＭＳとしては、市中品（例えば、ＯｒａｃｌｅやＰｏｓｔｇｒｅＳＱＬ）を使う場合は、データベース制御部１０２は、データベース管理部とデータベースサーバ管理部に機能を分けることによって、市中品を無改造で使うことができる。データベース管理部は、データベース１０１を直接操作するもので、例えばＰｏｓｔｇｒｅＳＱＬの場合はｐｏｓｔｍａｓｔｅｒやｐｏｓｔｇｒｅｓに相当する。データベースサーバ管理部は、仲介装置２００とデータベース管理部の間に介在し、クエリの送受信を中継したりするほかに、他のサーバを同期化する際のデータベース１０１のスナップショットを作成したり、そのスナップショットを他のサーバへ転送したりする処理を行う。
【０２１６】
スナップショットの作成方法は、例えばＤＢＭＳがＰｏｓｔｇｒｅＳＱＬならばｐｇ＿ｄｕｍｐなどのダンプツールやバックアップツールを使って実現する。なお、ｐｇ＿ｄｕｍｐはＰｏｓｔｇｒｅＳＱＬサーバ同士を同期化する場合には有用だが、異種のＤＢＭＳ同士（例えばＰｏｓｔｇｒｅＳＱＬとＯｒａｃｌｅ）を同期化する場合には、ＤＢＭＳ固有のツールは使わずに、正常稼働中のＤＢＭＳサーバからＳＥＬＥＣＴクエリで全てのデータを取りだしＩＮＳＥＲＴクエリでデータを入れる汎用のツールを使えばよい。
【０２１７】
また、上記実施の形態では、システムへの組み込み要求（新規サーバのデータベース同期化要求）は当該新規サーバ１００のデータベース制御部１０２が仲介装置２００へ送信しているが、さらに保守端末などの他の装置から送信可能にしてもよいし、オペレータが仲介装置２００に直接指示可能としても良い。
【０２１８】
さらに、上記実施の形態では、サーバはパソコン上のソフトウェアで実現しているが、ハードウェアで実装しても良い。
【０２１９】
また、上記実施の形態では、仮想サーバ８００を構成する仲介装置２００は１台のみであったが、複数台設けて冗長性を持たせることにより、より可用性の高い構成とすることも可能である。仲介装置を多重化させる技術については、例えば本願出願人による特開２００３−３４５６７９号公報に記載されたものなどを用いればよい。
【０２２０】
さらに、上記各実施の形態では、データベース一致検査装置６００を多重化データベースシステムの外側、すなわちネットワーク４００に接続していたが、図５２に示すように、多重化データベースシステムの内側のネットワーク３００にデータベース一致検査装置６００を接続するようにしてもよい。
【図面の簡単な説明】
【０２２１】
【図１】第１の実施形態に係る多重化データベースシステムの構成図
【図２】第１の実施形態に係るサーバ管理表の一例を示す図
【図３】第１の実施形態に係るトランザクション管理表の一例を示す図
【図４】第１の実施形態に係る差分情報蓄積部の一例を示す図
【図５】第１の実施形態に係る送信キューの一例を示す図
【図６】各サーバが正常稼働している場合の多重化データベースシステムの動作を説明するシーケンスチャート
【図７】図５の動作におけるサーバ管理表の一例
【図８】図５の動作におけるトランザクション管理表の一例
【図９】サーバが故障した場合の多重化データベースシステムの動作を説明するシーケンスチャート
【図１０】図８の動作におけるトランザクション管理表の一例
【図１１】図８の動作におけるサーバ管理表の一例
【図１２】サーバにより異なる順序でクエリが実行された場合の多重化データベースシステムの動作を説明するシーケンスチャート
【図１３】サーバにより異なる順序でクエリが実行された場合の多重化データベースシステムの動作を説明するシーケンスチャート
【図１４】サーバにより異なる順序でクエリが実行された場合の多重化データベースシステムの動作を説明するシーケンスチャート
【図１５】サーバにより異なる順序でクエリが実行された場合の多重化データベースシステムの動作を説明するシーケンスチャート
【図１６】多重化データベースシステムにおける同期化処理を説明するシーケンスチャート
【図１７】多重化データベースシステムにおける同期化処理を説明するシーケンスチャート
【図１８】多重化データベースシステムにおける同期化処理を説明するシーケンスチャート
【図１９】図１６乃至図１８の動作におけるサーバ管理表の一例
【図２０】図１６乃至図１８の動作におけるトランザクション管理表の一例
【図２１】図１６乃至図１８の動作におけるトランザクション管理表の一例
【図２２】図１６乃至図１８の動作におけるトランザクション管理表の一例
【図２３】図１６乃至図１８の動作における差分情報蓄積部の一例
【図２４】多重化データベースシステムにおける同期化処理を説明するシーケンスチャート
【図２５】第２の実施形態の同期化処理においてクライアントから受信したクエリと差分情報として送出するクエリの関係を説明する図
【図２６】第３の実施形態に係る差分情報蓄積部の一例
【図２７】第４の実施形態に係る仲介装置の構成図
【図２８】第４の実施形態に係る送信キューの一例を示す図
【図２９】第４の実施形態に係る多重化データベースシステムの同期化処理中の送信キューの一例
【図３０】第４の実施形態に係る多重化データベースシステムの同期化処理中の送信キューの一例
【図３１】第４の実施形態に係る多重化データベースシステムの同期化処理中の送信キューの一例
【図３２】第４の実施形態に係る多重化データベースシステムの同期化処理中の送信キューの一例
【図３３】第４の実施形態に係る多重化データベースシステムの同期化処理中の送信キューの一例
【図３４】第５の実施形態に係る多重化データベースシステムの同期化処理中の送信キューの一例
【図３５】第５の実施形態に係る多重化データベースシステムの同期化処理中の送信キューの一例
【図３６】第５の実施形態に係る多重化データベースシステムの同期化処理中の送信キューの一例
【図３７】第５の実施形態に係る多重化データベースシステムの同期化処理中の送信キューの一例
【図３８】第５の実施形態に係る多重化データベースシステムの同期化処理中の送信キューの一例
【図３９】第６の実施形態に係る多重化データベースシステムの構成図
【図４０】第６の実施形態に係る多重化データベースシステムにおける同期化処理を説明するシーケンスチャート
【図４１】第６の実施形態に係る多重化データベースシステムにおける同期化処理を説明するシーケンスチャート
【図４２】第６の実施形態に係る多重化データベースシステムにおける同期化処理を説明するシーケンスチャート
【図４３】図４０乃至図４２の動作におけるサーバ管理表の一例
【図４４】図４０乃至図４２の動作におけるトランザクション管理表の一例
【図４５】図４０乃至図４２の動作におけるトランザクション管理表の一例
【図４６】図４０乃至図４２の動作におけるトランザクション管理表の一例
【図４７】図４０乃至図４２の動作におけるサーバ管理表の一例
【図４８】図４０乃至図４２の動作における差分情報蓄積部の一例
【図４９】図４０乃至図４２の動作におけるサーバ管理表の一例
【図５０】第７の実施形態に係る多重化データベースシステムにおける同期化処理を説明するシーケンスチャート
【図５１】第７の実施形態に係る多重化データベースシステムにおける同期化処理を説明するシーケンスチャート
【図５２】他の例に係る多重化データベースシステムの構成図
【図５３】従来のデータベース同期化システムの構成図
【図５４】データベースのテーブルの一例
【図５５】処理順序が問題となるトランザクションの一例
【図５６】処理順序が問題となるトランザクションの一例
【符号の説明】
【０２２２】
１００…サーバ、１０１…データベース、１０２…データベース制御部、２００…仲介装置、２０１…サーバ管理表、２０２…トランザクション管理表、２０３…差分情報蓄積部、２０４，２０６…送信キュー、２０５…差分情報一時蓄積部、２１０…サーバ制御部、３００，４００…ネットワーク、５００…クライアント、６００…データベース一致検査装置。
【図１】
2007241324.tif 000003
【図２】
2007241324.tif 000004
【図３】
2007241324.tif 000005
【図４】
2007241324.tif 000006
【図５】
2007241324.tif 000007
【図６】
2007241324.tif 000008
【図７】
2007241324.tif 000009
【図８】
2007241324.tif 000010
【図９】
2007241324.tif 000011
【図１０】
2007241324.tif 000012
【図１１】
2007241324.tif 000013
【図１２】
2007241324.tif 000014
【図１３】
2007241324.tif 000015
【図１４】
2007241324.tif 000016
【図１５】
2007241324.tif 000017
【図１６】
2007241324.tif 000018
【図１７】
2007241324.tif 000019
【図１８】
2007241324.tif 000020
【図１９】
2007241324.tif 000021
【図２０】
2007241324.tif 000022
【図２１】
2007241324.tif 000023
【図２２】
2007241324.tif 000024
【図２３】
2007241324.tif 000025
【図２４】
2007241324.tif 000026
【図２５】
2007241324.tif 000027
【図２６】
2007241324.tif 000028
【図２７】
2007241324.tif 000029
【図２８】
2007241324.tif 000030
【図２９】
2007241324.tif 000031
【図３０】
2007241324.tif 000032
【図３１】
2007241324.tif 000033
【図３２】
2007241324.tif 000034
【図３３】
2007241324.tif 000035
【図３４】
2007241324.tif 000036
【図３５】
2007241324.tif 000037
【図３６】
2007241324.tif 000038
【図３７】
2007241324.tif 000039
【図３８】
2007241324.tif 000040
【図３９】
2007241324.tif 000041
【図４０】
2007241324.tif 000042
【図４１】
2007241324.tif 000043
【図４２】
2007241324.tif 000044
【図４３】
2007241324.tif 000045
【図４４】
2007241324.tif 000046
【図４５】
2007241324.tif 000047
【図４６】
2007241324.tif 000048
【図４７】
2007241324.tif 000049
【図４８】
2007241324.tif 000050
【図４９】
2007241324.tif 000051
【図５０】
2007241324.tif 000052
【図５１】
2007241324.tif 000053
【図５２】
2007241324.tif 000054
【図５３】
2007241324.tif 000055
【図５４】
2007241324.tif 000056
【図５５】
2007241324.tif 000057
【図５６】
2007241324.tif 000058