Microsoft.com 技术内幕数据库镜像入门

Saleem Hakani

如果数据库脱机,您很可能会陷入困境,是这样吧?但是,如果您使用的是 SQL Server 2005 SP1,那么通过数据库镜像功能可以避免灾难的发生。这一具有高可用性的新技术可以让您维护数据库的热备用,

以便在生产数据库服务器因故无法使用时使用。数据库镜像功能通过将数据库的事务日志记录从主服务器传送到辅助服务器(用作热备用)来工作。通过数据库镜像,数据更改会首先记录到事务日志中,然后才会对实际数据页进行任何更改,就像 SQL Server™ 更新一直所采取的工作方式一样。日志记录首先被置于内存中主体数据库的日志缓冲区内,然后再保留到磁盘上。这些事务日志会复制到镜像服务器的数据库中并在那里重播。这样,主体数据库的更改便复制到镜像数据库。请注意,只有客户端连接才能访问主体数据库。当主体数据库收到客户端所请求的更改时,主体服务器会将这些活动的更改发送到镜像服务器,而镜像不会作出任何决定。在启用了数据库镜像的情况下,当主体数据库出现故障时,镜像数据库会变为可用。

数据库镜像的结构

数据库镜像适用于支持 SQL Server 2005 的所有标准硬件,它会确保在数据库发生故障时不丢失任何数据。在主数据库服务器上所处理的当前事务始终会更新到镜像数据库中。图 1 说明了这一过程的数据流。

如果主体服务器确实出现故障,您尽可放心,镜像服务器拥有主体数据库截至上一次所提交事务时的准确时点副本。因此,镜像随时准备接替主体服务器的角色。

Figure 1 Data replication to the mirror

Figure 1** Data replication to the mirror **(单击该图像获得较大视图)

在数据库镜像拓扑中,如果您想要启用从主体服务器到镜像服务器或从镜像服务器到主体服务器的自动故障转移,则需要一个称为见证方的第三个服务器。见证服务器可以是能支持 SQL Server 2005 的任何计算机。

操作模式

您所要使用的数据库镜像拓扑取决于所选择的事务安全和操作模式。数据库镜像所支持的操作模式包括高安全(带或者不带自动故障转移)和高性能模式。

高安全(带自动故障转移):这种模式以针对镜像数据库的同步数据传输和自动故障转移来维持最高的数据库可用性。如果主体数据库与镜像服务器之间具有快速而又非常可靠的通信,而且您需要单个数据库的自动故障转移,使用这种操作模式最为理想。在此方案中,主体数据库会等到收到来自镜像服务器的消息(说明镜像服务器已将事务日志强化到磁盘)后再提交事务。

高安全(不带自动故障转移):这种模式以同步数据传输来维持最高的数据库可用性,但它不具有自动故障转移到镜像数据库的功能。在此模式下,如果镜像服务器实例变得无法使用,主体服务器实例会继续工作,但将不能进行数据镜像。如果主体服务器出现故障,数据库镜像会暂停,但您可以手动强制服务进行故障转移。

高性能:在这种操作模式下,数据的传输是异步的。主体服务器不会像前两个模式那样等待来自镜像服务器的确认。镜像服务器会尽力与主体服务器保持一致,但在任何时刻都不能保证来自主体服务器的所有最新事务会在镜像服务器的事务日志中得到强化。如果主体服务器出现故障,数据库镜像会暂停,但您可以手动强制服务进行故障转移。

奠定基础

如果采用以下最佳实践方法来奠定一个坚固的基础,那么建立数据库镜像就是一个非常简单的过程:

服务器版本 仔细检查主体服务器和镜像服务器是否在相同版本的 SQL Server 2005 上运行;您可以使用 Standard 或 Enterprise 版本。

见证服务器可用性 如果打算使用带自动故障转移的高安全模式,应确保见证服务器可用且装有 SQL Server 2005(任何版本)。见证服务器可以在支持 SQL Server 2005 的任何可靠的计算机系统上运行。

镜像 确保镜像服务器实例与主体服务器实例具有同样的作业、登录、SQL Server Integration Service (SSIS) 程序包、磁盘分区、文件位置和服务器配置。完全按照主体服务器那样配置镜像服务器会使镜像服务器以与主体服务器相同的方式进行工作。

完全恢复 所有参与数据库镜像的数据库都设置为 FULL 恢复模式,这一点很重要。

Master 和 TempDB 验证镜像拓扑中的所有服务器实例使用相同的 Master 和 TempDB 排列规则和代码页。不同的排列规则和代码页可能会在数据库镜像建立期间引发问题。

备份 如果所要镜像的数据库规模很大,则必须首先执行数据库的完整备份,然后使用 NORECOVERY 选项在镜像服务器实例上将其还原。

提前规划 确定所有的服务器名、端口号、安全帐户以及这些信息在数据库上的驻留和记录位置。请参阅“数据库镜像最佳实践”边栏,以获得检查表。

在基础奠定好之后,您就可以在所处环境中建立数据库镜像了。

