什么是 SQL Server 镜像?

SQL Server 数据库镜像是一种高可用性解决方案,它通过在两个或三个 SQL Server 实例之间自动复制数据库事务来提供数据库的冗余和快速故障转移。
其核心思想是:当一台服务器(主体服务器)发生故障时,另一台服务器(镜像服务器)可以立即接管其角色,从而最小化数据库的停机时间,保证业务连续性。
核心组件与工作模式
数据库镜像主要涉及三个核心组件,根据配置不同,可以组成两种主要的工作模式。
核心组件
-
主体数据库
(图片来源网络,侵删)- 角色:当前为客户端提供读写服务的数据库。
- 状态:所有事务都在主体数据库上提交。
- 操作:所有对数据库的修改操作都由主体数据库处理。
-
镜像数据库
- 角色:主体数据库的实时、事务级别的副本。
- 状态:始终处于“恢复中”(Restoring) 状态,因为它不断地从主体接收事务日志记录并进行还原。
- 操作:它只读,不处理客户端请求,其唯一任务是保持与主体数据库的同步。
-
见证服务器
- 角色:一个独立的 SQL Server 实例(可以是 Express 版本),它不承载任何数据库副本,只负责“见证”主体和镜像之间的通信。
- 作用:在自动故障转移中,见证服务器是防止“脑裂”的关键,它投票决定主体服务器是否真的发生故障,只有当主体与镜像都联系不上见证服务器时,镜像服务器才会被允许提升为新的主体。
工作模式
根据是否使用见证服务器,镜像可以分为两种模式:
| 特性 | 高安全模式 | 高可用性模式 |
|---|---|---|
| 组件 | 主体 + 镜像 + 见证服务器 | 主体 + 镜像 |
| 数据同步 | 同步 | 异步 |
| 提交方式 | 同步提交 | 异步提交 |
| 性能 | 性能较低,因为每次事务提交都需要等待镜像确认。 | 性能较高,因为事务提交后无需等待镜像。 |
| 故障转移 | 自动故障转移 | 需要手动故障转移 |
| 数据丢失风险 | 零数据丢失(在正常故障转移时) | 可能有数据丢失(主体上已提交但未传到镜像的事务会丢失) |
| 适用场景 | 对数据一致性要求极高,能容忍轻微性能损耗的场景。 | 对性能要求高,且能容忍少量数据丢失的场景。 |
工作原理与数据流
无论哪种模式,数据流的方向都是单向的:主体 → 镜像。
- 客户端连接:客户端应用程序通过一个数据库镜像端点连接到主体数据库。
- 事务处理:客户端在主体数据库上执行一个事务(如
UPDATE语句)。 - 日志记录:主体服务器将事务日志记录写入其事务日志。
- 日志传输:
- 主体服务器将事务日志记录发送给镜像服务器。
- 镜像服务器接收这些日志记录,并将其写入其自身的事务日志。
- 数据应用:
- 同步提交:镜像服务器将日志记录应用到其数据文件(即还原数据库)后,会向主体服务器发送一个“确认”信号,只有收到这个确认后,主体服务器才会向客户端返回“事务成功”的响应。
- 异步提交:主体服务器在发送日志记录后,无需等待镜像的确认,立即向客户端返回“事务成功”的响应,镜像服务器会在后台应用这些日志。
- 状态监控:
- 镜像服务器持续监控主体服务器的状态。
- 见证服务器持续监控主体和镜像服务器的状态。
配置步骤概要
配置数据库镜像是一个多步骤的过程,涉及两个或三台服务器。
-
准备工作:
- 服务器:至少两台(主体和镜像),三台(包含见证)。
- 操作系统和 SQL Server 版本:尽量保持一致或兼容。
- 数据库:主体数据库必须处于 FULL 或 BULK_LOGGED 恢复模式。
- 网络:服务器之间必须能够相互通信,建议使用专用网络以提高性能和安全性。
- 服务账户:运行 SQL Server 服务的账户在所有服务器上必须相同,或者彼此具有权限。
-
创建数据库镜像端点:
- 在主体、镜像和见证(如果使用)服务器上,都需要创建一个端点。
- 这个端点是服务器之间通信的通道,使用 TCP 协议,默认端口为 5022。
- 端点需要授予对其他服务器端点的连接权限。
-
准备镜像数据库:
- 在主体服务器上,对要进行镜像的数据库进行完整备份。
- 将此备份文件和事务日志备份(如果有的话)复制到镜像服务器上。
- 在镜像服务器上,使用
WITH NORECOVERY选项还原这些备份,这确保了镜像数据库处于“恢复中”状态,可以接收日志。
-
建立镜像会话:
-
这是最关键的一步,在任意一台服务器上(通常在主体服务器上)使用 T-SQL 命令来启动会话。
-
高安全模式(带自动故障转移):
-- 在主体服务器上执行 ALTER DATABASE YourDatabaseName SET PARTNER = 'TCP://MirrorServerName:5022'; GO -- 在镜像服务器上执行 ALTER DATABASE YourDatabaseName SET PARTNER = 'TCP://PrincipalServerName:5022'; GO -- 在见证服务器上执行 ALTER DATABASE YourDatabaseName SET WITNESS = 'TCP://WitnessServerName:5022'; GO
-
高性能模式(手动故障转移):
-- 在主体服务器上执行 ALTER DATABASE YourDatabaseName SET PARTNER = 'TCP://MirrorServerName:5022'; GO -- 在镜像服务器上执行 ALTER DATABASE YourDatabaseName SET PARTNER = 'TCP://PrincipalServerName:5022'; GO
-
-
配置客户端连接:
- 默认情况下,当故障转移发生时,客户端连接会中断。
- 为了实现自动重连,需要在客户端的连接字符串中添加
Failover Partner参数,指定见证服务器的地址(或镜像服务器的地址)。 - 当客户端连接失败时,它会自动尝试连接到
Failover Partner指定的服务器。
故障转移
-
自动故障转移:
- 触发条件:主体服务器与网络发生故障,且无法与镜像和见证服务器通信。
- 过程:镜像服务器在确认与主体和见证都失去联系后,会自动将自己提升为新的主体,见证服务器的存在确保了只有在主体完全“孤立”时才会发生,避免了“脑裂”。
- 客户端:配置了
Failover Partner的客户端会自动重连到新的主体服务器,整个过程对用户透明。
-
手动故障转移:
- 触发条件:计划内的维护(如升级主体服务器)或在高性能模式下发生的故障。
- 过程:需要数据库管理员手动执行,需要先让主体数据库同步到镜像,然后强制切换角色。
- 命令:
-- 1. 在原主体服务器上,执行强制服务(将主体降级为镜像) ALTER DATABASE YourDatabaseName SET PARTNER FAILOVER;
执行后,原主体成为新的镜像,原镜像成为新的主体,之后需要手动重新配置所有服务器的角色。
优点与缺点
优点
- 高可用性:提供快速、自动的故障转移能力,最大限度地减少停机时间。
- 数据安全性高:通过同步提交模式,可以实现零数据丢失。
- 故障转移透明:客户端可以配置为自动重连,无需应用程序修改。
- 配置相对简单:与 Always On 可用性组等解决方案相比,配置步骤更直接。
缺点
- 数据库级别:镜像只能针对单个数据库进行配置,无法像 Always On AG 那样对多个数据库进行统一管理。
- 性能开销:同步提交模式会显著增加事务提交的延迟,影响性能。
- 资源消耗:镜像服务器需要与主体服务器配置相当或更高的硬件资源,因为需要实时处理日志和应用数据。
- Windows 故障转移集群 依赖:在高安全模式下,强烈建议将镜像配置在 Windows 故障转移集群 上,以防止镜像服务器本身发生硬件故障,这增加了部署的复杂性。
- 已弃用:非常重要! 微软已将数据库镜像标记为“弃用” (Deprecated),这意味着在未来的 SQL Server 版本中,它可能会被移除。
替代方案:Always On 可用性组
由于数据库镜像已被弃用,微软推荐使用 Always On 可用性组 作为其现代的、功能更强大的高可用性和灾难恢复解决方案。
Always On AG 的优势:
- 多数据库支持:一个可用性组可以包含多达 8 个用户数据库。
- 读写次要副本:次要副本可以被配置为可读,用于报表等负载,分担主体压力。
- 更灵活的故障转移:支持自动、手动和强制手动多种故障转移模式。
- 更优的架构:基于 Windows Server 故障转移集群,提供更健壮的故障检测和恢复机制。
- 连续复制:支持异步提交的次要副本,用于灾难恢复,可以容忍更大的数据延迟。
| 特性 | SQL Server 数据库镜像 | SQL Server Always On 可用性组 |
|---|---|---|
| 状态 | 已弃用 | 当前推荐 |
| 支持对象 | 单个数据库 | 多个数据库(可用性组) |
| 次要副本用途 | 仅用于故障转移 | 可读、用于备份、用于灾难恢复 |
| 故障转移 | 自动(高安全模式)或手动 | 自动、手动、强制手动 |
| 灵活性 | 低 | 高 |
| 未来 | 不建议在新项目中使用 | 新项目的首选高可用方案 |
对于新的项目或需要升级现有高可用架构的系统,强烈建议使用 Always On 可用性组,数据库镜像虽然在某些简单场景下仍然可用,但由于其已弃用的状态和功能上的局限性,不应作为长期解决方案,对于仍在使用镜像的系统,应制定计划,逐步迁移到 Always On AG。
