自述文件:镜像故障转移 (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++ 目录”。)
您还需要为主体数据库配置一个主体数据库镜像数据库。有关详细信息,请参阅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。
- 将用户界面中的主体服务器和镜像服务器更改为您的服务器名称。
- 单击**“Init 表”**。这将创建一个简单表,其中一列被用作更新计数器。
- 单击**“连接”**。
- 单击**“更新”以更新表,再单击“提交”**以提交对数据库所做的更改。
- 若要强制进行手动故障转移,请单击**“故障转移”**。
备注
现在可以单击**“连接”、“更新”、“提交”和“断开连接”。每次单击“更新”,“计数”字段都会随之递增。如果在更新未提交的情况下单击“故障转移”**,然后断开连接并重新连接,这时您将看到上次提交之后的更新状态。断开连接时,您将看到一个错误,并且在故障转移发生之后连接和当前事务都将回滚。
应用程序可检测所连接到的服务器和服务器的伙伴。您可以通过选中**“跟踪更改”**复选框来执行此操作。这样做的优点是:更新其连接字符串的应用程序在启动时直接转到活动服务器的几率更大,这将带来极大的利益,可使长期维护成本为零。假设将 A 镜像到 B,当 A 失败时,B 就成为了活动服务器。现在,引入新服务器 C 作为 B 的镜像。当 B 故障转移到 C 时,要求 A 作为主体并且 B 作为镜像的应用程序的连接将失败。
单击**“连续测试”,然后观察计数器。现在,在一定的时间间隔后单击“故障转移”**。将显示故障转移的时间(查看代码以了解此时间是如何测定的)。另外,代码还说明了简单的高级故障转移逻辑。即在假定当前事务已丢失的情况下,进行为数不多的重新连接尝试(说明中共有三次)并重复执行失败的事务或将其报告给用户。
有一些按钮可以用来为别名 ActiveServer 获取当前客户端设置,并将此别名设置为当前的活动服务器。如果将别名与脚本和实用工具一起使用,则可以在故障转移之后使用 SMO 更新别名。实用工具和脚本现在将连接到新的活动服务器。