README : ミラーリングのフェールオーバー (ODBC)
このサンプルでは、SQL Server 2005 SP1 のミラーリングのフェールオーバー機能について説明します。このサンプルは、SQL Server 2005 Express Edition (SQL Server Express) ではサポートされていません。
言語
このサンプルでは、Visual C++ を使用しています。
前提条件
このサンプルを実行する前に、次のソフトウェアがインストールされていることを確認してください。
- データベース エンジンを含む SQL Server 2005。
- SQL Server 2005 データベース エンジンのサンプル。これらのサンプルは SQL Server 2005 に含まれています。これらの最新バージョンは、Microsoft SQL Server デベロッパー センターからダウンロードできます。
- .NET Framework SDK 2.0 または Microsoft Visual Studio 2005。.NET Framework SDK は無償で入手できます。「.NET Framework SDK のインストール」を参照してください。INCLUDE 環境変数を変更して \Microsoft SQL Server\90\SDK\Include ディレクトリを含める必要があります (Microsoft Visual Studio 2005 を使用している場合は、この作業を開発環境内で行うことができます。詳細については、「[VC++ ディレクトリ] ([オプション] ダイアログ ボックス - [プロジェクトおよびソリューション])」を参照してください)。
プリンシパル データベースに対するプリンシパル データベース ミラー データベースを構成する必要があります。詳細については、「大きなデータを設定する方法 (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 を使用してフェールオーバー後に別名を更新できます。その結果、ユーティリティとスクリプトでは新しいアクティブ サーバーに接続します。