README : ミラーリングのフェールオーバー (ODBC)

このサンプルでは、SQL Server 2005 SP1 のミラーリングのフェールオーバー機能について説明します。このサンプルは、SQL Server 2005 Express Edition (SQL Server Express) ではサポートされていません。

言語

このサンプルでは、Visual C++ を使用しています。

前提条件

このサンプルを実行する前に、次のソフトウェアがインストールされていることを確認してください。

プリンシパル データベースに対するプリンシパル データベース ミラー データベースを構成する必要があります。詳細については、「大きなデータを設定する方法 (OLE DB)」および「データベース ミラーリングの設定のトラブルシューティング」を参照してください。

必要に応じて、お使いのコンピュータで次のスクリプトを使用して、データベース ミラーリングを有効にすることができます。これらのスクリプトは SQL Server Management Studio 内か、コマンド プロンプトで SQLCMD を使用して実行できます。

このサンプルで使用しているデータベースとエンドポイントがプリンシパル サーバー インスタンスに存在しないことの確認

次のスクリプトは、このサンプルで使用しているデータベースやエンドポイントの名前がプリンシパル サーバー上に存在しないことを確認します。

-- Step 1 (on Principal)
-- Return primary server instance to a premirroring state
-- 
ALTER DATABASE HADB SET PARTNER OFF
DROP DATABASE HADB;
DROP ENDPOINT Mirroring;
EXEC sys.sp_dbmmonitordropmonitoring;

このサンプルで使用しているデータベースとエンドポイントがミラー サーバー インスタンスに存在しないことの確認

次のスクリプトは、このサンプルで使用しているデータベースやエンドポイントの名前がミラー サーバー インスタンス上に存在しないことを確認します。

-- Step 2 (on Mirror)
-- Return mirror server instance to a premirroring state
-- 
ALTER DATABASE HADB SET PARTNER OFF
RESTORE DATABASE HADB WITH RECOVERY;
DROP DATABASE HADB;
DROP ENDPOINT Mirroring;

データベースとデータベース バックアップの作成

次のスクリプトをプリンシパル サーバー インスタンス上で実行し、データベースとデータベース バックアップを作成します。

-- Step 3 (on Principal)
-- create db and backups
-- 
USE master;
GO
CREATE DATABASE HADB; 
ALTER DATABASE HADB SET RECOVERY FULL; 

-- CREATE BACKUPS
BACKUP DATABASE HADB 
    TO DISK = 'C:\HADB.bak'
    WITH FORMAT;
GO

BACKUP LOG HADB
   TO DISK = 'C:\HADB.bak';

ミラー データベースの作成

次のスクリプトをミラー データベースのあるサーバー インスタンス上で実行し、前のスクリプトで作成したバックアップからミラー データベースを作成します。ミラー サーバーとプリンシパル サーバーが物理的に同じコンピュータではない場合、プリンシパル サーバー コンピュータからミラー サーバー コンピュータに c:\hadb.bak をコピーする必要があります。

-- Step 4 (on Mirror)
-- Create the mirror database
RESTORE DATABASE HADB
FROM DISK='C:\HADB.bak'
WITH NORECOVERY, FILE=1,
MOVE 'HADB' TO 'C:\HADB.mdf',
MOVE 'HADB_log' TO 'C:\HADB_log.ldf'
;

RESTORE LOG HADB
FROM DISK='C:\HADB.bak'
WITH NORECOVERY, FILE=2,
MOVE 'HADB' TO 'C:\HADB.mdf',
MOVE 'HADB_log' TO 'C:\HADB_log.ldf'
;

プリンシパル サーバーでのミラー エンドポイントの作成

次のスクリプトをプリンシパル サーバー インスタンスで実行し、ミラーリング エンドポイントを作成します。

-- Step 5 (on Principal)
-- create mirroring endpoint on PRINCIPAL server
-- 
CREATE ENDPOINT Mirroring
STATE = STARTED
AS TCP(LISTENER_PORT = 7022)
FOR database_mirroring (ROLE = PARTNER);

ミラー サーバー インスタンスでのミラー エンドポイントの作成

次のスクリプトをミラー サーバー インスタンスで実行し、ミラーリング エンドポイントを作成します。

