◆由于镜像数据库处于recovering状态,因此不能直接访问。通过在镜像数据库上创建数据库快照可以间接读取某一个时刻点的镜像数据库。(参阅该白皮书后面“数据库镜像和数据库快照”部分)
注意: 要想获取更多与数据库镜像术语有关的信息,请参阅SQL Server 2005 Books Online中关于“Overview of Database Mirroring”。 操作模式
数据库镜像会话有三种可能的操作模式。根据事务安全性的设置以及镜像会话中是否需要见证服务器来决定精确的操作模式。 表1:数据库镜像操作模式
操作模式
事务安全性
传输机制
需要Quorum
见证服务器
故障转移类型
高可用
FULL
同步
Y
Y
自动或者手动
高保护
FULL
同步
Y
N
只能手动
高性能
OFF
异步
N
N/A
只能forced
如果safety设置为FULL,那么通过同步方式传输数据,并且需要一台镜像服务器才能提供数据库服务。quorum投票表决要求至少两台服务器的参与才能够决定两个伙伴服务器各自承担什么角色,主角色还是镜像角色。
为了更深入研究这三种操作模式,首先来更进一步研究一下事务安全性和quorum的角色。 事务安全性
If 事务安全性(或者'safety')设置为FULL,那么主服务器和镜像服务器工作在同步传输模式下。当主服务器硬化其主数据库日志记录到磁盘时,也同时将日志发送到镜像服务器。然后主服务器等待镜像服务器的回答。镜像服务器将那些相同的日志记录硬化到镜像日志所在磁盘后,对主服务器进行答复。当safety设置为OFF时,主服务器不会等待来自服务器的确认,因此主数据库和镜像数据库可能不是完全同步的(也就是,镜像可能滞后于主数据库)。
同步传输方式保证镜像数据库事务日志中所有事务与主数据库事务日志中的事务同步,因此可视为事务是安全传输的。要将safety设置为FULL,使用
ALTER DATABASE [<dbname>] SET SAFETY FULL;
当safety设置为OFF,主服务器和镜像服务器之间的通信是异步的。主服务器不会等待镜像服务器已将事务记录硬化的确认信息。镜像服务器通过尽快记录事务日志的来试图保持与主服务器同步,但是如果主服务器突然失败同时强制镜像服务器提供服务,那么某些事务还是有可能丢失(参阅SQL Server Books中的'Forced Service')。
Quorum和见证服务器
当safety设置为FULL,数据库镜像需要quorum才能提供数据库服务。quorum是在同步数据库镜像会话中要求的所有连接起来的服务器之间的最小关系。由于一个quorum至少需要两台服务器,因此当safety为FULL时,主服务器必须和其他某至少一台服务器组成quorum才能够提供数据库服务。
见证服务器帮助主服务器或者镜像服务器组成quorum。如果存在见证服务器,那么主数据库或者镜像数据库失败时,其余两台服务器还可以组成quorum。如果主服务器无法看到镜像服务器,那么它可以和见证服务器组成quorum,并保持提供数据库服务。类似地,如果镜像服务器和见证服务器看不到主服务器,那么这两台服务器可以组成quorum,镜像服务器担当新主服务器的角色。
见证服务器失败不被视为数据库镜像绘画中的单点失败。因为如果见证服务器失败了,那么主服务器和镜像服务器还可以组成quorum(更多信息请参阅SQL Server Books Online中的“Quorum in Database Mirroring Sessions”主题)。 高可用操作模式
高可用操作模式支持最大程度的数据库可用性,如果主数据库失败将自动转移到经销数据库。它要求将safety设置为FULL并且定义一台见证服务器作为数据库镜像会话中的一员。
高可用操作模式最适合于那些服务器之间具有高速且可靠的通信线路,同时要求在单一数据库上实现自动故障转移的场景。当safety为FULL时,主服务器必须短暂等待来自镜像服务器的回答,主服务器性能也因此受到镜像服务器能力的影响。由于单数据库失败将导致自动故障转移,因此如果有多数据库应用程序,那么就应该考虑其他操作模式(参阅该白皮书中实现数据库镜像部分介绍的“多数据库问题”)
高可用模式中数据库镜像是自监视的。如果主数据库突然不可用,或者主服务器停机,那么见证服务器和镜像服务器将组成quorum,然后镜像的SQL Server将进行自动故障转移。此时,竞相服务器实例将其角色转换为新主服务器并恢复数据库。由于镜像数据库已经重新执行了主数据库的事务日志并且其事务日志也与主数据库同步,因此镜像服务器可以快速提供数据库服务。
此外,SQL Server 2005可以在数据库恢复前就向用户提供数据库服务。SQL Server数据库恢复包括三个阶段:分析阶段、redo阶段、以及最后的undo阶段。在SQL Server 2005中,只要redo阶段完成,新恢复的数据库就可以让用户访问。因此如果数据库镜像故障转移发生,新恢复的主数据库只要完成了redo阶段就可以向用户提供服务了。因为镜像数据库自始至终都在重新执行事务日志记录,因此所有镜像服务器只须完成redo过程就可以了,通常几秒钟就可以完成。 高保护操作模式
高保护操作模式中事务安全性设置为FULL,但是镜像会话中没有见证服务器。主服务器必须组成quorum,可是没有见证服务器,因此只能和镜像服务器配合在一起。这种模式下由于没有见证服务器来担当平局决胜的角色,因此只能手动完成故障转移。行自动故障转移是不可能的,因为如果主服务器失败,镜像服务器没有见证服务器来组成quorum。
safety设置为FULL,如果主服务器突然间失去了和镜像服务器的quorum,那么镜像服务器必须使其数据库停止服务。不推荐使用高保护模式的数据库镜像配置,除非在高可用模式下必须临时移除见证服务器时,可以使用该模式作为一种临时过渡。 高性能操作模式
在高性能操作模式下,事务安全性设置为OFF,以异步方式传输日志记录。主服务器无须等待镜像服务器所有日志记录已被硬化的确认信息。镜像服务器尽自己最大可能保持与主服务器数据的一致,但不能保证在任何时刻来自主数据库的所有最新事务日志记录都能够被硬化到镜像数据库的事务日志中。
在高性能模式下,见证服务器不承担任何角色,也不需要quorum。因此高性能模式无法启用自动和手动的故障转移。唯一允许的故障转移方式就是forced service ,它同样也是一种手工操作:
ALTER DATABASE <dbname> SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS
forced service故障转移导致立刻恢复镜像数据库。如果某些主数据库的事务日志记录还没有被镜像服务器接收,那么恢复镜像数据库将导致潜在的数据丢失。高性能模式特别适合于远距离的数据传输(换句话说,用于远程站点的灾难恢复),或者对那些活动频繁且可以容忍某种程度数据丢失的数据库进行镜像。 数据库快照和数据库镜像
由于镜像数据库处于recovering状态,因此不可访问也不可读。在SQL Server 2005企业版和开发人员版中可以创建数据库快照来读取某个时点的镜像数据库。数据库快照提供了一个只读的数据库视图,开放数据给用户访问。这些数据与创建快照时刻的数据库数据相一致。
对数据库快照的访问如同访问一个其他的数据库。查询数据库快照时,从数据库快照文件中读出那些自快照创建后被修改的数据,从原始数据库中读出未修改的数据。最终效果就是读取了在创建快照时刻数据库当时的数据。(更多信息请参阅SQL Server Books Online中"Using Database Snapshots with Database Mirroring"主题。)
由于数据库快照确实增加了镜像服务器的负担,因此需要当心它们对数据库镜像性能可能造成的影响。由于只能镜像到一个数据库,因此如果需要将数据扩充到多个只读的报表服务器上,那么事务复制是更好的选择。(更新信息请阅读后面实现数据库镜像部分的“数据库镜像和复制”) 客户端重定向
在SQL Server 2005中,如果使用ADO.NET或者SQL Native Client连接配置了镜像的数据库,那么应用程序就可以利用驱动程序的能力在发生数据库镜像故障转移时自动重定向数据库连接。必须在连接字符串中指定原始主服务器和数据库名称,以及可选的故障转移伙伴服务器名称。
连接字符串的写法有许多种,以下只给出一个例子,指定server A作为主服务器,server B作为镜像服务器,AdventureWorks作为数据库名称:
ALTER DATABASE [AdventureWorks] SET PARTNER REDO_QUEUE 100MB;
只要指定了镜像伙伴,镜像将立即启动。 数据库镜像目录视图
数据库镜像会话包括组成伙伴的服务器,可能还有见证服务器之间的关联。每台参与镜像的服务器都保存关于镜像会话和当前数据库状态的元数据。可以在主服务器和镜像服务器上通过查询sys.database_mirroring目录视图来检查会话状态。使用另一个视图sys.database_mirroring_witnesses可是返回见证服务器的信息(要想获得两个目录视图中所有列的更完整的描述,请参阅 sql Server Books Online的“sys.database_mirroring" and "sys.database_mirrroing_witnesses”)。
了解数据库镜像会话如何工作以及数据库处于何种状态的一种不错的方法就是检查目录视图里的数据。我们从高可用配置开始(safety设置为FULL,有一台见证服务器)。下面的查询返回了主服务器或者见证服务器上数据库镜像会话的基本描述信息。
SELECT
DB_NAME(database_id) AS 'DatabaseName'
, mirroring_role_desc
, mirroring_safety_level_desc
, mirroring_state_desc
, mirroring_safety_sequence
, mirroring_role_sequence
, mirroring_partner_instance
, mirroring_witness_name
, mirroring_witness_state_desc
, mirroring_failover_lsn
FROM sys.database_mirroring
WHERE mirroring_guid IS NOT NULL;
在见证服务器上运行下面类似的查询,可以返回见证服务器的相关描述信息。
SELECT
Database_name
, safety_level_desc
, safety_sequence_number
, role_sequence_number
, is_suspended
, is_suspended_sequence_number
, principal_server_name
, mirror_server_name
FROM sys.database_mirroring_witnesses;
现在来比较在一个典型的数据库镜像会话中两个查询的输出结果。假设已经设置了server A到 server B的数据库镜像,使用safety为FULL。(设置以下配置的示例代码,请参阅后面的实现数据库镜像“配置和安全性”)见证服务器是server W,对AdventureWorks数据库做镜像。表3显示了两个查询的输出结果: 表3:高可用镜像会话,两个伙伴服务器sys.database_mirroring输出结果