实现SQLServer2012数据库镜像与故障自动转移

实现数据库的自动故障转移,需要三台服务器(主服务器、镜像服务器、见证服务器)提供支持。主服务器必须在高安全性模式下配置数据库镜像会话,并且还要具有第三个服务器实例(也称为“见证服务器”),它能使高安全性模式会话中的镜像服务器识别出是否要启动自动故障转移。主数据库与镜像数据库、见证服务器之间的身份验证分两种:一是通过域帐户,二是通过证书。

此示例我们将通过域帐户验证的方式,在办公网环境下演示一下如何通过数据库镜像实现系统程序如何在1秒之内实现故障自动转移的。

一、环境准备

1、准备服务器

 准备4台服务器,分别为:域服务器(后面简称DS)、主数据库服务器(后面简称DB1)、镜像服务器(后面简称DB2)、见证服务器(后面简称DB3),DB1、DB2、DB3的DNS需与DS的IP一致。服务器具体信息如表所示:

实现SQLServer2012数据库镜像与故障自动转移

 

 2、域服务器安装和配置

 转到DS服务器,安装和配置域服务器,并在服务器上建立域服务“ittest.com”,详细安装配置过程可参考“域服务器安装和配置”。最后效果如图所示:

实现SQLServer2012数据库镜像与故障自动转移


 3、准备域帐户

 转到DS服务器,打开“Active Directory 用户和计算机”,在“ittest.com”域上新建一个域用户帐户“zengqingyue”。效果如图所示:

实现SQLServer2012数据库镜像与故障自动转移


 4、服务器加入域

 DB1DB2DB3DNS设置为192.168.9.235,然后加入域“ittest.com”。详细加域过程可参考“WIN7如何加域”


 5、服务器配置域帐户管理员

 转到DB1、DB2计算机,分别将“ittest\zengqingyue”帐户添加为本机管理员,如图所示:

实现SQLServer2012数据库镜像与故障自动转移


 分别在DB1DB2在“管理工具”中打开“服务”(或者用“SQL Server 配置管理器”),修改SQL Server实例的属性,将登录身份改为“ittest\zengqingyue”。修改之后,重启SQL Server实例。如图所示:

实现SQLServer2012数据库镜像与故障自动转移

 说明如果SQL Server实例是通过不同的本地帐户启动的,那么在创建镜像时主体数据库会尝试用本机帐户去连接镜像数据库,最终会报错。


 二、实现数据库镜像

 1、配置镜像的端点

 转到DB1,在SQL Server 2012 使用SQL语句创建了一个名为“镜像”的端点,如图所示:

实现SQLServer2012数据库镜像与故障自动转移

“镜像”创建的语法为:

 USE [master]
 CREATE ENDPOINT [
镜像]
 STATE=STARTED

 AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)

  FOR DATA_MIRRORING (ROLE = PARTNER, AUTHENTICATION = WINDOWS NEGOTIATE

  ,  ENCRYPTION = REQUIRED ALGORITHM RC4)

 2、配置防火墙

 要想让DB1、DB2、DB3之间的SQL Server能够互相访问,必须在防火墙上打开SQL Server默认的TCP1433端口和默认的镜像端口TCP5022,或者关掉所有的防火墙设置,如图所示:

实现SQLServer2012数据库镜像与故障自动转移

 3、备份主服务器数据库,并还原到镜像服务器

 转到DB1,备份主数据库时,数据库必须是“完整恢复模式”,如图所示:

实现SQLServer2012数据库镜像与故障自动转移


主数据库备份完成后,将bak备份文件拷贝到DB2服务器上,然后将其恢复到镜像数据库中。使用数据库镜像技术时,镜像数据库需要处于“Restore With NoRecovery”状态。在还原操作时一定要勾选“Restore With NoRecovery”选项。如图所示:


实现SQLServer2012数据库镜像与故障自动转移


默认情况下,还原的选项是“RestoreWith Recovery”,即“通过回滚未提交的事务,使数据库处于可以使用的状态。”此时,如果使用数据库镜像,将会出现以下错误:

实现SQLServer2012数据库镜像与故障自动转移

 

 4、配置镜像

 转到DB1,右键点击需要镜像的数据库,选择任务——镜像,弹出镜像对话框后,点击“配置安全性”即可开始镜像配置,如图所示:

实现SQLServer2012数据库镜像与故障自动转移

实现SQLServer2012数据库镜像与故障自动转移


我们这次演示使用了2SQL Server服务器,一台见证服务器,配置“包括见证服务器实例”的步骤需要将选项勾选为“是”,选择后点击下一步,弹出“选择要配置的服务器”对话框中默认勾选“见证服务器实例”,确认无误后点击下一步。如图所示:

实现SQLServer2012数据库镜像与故障自动转移

实现SQLServer2012数据库镜像与故障自动转移

实现SQLServer2012数据库镜像与故障自动转移


在“主体服务器实例”对话框,默认会显示本机已经配置了的侦听器端口和端点名称,确认无误后点击下一步。如图所示:

实现SQLServer2012数据库镜像与故障自动转移



在“镜像服务器实例”对话框,在下拉列表中找到镜像服务器的名称然后点“连接”(或者在下拉列表中选择“浏览更多”),并点击下一步。如图所示:

实现SQLServer2012数据库镜像与故障自动转移


在“见证服务器实例”对话框,在下拉列表中找到见证服务器的名称然后点“连接”(或者在下拉列表中选择“浏览更多”),并点击下一步。如图所示:

·    实现SQLServer2012数据库镜像与故障自动转移


在“服务帐户”对话框,在主体、镜像、见证输入栏中,输入同一个域用户“ittest\zengqingyue”,向导会自动为这个帐户创建登录名,还将为登录名授予对端点的连接权限,输入完成后点击下一步。如图所示:

实现SQLServer2012数据库镜像与故障自动转移


最后,确认所有信息无误后,点击“完成”,即可完成数据库镜像配置。如图所示:

实现SQLServer2012数据库镜像与故障自动转移

实现SQLServer2012数据库镜像与故障自动转移

 

 5、完成配置

 完成上述配置后,会有提示信息,询问是否立即“开始镜像”。点击“不开始镜像”,回到配置对话框。如图所示:

      实现SQLServer2012数据库镜像与故障自动转移

 

 在配置对话框,核对配置信息无误后,点击“开始镜像”,如图所示:

 实现SQLServer2012数据库镜像与故障自动转移

 

 镜像成功之后,状态会显示“正在同步”的显示信息,如图所示:

 实现SQLServer2012数据库镜像与故障自动转移

说明:如果点击“开始镜像”后,系统提示“服务器网络地址"TCP://XXX:5022"无法访问或不存在。请检查网络地址名称,并检查本地和远程端点的端口是否正常运行。(Microsoft SQLServer,错误:1418)”的错误信息,意思是说你不在同一个网域,只是一个WORKGROUP,通常在同一个 网域不会有此错误出现。


三、检查与验证

1、检查镜像服务器是否授权主体服务器

转到DB2,查看登录名为“ittest\zengqingyue”的属性,检查安全对象中镜像的连接信息是否已经授权给DB1如图所示:

实现SQLServer2012数据库镜像与故障自动转移


 2、检查数据库状态

 镜像成功后,主体数据库的状态会显示为“主体,已同步”,镜像数据库的状态会显示为“镜像,已同步/正在还原...”,如图所示:

  实现SQLServer2012数据库镜像与故障自动转移


对于镜像数据库,是不允许删除和操作的,否则将出现如下错误信息:

实现SQLServer2012数据库镜像与故障自动转移

实现SQLServer2012数据库镜像与故障自动转移


3、监视镜像是否正常

   转到DB1,选择主体数据库,并选择“启动数据库镜像监视器”,通过监视器,可以查看主体服务器和镜像服务器的镜像状态和见证服务器连接的信息,如图所示:

 实现SQLServer2012数据库镜像与故障自动转移

 实现SQLServer2012数据库镜像与故障自动转移


四、测试故障自动转移

 数据库正常运行情况,DB1状态显示为“主体,已同步”DB2状态显示为“镜像,已同步/正在还原...”。为了测试数据库可以实现故障自动转移,我们将主体服务器DB1的网络断开后,发现DB2的数据库状态已从“镜像,已同步/正在还原...”改变为“主体,已断开连接”。如图所示:

 实现SQLServer2012数据库镜像与故障自动转移

 实现SQLServer2012数据库镜像与故障自动转移

 

 最后,我们可以通过“数据库镜像监视器”查看主体数据库与镜像数据库的状态变化,我们看到主体服务器、镜像服务器角色发生了互换,说明数据库之间已经发生故障自动转移了。如图所示:

 实现SQLServer2012数据库镜像与故障自动转移


 如果在两个数据库IP地址都不一样的情况下,主体服务器出现故障后,怎样才能既不用修改程序代码也不用修改任何配置信息,就可以实现故障自动转移呢?

 答案是程序通过ADO.NET或者SQL NativeClient修改程序的连接字符串,能够自动连接到故障转移后的伙伴,连接字符串格式如下:

 ConnectionString="Data Source=主体数据库IP;Failover Partner=镜像数据库IP;Initial Catalog=CardIssueKeyManagement;USER ID=sa;Password="