数据库镜像最佳实践

  1. 使用具有相同 CPU、内存、存储器和网络容量的伙伴服务器。
  2. 确保两个伙伴具有相同的 SQL Server 和 OS 版本、服务包和更新。
  3. 将 SQL Server 安装在主体服务器实例和镜像服务器实例的相同目录和驱动器结构上。
  4. 如果性能是一个重要的考量点,则考虑使用专用网络接口卡来分散负载。
  5. 像服务器伙伴一样,确保主体服务器实例和镜像服务器实例拥有相同的 CPU、内存、存储器和网络容量。通过确保两个服务器拥有相同的目录结构、相同的磁盘分区方案和 SQL Server 配置,可以避免在向镜像伙伴进行故障转移期间或之后对它们进行更改。
  6. 确保所有应用程序都能连接并执行所有必要的操作,确保主体服务器实例上所有活动的 SQL Server 登录(及其权限)也同样存在于镜像服务器实例上。可以对 SQL Server 2005 Integration Services 使用传输登录名任务来完成这项工作。
  7. 将 SQL Server 代理作业、警报、SSIS 程序包、支持数据库、链接的服务器定义、备份设备、维护计划、数据库邮件配置文件等等从主体服务器复制到镜像服务器。
  8. 建立一个过程,以便当主体服务器上发生任何修改(例如更改硬件、软件、SQL Server 设置或任何数据库对象)时,这些修改都会自动在镜像服务器实例上重复,或者自动复制并传输到镜像服务器实例上。
  9. 在实际投入使用前,执行多次故障转移测试。

建立镜像

让我们使用带自动故障转移的高安全操作模式来建立数据库镜像。(正如前面所说,这意味着需要见证服务器实例)。对于此处的示例,我将使用图 2 所示的服务器和数据库名称,其中还指定了每个服务器的角色。

请记住,由于在镜像配置期间未决事务日志会从主体服务器复制到镜像服务器,从而会影响性能,因此最好在非高峰期执行数据库镜像的初始配置。

镜像的建立包括三个步骤:在参与的服务器上创建端点、执行主体数据库的备份和还原,以及在所有参与的服务器上启用镜像会话。

在建立数据库镜像会话之前,必须先建立数据库镜像中所有参与服务器之间的通信机制。为此,应在所有服务器上创建端点。在 ServerA 和 ServerB 上运行以下语句:

Create Endpoint Mirroring_Endpoint
State= Started as TCP (Listener_Port=5001)
For Database_Mirroring (Role=Partner);

对于 ServerC(将用作见证服务器),将 (Role=Partner) 更改为 (Role=Witness),并运行此语句。这样会控制每个实例所侦听的 TCP 端口。

接下来,依次执行主体服务器 DBM_Demo 数据库的完整数据库备份和日志备份,然后使用 NORECOVERY 选项在镜像服务器实例上将其还原。(使用 NORECOVERY 可确保镜像数据库处于还原状态,以便能够应用事务日志。)

以下是执行 ServerA(主体服务器实例)DBM_Demo 数据库完整数据库备份的 T-SQL 语句:

Backup Database DBM_Demo to DISK='E:\MSSQL\Bak\DBM_Demo_FULL.bak';

如果在执行完整数据库备份后数据库又有任何更改,则可能必须执行数据库的日志备份;否则,不必执行日志备份。

必要时,可以使用以下 T-SQL 语句来执行 ServerA 的 DBM_Demo 数据库的日志备份:

Backup Log DBM_Demo to Disk='E:\MSSQL\Bak\DBM_Demo_Log.bak';

执行全部的备份后,将备份文件移动到 ServerB 或共享位置,以便您可以在 ServerB 上将这些备份还原。完成后,您还应还原自最后一次执行 ServerA 完整数据库备份后所执行的任何事务日志备份。

可以使用以下 T-SQL 语句来通过 NORECOVERY 选项在 ServerB 上还原完整数据库备份和日志备份:

--Restore full database backup on the mirror --server instance
Restore Database DBM_Demo from Disk='E:\MSSQL\Bak\DBM_Demo_FULL.bak' with NORECOVERY;

最后,使用以下 T-SQL 语句来通过 NORECOVERY 选项在镜像服务器上还原日志备份:

Restore Log DBM_Demo from Disk='E:\MSSQL\Bak\DBM_Demo_Log.bak' with NORECOVERY;

还原完所有的备份后,就可以执行最后一步:在所有参与的服务器上启用数据库镜像会话。

建立数据库镜像会话时,需要每个服务器实例的服务器网络地址。此地址必须通过提供系统地址和实例所侦听的端口号来识别实例。服务器网络地址的语法如下所示:

TCP://<System-address>:<port>

<System-address>:是完全限定域名或 IP 地址;可以通过在本地计算机上从命令提示符处执行 IPCONFIG 来获得此信息。

<Port> 在创建端点时建立。

可以按下面所示在 ServerB 上启动数据库镜像会话:

Alter Database DBM_Demo
Set Partner= 'TCP://ServerA.com:5001';

然后通过运行以下 T-SQL 在 ServerA 上启动会话:

Alter Database DBM_Demo
Set Partner='TCP://ServerB.com:5001';

接下来,按下面所示在 ServerC(见证服务器)上启用镜像会话:

Alter Database DBM_Demo
Set Witness='TCP://ServerC.com:5001';

数据库镜像现在已经就绪,可以在您的环境中运行了。在 DBM_Demo 数据库上已经添加或修改的任何数据库对象都将被传输到 ServerB 副本。但是,如果 ServerA 的数据库变得无法使用,则会发生故障转移,将镜像数据库的角色改为主体角色。

既然数据库镜像已经启动并运行,一旦生产数据库出现故障,您始终都会有一个热备用可供使用。

Saleem Hakani 是 Microsoft 的高级数据库工程师,拥有超过 14 年的数据库系统经验。他创办了 Microsoft SQL 社区并担任主管,并负责整个 Windows Live 组织内 SQL Server 标准和自动化的交付工作。Saleem 持有 MCTS、MCDBA 和 MCSA 证书。您可以通过 Saleem@sqlcommunity.net 与他联系。

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.