适用于:SQL Server
本主题说明数据库镜像会话的同步和异步运行模式。
注意
有关数据库镜像的介绍,请参阅数据库镜像 (SQL Server)。
术语和定义
此节介绍了几个术语,它们是本主题的核心。
高性能模式
数据库镜像会话异步运行并仅使用主体服务器和镜像服务器。 唯一的角色切换形式是强制服务(可能造成数据丢失)。
高安全性模式 (High-safety mode)
数据库镜像会话以同步方式运行,并使用主体服务器和镜像服务器,还可选择使用见证服务器。
事务安全
一种镜像特定的数据库属性,用于确定数据库镜像会话是同步运行还是异步运行。 有两种安全级别:FULL 和 OFF。
见证
仅用于高安全性模式下的 SQL Server 可选实例,它使镜像服务器能够判断是否应启动自动故障转移。 与这两个故障转移伙伴不同,见证服务器并不为数据库提供服务。 见证服务器的唯一作用是支持自动故障转移。
异步数据库镜像(高性能模式)
此节介绍异步数据库镜像的工作原理,何时适合使用高性能模式以及在主体服务器发生故障时如何响应。
注意
大多数 SQL Server 版本仅支持同步数据库镜像(“仅支持‘完全’安全级别”)。 有关完全支持数据库镜像的版本的信息,请参阅 SQL Server 2022 的各个版本及其支持的功能中的“高可用性 (Always On)”。
将事务安全设置为 OFF 时,数据库镜像会话便会异步运行。 异步操作仅支持一种操作模式,即高性能模式。 此模式可增强性能,但要牺牲高可用性。 高性能模式仅使用主体服务器和镜像服务器。 镜像服务器上出现的问题不会影响主体服务器。 主服务器发生故障时,镜像数据库会被标记为 DISCONNECTED,但仍可用作热备用数据库。
高性能模式仅支持一种角色切换形式:强制服务(可能造成数据丢失),此服务使用镜像服务器作为备用服务器。 强制服务是可能对主体服务器故障作出的响应之一。 由于可能会造成数据丢失,因此在强制服务切换到镜像之前,应先考虑其他替代方案。 有关详细信息,请参阅本主题后面的 对主体服务器故障的响应。
下图显示了使用高性能模式的会话的配置。
在高性能模式下,主体服务器向镜像服务器发送事务日志之后,就立即向客户端发送确认,而不会等待镜像服务器的确认。 事务不等待镜像服务器将日志写入磁盘便提交。 异步操作使主服务器能够以最低的事务延迟运行。
镜像服务器尝试与主体服务器发送的日志记录保持同步。 但是镜像数据库可能在某种程度上滞后于主体数据库,尽管这两个数据库之间的时间间隔通常很小。 但是,如果主体服务器的工作负荷过高或镜像服务器系统的负荷过高,则时间间隔会增大。
本节内容:
何时适合使用高性能模式?
高性能模式在灾难恢复方案中非常有用,在这种方案中,主体服务器和镜像服务器之间的距离非常大,并且您不希望小错误影响主体服务器。
注意
日志传送可以作为数据库镜像的补充,最好用其替代异步数据库镜像。 有关日志传送优点的信息,请参阅高可用性解决方案 (SQL Server)。 有关将日志传送与数据库镜像结合使用的信息,请参阅 数据库镜像和日志传送 (SQL Server)。
见证服务器对高性能模式的影响
如果使用 Transact-SQL 配置高性能模式,则当 SAFETY 属性设置为 OFF 时,我们极力建议也将 WITNESS 属性设置为 OFF。 见证服务器可以与高性能模式同时使用,但见证服务器并无益处,反而会引入风险。
当其中任何一个伙伴出现故障而导致见证服务器与会话断开连接时,数据库便无法使用。 这是因为,尽管高性能模式不需要见证服务器,但如果设置了见证服务器,会话就需要由两个或多个服务器实例构成法定人数。 如果会话失去仲裁,则无法为数据库提供服务。
在高性能模式会话中设置了见证服务器后,仲裁机制的强制执行意味着:
如果镜像服务器丢失,则主体服务器必须连接到见证服务器。 否则,主体服务器将使其数据库脱机,直到见证服务器或镜像服务器重新加入会话。
如果主体服务器丢失,则强制服务到镜像服务器时需要将镜像服务器连接到见证服务器。
注意
有关仲裁集类型的详细信息,请参阅 仲裁:见证如何影响数据库可用性(数据库镜像)。
对主体服务器故障的响应
当主体服务器出现故障时,数据库所有者有多种选择,如下所示:
让数据库保持不可用状态,直到主数据库恢复可用。
如果主体数据库及其事务日志保持不变,此选择将保留所有已提交的事务,但会牺牲可用性。
停止数据库镜像会话,手动更新数据库,然后开始新的数据库镜像会话。
如果主数据库已丢失,但主服务器仍在运行,则应立即尝试备份该主数据库的日志尾部。 如果结尾日志备份成功,则删除镜像可能是最佳选择。 删除镜像后,可以将日志还原到以前的镜像数据库中,从而保留所有数据。
注意
如果结尾日志备份失败并且无法等待主体服务器恢复,则请考虑强制服务,这样做的好处是可以保持会话状态。
强制在镜像服务器上提供服务(可能会导致数据丢失)。
严格讲来,强制服务是一种灾难恢复方法,应尽量少使用此方法。 只有在主体服务器已关闭、会话为异步(事务安全设置为 OFF),并且满足以下条件之一时,才可以强制进行服务:该会话没有任何见证服务器(WITNESS 属性设置为 OFF),或者见证服务器已连接到镜像服务器(即它们具有仲裁)。
强制服务会导致镜像服务器成为主体角色,并将其数据库的副本提供给客户端。 进行强制服务后,主体服务器未发送至镜像服务器的所有事务日志都将丢失。 因此,您应仅在以下情况下使用强制服务:可以接受可能的数据丢失,且数据库必须立即可用。 有关强制服务工作原理及最佳使用方法的信息,请参阅数据库镜像会话期间的角色切换 (SQL Server)。
同步数据库镜像(高安全性模式)
本节介绍同步数据库镜像的工作原理,包括可选的高安全性模式(带自动故障转移和不带自动故障转移),并介绍了见证服务器在自动故障转移中的作用。
当事务安全设置为 FULL 时,数据库镜像会话便会在初始同步阶段后以高安全性模式同步运行。 此节介绍了为同步操作配置的数据库镜像会话的详细信息。
若要实现会话的同步操作,镜像服务器必须将镜像数据库与主体数据库同步。 会话开始时,主体服务器开始将其活动日志发送到镜像服务器。 镜像服务器将所有传入日志记录尽快写入磁盘。 当所有接收到的日志记录写入磁盘后,数据库便会立即进行同步。 只要伙伴保持通信,数据库就保持同步状态。
注意
若要监视数据库镜像会话中的状态更改,请使用 Database Mirroring State Change 事件类。 有关详细信息,请参阅 Database Mirroring State Change Event Class。
同步结束后,在主体数据库中提交的每个事务也在镜像服务器上提交,因此确保数据受到保护。 其实现方法是等待在主体数据库中提交事务,直到主体服务器收到来自镜像服务器的消息:镜像服务器已将事务的日志镜像到磁盘。 注意,等待此消息会增加事务的滞后时间。
同步所需的时间实质上取决于会话开始时镜像数据库滞后于主体数据库的时间(按最初从主体服务器收到的日志记录数计量)、主体数据库的工作负荷和镜像系统的速度。 会话完成同步后,镜像数据库中尚未重做的已写入磁盘的日志仍保留在重做队列中。
镜像数据库同步后,两个数据库副本的状态将立即改为 SYNCHRONIZED。
同步操作按下列方式维护:
从客户端收到事务时,主体服务器将事务的日志写入事务日志中。
主体服务器将事务写入数据库中,同时将日志记录发送到镜像服务器。 主体服务器等待来自镜像服务器的确认,然后向客户端发送下列任一确认消息:事务提交或回滚。
镜像服务器将日志持久写入磁盘,并向主服务器返回确认。
收到来自镜像服务器的确认时,主体服务器将向客户端发送一条确认消息。
高安全性模式通过要求数据在两个位置间保持同步来保护数据。 所有已提交的事务都保证会写入镜像服务器的磁盘中。
本节内容:
无自动故障转移的高安全模式
下图显示了无自动故障转移的高安全模式配置。 该配置仅由这两个合作伙伴组成。
当伙伴连接在一起并且数据库已同步时,支持手动故障转移。 如果镜像服务器实例出现故障,则主体服务器实例不会受到影响并且公开运行(即,未镜像数据)。 如果主服务器丢失,则镜像将暂停,但可强制切换到镜像服务器提供服务(可能造成数据丢失)。 有关详细信息,请参阅数据库镜像会话期间的角色切换 (SQL Server)。
具有自动故障转移的高安全性模式
自动故障转移通过确保在丢失一个服务器之后仍向数据库提供服务来提供高可用性。 自动故障转移要求会话具有第三个服务器实例(“见证服务器 ”),理想情况是见证服务器驻留在第三台计算机上。 下图显示了支持自动故障转移的高安全性模式会话的配置。
与两个伙伴服务器不同,见证服务器不为数据库提供服务。 见证服务器只是通过验证主体服务器是否已启动并正常运行来支持自动故障转移。 只有当镜像服务器和见证服务器在两者都与主体服务器断开连接后仍保持彼此连接时,镜像服务器才会发起自动故障转移。
设置见证服务器后,会话需要仲裁——即至少两个服务器实例之间的一种关系,使数据库可供使用。 有关详细信息,请参阅数据库镜像见证服务器和仲裁:见证服务器如何影响数据库可用性(数据库镜像)。
自动故障转移需要以下条件:
数据库已同步。
发生故障时所有三个服务器实例均处于连接状态,并且见证服务器和镜像服务器保持连接状态。
丢失伙伴会产生以下影响:
如果在上述条件下主服务器变得不可用,则会自动进行故障转移。 镜像服务器切换到主服务器角色,并将其数据库作为主数据库提供服务。
如果主体服务器在这些条件不满足时变得不可用,则可能会强制服务(可能造成数据丢失)。 有关详细信息,请参阅数据库镜像会话期间的角色切换 (SQL Server)。
如果只有镜像服务器变得不可用,则主体服务器和见证服务器将继续运行。
如果会话失去见证服务器,则法定人数需要两个伙伴服务器。 如果任一伙伴节点无法达到法定人数,则两个伙伴节点都将失去法定人数,数据库也会一直不可用,直到重新建立法定人数为止。 此仲裁要求可确保在没有见证的情况下,数据库绝不会以暴露状态运行,也就是说,绝不会在未进行镜像的情况下运行。
注意
如果您预计见证会在较长时间内保持断开连接,我们建议您在其恢复可用之前,将见证从会话中移除。
Transact-SQL 设置和数据库镜像运行模式
本部分根据 ALTER DATABASE 镜像数据库和见证服务器(如果有)的设置及状态来介绍数据库镜像会话。 它针对主要或专门使用 Transact-SQL(而不是使用 SQL Server Management Studio)管理数据库镜像的用户。
提示
除了可以使用 Transact-SQL 以外,还可以使用“数据库属性”对话框的“镜像”页在对象资源管理器中控制会话的运行模式。 有关详细信息,请参阅使用 Windows 身份验证建立数据库镜像会话 (SQL Server Management Studio)。
本节内容:
事务安全性和见证状态如何影响运行模式
会话的操作模式由其事务安全设置与见证服务器的状态共同决定。 数据库所有者可随时更改事务安全级别,并可添加或删除见证服务器。
本节内容:
事务安全
事务安全是镜像特定的数据库属性,用于确定数据库镜像会话是同步运行还是异步运行。 有两种安全级别:FULL 和 OFF。
完全安全
完整事务安全可使会话在高安全性模式下同步运行。 如果存在见证服务器,则会话支持自动故障转移。
使用 ALTER DATABASE 语句建立会话时,会话从 SAFETY 属性设置为 FULL 开始;也就是说,会话以高安全模式开始。 会话开始后,您可以添加见证。
有关详细信息,请参阅本主题前面的 同步数据库镜像(高安全性模式)。
安全关闭
关闭事务安全可使会话在异步高性能模式下运行。 如果 SAFETY 属性设置为 OFF,则 WITNESS 属性也应该设置为 OFF(默认值)。 有关高性能模式下见证的影响,请参阅本主题后文中的 见证的状态。 有关在关闭事务安全性的情况下运行的详细信息,请参阅本主题前面的 异步数据库镜像(高性能模式)。
数据库的事务安全性设置记录在每个伙伴的 sys.database_mirroring 目录视图中的 mirroring_safety_level 和 mirroring_safety_level_desc 列内。 有关详细信息,请参阅 sys.database_mirroring (Transact-SQL)。
数据库所有者可以随时更改事务安全级别。
见证的状态
如果已设置见证服务器,则需要法定票数,因此见证服务器的状态始终很关键。
如果见证存在,则有两种状态之一:
当见证与伙伴连接时,见证相对于该伙伴处于 CONNECTED 状态,并与该伙伴形成仲裁。 在这种情况下,即使其中一个合作方不可用,数据库仍可用。
如果见证服务器存在,但是未连接到伙伴,则见证服务器相对于该伙伴处于 UNKNOWN 或 DISCONNECTED 状态。 在这种情况下,见证服务器无法与该伙伴形成仲裁多数;如果两个伙伴之间彼此未连接,则数据库将变得不可用。
有关仲裁的详细信息,请参阅 仲裁:见证如何影响数据库可用性(数据库镜像)。
在某个服务器实例上,每个见证服务器的状态记录在 sys.database_mirroring 目录视图的 mirroring_witness_state 和 mirroring_witness_state_desc 列中。 有关详细信息,请参阅 sys.database_mirroring (Transact-SQL)。
下表总结了会话的事务安全设置和见证服务器的状态是如何决定会话运行模式的。
| 运行模式 | 事务安全 | 见证状态 |
|---|---|---|
| 高性能模式 | 关 | NULL(无见证)** |
| 无自动故障转移的高安全性模式 | FULL | NULL(无见证) |
| 支持自动故障转移的高安全模式* | 完整 | 已连接 |
*如果见证服务器断开连接,则建议你设置 WITNESS OFF,直到见证服务器实例变为可用。
**如果见证服务器处在高性能模式下,它不会参与会话。 但是,若要使数据库可用,必须至少有两个服务器实例保持连接。 因此,建议您在高性能模式会话中,始终将 WITNESS 属性设置为 OFF。 有关详细信息,请参阅 仲裁:见证服务器如何影响数据库可用性(数据库镜像)。
查看安全设置和见证服务器状态
若要查看数据库的安全设置和见证服务器状态,请使用 sys.database_mirroring 目录视图。 相关列如下所示:
| 因素 | 列 | 说明 |
|---|---|---|
| 事务安全 | mirroring_safety_level 或 mirroring_safety_level_desc | 镜像数据库上更新操作的事务安全设置,以下选项之一: UNKNOWN 关 完整 NULL= 数据库没有在线。 |
| 是否存在见证? | mirroring_witness_name | 数据库镜像见证服务器的名称或 NULL(指示不存在见证服务器)。 |
| 见证状态 | mirroring_witness_state 或 mirroring_witness_state_desc | 给定伙伴上的数据库中的见证服务器状态: UNKNOWN 已连接 已断开连接 NULL = 不存在见证,或者数据库未联机。 |
例如,在主体服务器或镜像服务器上,输入:
SELECT mirroring_safety_level_desc, mirroring_witness_name, mirroring_witness_state_desc FROM sys.database_mirroring
有关此目录视图的详细信息,请参阅 sys.database_mirroring (Transact-SQL)。
主服务器丢失时影响行为的因素
下表总结了丢失主体服务器时事务安全设置、数据库的状态以及见证服务器的状态对镜像会话行为的综合影响。
| 事务安全 | 镜像数据库的镜像状态 | 见证状态 | 主体丢失时的行为 |
|---|---|---|---|
| 完整 | 已同步 | 已连接 | 发生自动故障转移。 |
| 完整 | 已同步 | 已断开连接 | 镜像服务器停止运行;无法进行故障转移,并且无法使数据库恢复可用。 |
| 关 | 已暂停或已断开连接 | NULL(无见证) | 服务可强制切换到镜像服务器(可能会导致数据丢失)。 |
| 完整 | 正在同步或已暂停 | NULL(无见证) | 可强制将服务切换到镜像服务器(可能会导致数据丢失)。 |