コンピュータ名とドメイン名 (完全なコンピュータ名) は、お使いのコンピュータのプロパティを表示することで確認できます (Windows XP の場合は、[マイ コンピュータ] を右クリックし、[プロパティ] をクリックして、[コンピュータ名] タブを確認します)。

-- Step 6 (on MIRROR)
-- create mirroring endpoint
-- 
CREATE ENDPOINT Mirroring
STATE = STARTED
AS TCP(LISTENER_PORT = 7023)
FOR database_mirroring (ROLE = PARTNER);

-- also on mirror, set partner to PRINCIPAL server 
--(This must be done on mirror first.)
ALTER DATABASE HADB SET PARTNER='tcp://machine_name.domain:7022';

ミラー サーバーへのプリンシパルの設定

次のスクリプトをプリンシパル サーバーで実行し、ミラー データベースを指定します。プリンシパル サーバーにファイアウォールがあり、ポート 7022 での接続が防止されている場合は、この時点で失敗することがあります。この場合は、ファイアウォールでこのポート番号を例外として設定します。

-- Step 7 (on Principal)
-- Set partner to the mirror server on port 7023
-- 
ALTER DATABASE HADB SET PARTNER='tcp://machine_name.domain:7023';

-- start collecting mirroring history:
USE master;
EXEC sys.sp_dbmmonitoraddmonitoring;

サンプルのビルド

サンプルをビルドするには、Visual Studio で Failover.slx を開き (Ctrl キーと Shift キーを押しながら O キーを押します)、[ビルド] メニューの [ソリューションのビルド] をクリックします。または、ソリューションのコマンド プロンプトで MSBUILD を起動します。

サンプルの実行

  • Visual Studio から、[デバッグなしで開始] を呼び出します (Ctrl キーを押しながら F5 キーを押します)。
  • MSBuild.exe でビルドした場合は、Failover.exe を起動します。
  • プリンシパル サーバー、およびユーザー インターフェイス内のミラー サーバーを、使用しているサーバー名に変更します。
  • [Init Table] をクリックします。これで、更新カウンタとして使用される列を含んだ単純なテーブルが作成されます。
  • [Connect] をクリックします。
  • [Update] をクリックしてテーブルを更新してから、[Commit] をクリックして変更をデータベースにコミットします。
  • 手動でフェールオーバーを行うには、[Failover] をクリックします。

解説

これで [Connect][Update][Commit]、および [Disconnect] がクリックできるようになります。[Update] をクリックするたびに [Count] フィールドの値が 1 ずつ増えます。更新をコミットしないで [Failover] をクリックし、接続を解除して再接続すると、最新のコミット後の更新状態がわかります。接続を解除すると、エラーになり、フェールオーバーが行われ、接続と現在のトランザクションがロールバックされます。

アプリケーションでは、接続先のサーバーと、そのサーバーのパートナーを検出できます。これを行うには、[Track Changes] チェックボックスをオンにします。これを行う利点は、接続文字列を更新するアプリケーションが、多くの場合、起動時に直接アクティブなサーバーに接続を行う点にあります。それ自体には大きな利点はありませんが、長期間で見るとメンテナンス コストをゼロにすることができます。A が B にミラーリングされるとします。A で障害が発生すると、B がアクティブ サーバーになります。ここで新しいサーバー C が B のミラーとして導入されます。A をプリンシパル、B をミラーとして要求するアプリケーションは、B から C にフェールオーバーが行われると接続に失敗します。

[Continuous Test] をクリックしてカウンターを調べます。ここで間隔をおいて [Failover] をクリックします。フェールオーバーの時間が表示されます (コードを見て、どのように計測されるか確認してください)。また、コードでは単純で高度なフェールオーバー ロジックを示しています。ここでは、現在のトランザクションが失われたと仮定して、数回再接続を試み (デモンストレーションでは 3 回)、失敗したトランザクションを繰り返すか、ユーザーにレポートします。

別名である ActiveServer の現在のクライアント設定を取得したり、この別名を現在のアクティブ サーバーに設定するボタンがあります。スクリプトとユーティリティで別名を使用する場合は、SMO を使用してフェールオーバー後に別名を更新できます。その結果、ユーティリティとスクリプトでは新しいアクティブ サーバーに接続します。

参照

概念

Data Access サンプル

ヘルプおよび情報

SQL Server 2005 の参考資料の入手