此範例示範 SQL Server 2005 SP1 中的鏡像容錯移轉功能。使用 SQL Server 2005 Express Edition (SQL Server Express) 時不支援此範例。
語言
此範例使用 Visual C++。
必要條件
執行此範例之前,請確定已安裝下列軟體:
- SQL Server 2005,包括 Database Engine。
- SQL Server 2005 Database Engine 範例。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++ 目錄、專案和方案、選項對話方塊>)。
此外,您還需要設定主體資料庫的主體資料庫鏡像資料庫;如需詳細資訊,請參閱<How to: Set Large Data (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.sln (CTRL+SHIFT+O),然後按一下 [建立] 功能表上的 [建立方案],或在方案上從命令提示字元叫用 MSBUILD。
執行範例
- 從 Visual Studio 叫用 [啟動但不偵錯] (CTRL+F5)。
- 如果您使用 MSBuild.exe 來建置,請叫用 Failover.exe。
- 將使用者介面中的 [主體伺服器] 和 [鏡像伺服器] 變更為您的伺服器名稱。
- 按一下 [初始化資料表]。這會建立一個簡單的資料表,其中包含做為更新計數器的資料行。
- 按一下 [連接]。
- 按一下 [更新] 以更新資料表,然後按一下 [認可] 以認可對資料庫所做的變更。
- 若要強制手動容錯移轉,請按一下 [容錯移轉]。
備註
現在,您可以按一下 [連接]、[更新]、[認可] 以及 [中斷連接]。每按一下 [更新],[計數] 欄位就會遞增。如果您按一下 [容錯移轉] 而未認可更新,然後中斷連接並重新連接,您將會看到上一次認可之後的更新狀態。中斷連接之後,您會看到錯誤,並且連接和目前的交易將會在容錯移轉發生之後回復。
應用程式可以偵測所連接的伺服器以及該伺服器的夥伴。只要選取 [追蹤變更] 核取方塊,就可以執行這項操作。這個做法的好處在於,更新連接字串的應用程式很可能會在啟動時直接移到使用中的伺服器,這是種邊際效益,並且可以讓長期的維護成本保持為零。假設 B 為 A 的鏡像,但 A 失敗了,導致 B 變成使用中伺服器。現在新的伺服器 C 加入成為 B 的鏡像。當 B 進行容錯移轉至 C 時,要求 A 做為主體且 B 做為鏡像的應用程式將無法連接。
按一下 [繼續測試] 並觀察計數器。現在,依照間隔按一下 [容錯移轉]。隨即會顯示進行容錯移轉的時間 (查看程式碼即可瞭解其測量方式)。此外,程式碼也示範簡單的高階容錯移轉邏輯。例如,假設目前交易遺失,請進行幾次重新連接 (在此示範中為三次),並且重複失敗的交易,或者向使用者回報。
有幾個按鈕可用來取得別名 ActiveServer 的目前用戶端設定,並將此別名設定為目前使用中的伺服器。如果您將別名與指令碼和公用程式搭配使用,就可以在容錯移轉之後使用 SMO 更新別名。現在,公用程式和指令碼將會連接到新的使用中伺服器。