数据库镜像(SQL Server Mirroring)从SQL Server 2005 SP2开始引入,虽然从SQL Server 2008开始被列为“将会被弃用”的功能,并在后续的版本中由 Always On 可用性组代替。但是由于其有很多优势,一直被广泛使用至今。
“数据库镜像” 也是一种提高 SQL Server 数据库的可用性的解决方案。 镜像基于每个
数据库
实现,并且只适用于使用完整恢复模式的数据库。
概念
数据库镜像维护一个数据库的两个副本,这两个副本必须驻留在不同的 SQL Server 数据库引擎服务器实例上。 通常,这些服务器实例驻留在不同位置的计算机上。 启动数据库上的数据库镜像操作时,在这些服务器实例之间形成一种关系,称为“数据库镜像会话
” 。其中一个服务器实例(主体服务器
)提供数据库服务给客户端。 另一个服务器实例则根据镜像会话的配置和状态,充当热备或温备服务器(镜像服务器
)。在“数据库镜像会话
”中,主体服务器和镜像服务器作为“伙伴
”进行通信和协作。 两个伙伴在会话中扮演互补的角色:“主体角色
” 和“镜像角色
” 。 在任何给定的时间,一个伙伴仅可以扮演一个角色, 拥有主体角色的伙伴称为“主体服务器
” ,其数据库副本为当前的主体数据库。 拥有镜像角色的伙伴称为“镜像服务器
” ,其数据库副本为当前的镜像数据库。 如果数据库镜像部署在生产环境中,则主体数据库即为“生产数据库”。其中,还有另一类可选服务器“见证服务器
”用于监控主体服务器和镜像服务器,提供自动故障转移功能。
运行模式
数据库镜像会话以同步操作或异步操作运行。 在异步操作下,事务不需要等待镜像服务器将日志写入磁盘便可提交,这样可最大程度地提高性能。 在同步操作下,事务将在伙伴双方处提交,但会延长事务滞后时间。
SQL Server支持两种镜像运行模式。 一种是高安全性模式,它支持同步操作。在该模式下,当会话开始时,镜像服务器将使镜像数据库尽快与主体数据库同步。 一旦同步了数据库,事务将在伙伴双方处提交,这会延长事务滞后时间。
高安全模式支持标准版和企业版,并且主体和镜像服务器必须是相同版本。见证服务器的作用是验证给定的伙伴服务器是否已启动并运行。 如果镜像服务器与主体服务器断开连接,但见证服务器仍与主体服务器保持连接,则镜像服务器无法启动故障转移。此外,如果见证服务器宕机了,也仅仅是不能自动Failover而已,不影响镜像环境。
第二种是高性能模式,以异步方式运行。 镜像服务器尝试与主体服务器发送的日志记录保持同步。 镜像数据库可能稍微滞后于主体数据库。 但是,数据库之间的时间间隔通常很小。 但是,如果主体服务器的工作负荷过高或镜像服务器系统的负荷过高,则时间间隔会增大。在高性能模式中,主体服务器向镜像服务器发送日志记录之后,会立即再向客户端发送一条确认消息。 它不会等待镜像服务器的确认。 这意味着事务不需要等待镜像服务器将日志写入磁盘便可提交。 此异步操作允许主体服务器在事务滞后时间最小的条件下运行,但可能会丢失某些数据。
所有数据库镜像会话都只支持一台主体服务器和一台镜像服务器。不管使用何种模式,数据库都必须配置为完整恢复模式。
对比
运行模式 | 同步模式 | 版本要求 | 数据丢失 | SAFETY选项 | 性能影响 | 恢复速度 | 故障转移 |
---|---|---|---|---|---|---|---|
高安全 | 同步 | 标准/企业 | 零丢失 | FULL | 网络可能影响性能 | 快 | 可自动 |
高性能 | 异步 | 企业 | 有可能丢失数据 | OFF | 影响较小 | 根据需要提交的事务量而定 | 不可自动 |
镜像中的事务日志
数据库镜像涉及尽快将对主体数据库执行的每项插入、更新和删除操作“重做 ”到镜像数据库中。 重做通过将活动事务日志记录的流发送到镜像服务器来完成,这会尽快将日志记录按顺序应用到镜像数据库中。 与逻辑级别执行的复制不同,数据库镜像在物理日志记录级别执行。 从 SQL Server 2008开始,在事务日志记录的流发送到镜像服务器之前,主体服务器会先将其压缩。 在所有镜像会话中都会进行这种日志压缩。
数据库所有者可以随时暂停会话。 暂停会话时,主体服务器不会向镜像服务器发送任何新的日志记录。 所有这些记录将保持活动状态,并堆积在主体数据库的事务日志中。 只要数据库镜像会话保持暂停状态,事务日志就不会被截断。 因此,如果数据库镜像会话暂停时间过长,则可能会使该日志填满。
小D笔记
镜像,通俗来讲就是一面镜子,是“数据”在灾备环境中的“成像”,具备以下特性:
- 一致性,包括库名、数据文件和日志文件的存放路径都要与主体数据库保持一致。
- 唯一性,每个数据库只能有一个镜像副本。
- 看得到,却“用不了”,镜像库在没有做任何处理时是不可访问的。数据库的故障转移对客户端不是完全透明的,因为主体和镜像是两个独立的SQL服务实例,有不同的网络标识。
- 其他成本,需要额外维护实例级的对象在主体和镜像实例间的同步,包括登录账户、作业、链接服务器等