数据库镜像会话

数据库镜像发生在数据库镜像会话的上下文中。本主题假定您熟悉数据库镜像中的主体角色、镜像角色和见证服务器角色、运行模式以及角色切换。有关详细信息,请参阅数据库镜像概述

镜像数据库就绪且配置了服务器实例后,数据库所有者便可以启动数据库镜像。只要镜像开始,每个伙伴便开始在其数据库中维护有关该数据库以及其他伙伴和见证服务器的状态信息(如果有)。此状态信息允许服务器实例维护称为“数据库镜像会话”的关系。在整个数据库镜像会话期间,服务器实例相互监视。在数据库所有者停止会话之前,将一直维护状态信息。有关详细信息,请参阅镜像状态监视数据库镜像

在数据库镜像会话开始时,镜像服务器将标识应用到镜像数据库的最新事务日志的日志序列号 (LSN),并要求主体服务器为所有后续事务(如果有)建立事务日志。作为响应,主体服务器将自上一个还原到镜像数据库或发送到镜像服务器的日志以来累积的所有活动日志记录发送到镜像服务器。在主体数据库的日志磁盘中累积的未发送日志称为“发送队列”。

镜像服务器立即将传入日志写入磁盘,传入日志在应用到镜像数据库之前一直保留在磁盘上。在镜像磁盘上等待的日志称为“重做队列”。重做队列中等待的未还原日志数指示将故障转移到镜像数据库所需的时间。有关详细信息,请参阅估计角色切换过程中的服务中断

主体服务器继续让客户端和客户端连接使用主体数据库。镜像开始后,每当客户端更新主体数据库,并将事务写入主体数据库的日志时,主体服务器便会将该日志记录发送到镜像服务器。同时,镜像服务器立即将日志记录写入磁盘,作为重做队列中的最新记录。

在后台,镜像服务器从最早的日志记录开始,尽快在镜像数据库中逐个“重做”日志记录。重做日志涉及从最早的记录开始,将排队的日志记录按顺序应用到镜像数据库的操作。每条日志记录仅重做一次。当镜像服务器重做日志时,镜像数据库将继续前滚。当主体服务器截断或收缩主体数据库的日志时,镜像服务器也将在日志流的同一点收缩日志。

通常,重做可加速镜像数据库与主体数据库的同步。镜像数据库是否完全与主体数据库保持同步取决于会话的运行模式。在同步、高安全性模式下,主体服务器等待确认新事务,直到将这些新事务写入镜像服务器的日志磁盘为止。将累积的日志记录发送到镜像服务器之后,镜像数据库便会与主体数据库保持同步。

会话期间,如果主体服务器不能立即发送每个日志记录,则未发送日志记录会累积在发送队列中。在同步、高安全性模式下,执行同步后,仅当镜像暂停或挂起时才会累积新的未发送日志。相反,在异步、高性能模式下,只要镜像服务器在镜像期间滞后以及镜像暂停或挂起,便会累积未发送日志。未发送日志数指示主体服务器出现故障时可能造成的数据丢失。

注意注意

如果重做失败,则镜像服务器通过将数据库置于 SUSPENDED 状态来暂停会话。数据库所有者必须找到失败的原因并解决问题才能继续会话。

并发会话

给定的服务器实例可以参与到多个具有相同或不同服务器实例的并发数据库镜像会话(每个镜像数据库发生一次)中。通常,服务器实例专门用作其所有数据库镜像会话中的伙伴或见证服务器。但是,由于每个会话都独立于其他会话,因此服务器实例可以在某些会话中充当伙伴,而在其他会话中充当见证服务器。例如,请看三个服务器实例(SSInstance_1、SSInstance_2 和 SSInstance_3)中的下列四个会话。每个服务器实例都可在某些会话中作为伙伴,而在其他会话中作为见证服务器:

服务器实例

数据库 A 的会话

数据库 B 的会话

数据库 C 的会话

数据库 D 的会话

SSInstance_1

见证服务器

伙伴

伙伴

伙伴

SSInstance_2

伙伴

见证服务器

伙伴

伙伴

SSInstance_3

伙伴

伙伴

见证服务器

见证服务器

下图说明了都作为伙伴参与两个镜像会话的两个服务器实例。一个会话用于名为 Db_1 的数据库,另一个会话用于名为 Db_2 的数据库。

位于两个并发会话中的两个服务器实例

每个数据库独立于其他数据库。例如,服务器实例最初可能是两个数据库的镜像服务器。如果其中一个数据库发生故障转移,则服务器实例将变为已发生故障转移的数据库的主体服务器,同时为其他数据库保留镜像服务器。

再举一个例子,假设有一个服务器实例,它是两个或多个以具有自动故障转移功能的高安全性模式运行的数据库的主体服务器,如果此服务器实例失败,则所有数据库将自动故障转移到其相应的镜像数据库。

如果将一个服务器实例设置成既作为伙伴又作为见证服务器参与会话,请确保数据库镜像端点能够支持两种角色(有关详细信息,请参阅数据库镜像端点)。同时,还要确保系统具有足够资源以减少资源争用。

注意注意

由于镜像数据库相互独立,因此这些数据库不能作为一个组来进行故障转移。

为数据库镜像会话创建的线程

服务器实例为数据库镜像会话创建的线程种类部分取决于该服务器实例执行的镜像角色。给定会话具有以下部分或全部线程:

  • 一个数据库镜像通信的全局线程。此线程由 Service Broker 启动。

  • 如果服务器实例作为镜像伙伴(是主体服务器还是镜像服务器):

    • 对于事件处理,每个镜像数据库使用一个线程。

    • 对于将阻止事件线程的异步任务(如日志发送或日志编写),每个镜像数据库使用一个线程。

  • 只要实例用作镜像服务器:

    • 一个重做管理器线程,用于提交重做日志、执行预读页、锁获取等。

    • 在 SQL Server Standard 中,每个镜像数据库使用一个重做线程,或者在 SQL Server Enterprise 中,对于每四个 CPU,每个镜像数据库使用一个重做线程。这些线程执行实际日志重做。

  • 如果实例作为见证服务器:

    • 对于实例在其中作为见证服务器的镜像会话,存在一个用于处理见证服务器消息的全局线程。

数据库镜像会话的必备条件

开始镜像会话之前,数据库所有者或系统管理员必须创建镜像数据库,设置端点和登录名。在某些情况下,还要创建并设置证书。有关详细信息,请参阅设置数据库镜像

创建镜像数据库的最低要求是:执行主体数据库的完整备份和一个后续日志备份,并使用 WITH NORECOVERY 将这两个备份还原到镜像服务器实例上。此外,在开始镜像之前,如果在执行完必要的日志备份之后又执行了任何其他日志备份,则还必须手动应用其他每个日志备份(始终使用 WITH NORECOVERY)。应用最新的日志备份之后,便可开始镜像。有关详细信息,请参阅为镜像准备镜像数据库

暂停会话对主体事务日志的影响

数据库所有者可以随时暂停会话。执行暂停操作将保留在删除镜像时的会话状态。暂停会话时,主体服务器不会向镜像服务器发送任何新的日志记录。所有这些记录将保持活动状态,并堆积在主体数据库的事务日志中。只要数据库镜像会话保持暂停状态,事务日志就不会被截断。因此,如果数据库镜像会话暂停时间过长,则可能会使该日志填满。

有关详细信息,请参阅暂停和恢复数据库镜像

客户端连接

Microsoft.NET Data Provider for SQL Server 提供了对数据库镜像会话的客户端连接支持。有关详细信息,请参阅连接客户端与镜像数据库