当前位置:首页 > 问答 > 正文

教你一步步搞定SQL Server镜像,别怕操作复杂其实没那么难

整理自微软官方文档、数据库管理员社区分享以及《SQL Server高可用性实战》等技术资料)

很多朋友一听到“SQL Server镜像”就觉得头大,感觉是DBA专家才能碰的高级功能,其实不然,它的核心思想非常简单,就像给重要的数据找一个实时同步的“双胞胎兄弟”,这台兄弟服务器(我们称之为镜像服务器)随时准备着,万一主服务器“生病”倒下,它能立刻顶上,保证业务不中断,下面,我就用最直白的话,带你一步步把它搭建起来。

第一步:准备工作,打好地基

在开始之前,你得准备好三台服务器(或者虚拟机),别紧张,它们的角色很清晰:

  1. 主服务器:就是你现在正在用的、处理所有业务的数据库服务器。
  2. 镜像服务器:你要准备的那台“双胞胎兄弟”,它的硬件配置最好和主服务器一样,至少不能差太多。
  3. 见证服务器:这是个“裁判员”,它的存在是为了实现自动故障转移,比如主服务器突然宕机,镜像服务器和见证服务器一合计,“裁判”确认主服务器确实不行了,就会自动让镜像服务器接管,如果只有两台服务器,也可以不要见证,但那样就只能手动切换了,响应会慢一些。

关键点:这三台服务器必须能通过网络互相“说话”,防火墙要放行它们之间的通信端口(默认是5022)。

第二步:备份与还原,让数据“同步起点”

镜像不是凭空变出数据的,你需要先让镜像服务器上的数据库和主服务器的一模一样,怎么做呢?

  1. 在主服务器上,对你想要做镜像的数据库进行一次完整备份
  2. 把这个备份文件拷贝到镜像服务器上。
  3. 在镜像服务器上,用RESTORE DATABASE命令还原这个备份,但这里有个至关重要的细节:还原时必须加上 WITH NORECOVERY 选项。(来源:SQL Server还原模式说明)这个选项的意思是,让数据库处于“正在还原”状态,准备好接收后续的日志备份,就像张开手臂准备接住后面传来的球一样,如果忘了这一步,后面所有操作都会失败。

第三步:配置端点,建立“专用电话线”

服务器之间要通过一个叫“端点”的东西来通信,你可以把它理解成一部专用的内部电话。

  1. 分别在主服务器镜像服务器上执行创建端点的SQL语句,这里需要指定使用的端口(比如5022)和身份验证方式(推荐用Windows认证,最安全),这一步两边都要做,确保“电话号码”一致。
  2. 创建好后,用 *SELECT FROM sys.database_mirroring_endpoints** 这条命令查一下,确认端点已经成功创建并且是启动状态。

第四步:建立伙伴关系,握手成功

万事俱备,只欠东风,现在就让主服务器和镜像服务器正式“牵手”。

  1. 镜像服务器上,先执行连接主服务器的命令,格式大致是这样的: ALTER DATABASE [你的数据库名] SET PARTNER = 'TCP://主服务器IP地址:5022' 这时你会发现镜像数据库还是“正在还原/已断开”的状态,这是正常的。
  2. 紧接着,马上切换到主服务器上,执行连接镜像服务器的命令: ALTER DATABASE [你的数据库名] SET PARTNER = 'TCP://镜像服务器IP地址:5022'

当你执行完第二步,如果一切顺利,SQL Server Management Studio的图形界面里,你右键点击主数据库,选择“属性”再点到“镜像”页面,就会看到状态变成了“已同步”,并且出现了“故障转移”的按钮,恭喜你,这说明镜像关系已经成功建立了!

第五步:测试一下,看看“备胎”是否靠谱

搭建好了不测试,等于白搭,你可以尝试手动故障转移一下:

  1. 在镜像页面,直接点击“故障转移”按钮。
  2. 几秒钟后,你会发现原来的主服务器变成了镜像服务器,而原来的镜像服务器变成了主服务器,你的应用程序如果连接字符串配置正确(包含了故障转移伙伴信息),应该只会感觉到非常短暂的卡顿,然后就能继续正常工作了。

这个测试能让你心里彻底有底。

最后的小贴士

  • 性能影响:镜像毕竟需要实时同步数据,会对主服务器产生一定的网络和I/O开销,在业务低峰期操作是明智的选择。
  • 连接字符串:要让应用程序在故障时能自动切换到镜像服务器,你需要在程序的数据库连接字符串里加上 Failover Partner 参数,指明镜像服务器的地址。
  • 监控:你可以在系统视图 sys.database_mirroring 里查看镜像的状态、是否同步延迟等信息。

看,是不是并没有想象中那么复杂?它更像是一个流程化的操作,每一步都有明确的意图,只要你胆大心细,一步步跟着做,完全有能力自己搞定这个提升数据库可靠性的“大杀器”。

教你一步步搞定SQL Server镜像,别怕操作复杂其实没那么难