Skip to content

SQLServer 数据库镜像

数据库镜像概述

SQL Server 数据库镜像(Database Mirroring)是一种高可用性和灾难恢复解决方案,它将主数据库的事务日志实时传输到辅助服务器,并在辅助服务器上应用这些日志,从而保持主数据库和辅助数据库的同步。

核心组件

  • 主体服务器:包含主体数据库,负责处理所有客户端请求,是用户应用程序的主要连接点
  • 镜像服务器:包含镜像数据库,接收并应用从主体服务器传输过来的事务日志,保持与主体数据库的同步
  • 见证服务器:可选组件,用于监控镜像会话状态并参与自动故障切换决策,确保高可用性
  • 镜像端点:用于主体服务器和镜像服务器之间的通信,基于 TCP/IP 协议
  • 镜像会话:主体服务器和镜像服务器之间的连接,用于传输事务日志和监控状态

主要特性

  • 提供数据库级别的高可用性和灾难恢复保护
  • 支持自动和手动故障切换,满足不同场景需求
  • 主体服务器和镜像服务器之间的延迟较低
  • 镜像数据库可以处于不同的恢复状态,适应不同的业务需求
  • 实现相对简单,配置和管理成本较低
  • 已在 SQL Server 2016 中被弃用,微软推荐迁移到 Always On Availability Groups

镜像操作模式

数据库镜像支持三种操作模式,每种模式具有不同的特性和适用场景:

高可用性模式

  • 主体服务器和镜像服务器之间使用同步提交
  • 提供零数据丢失保证,事务必须在主体服务器和镜像服务器上都提交成功才算完成
  • 需要见证服务器参与,实现自动故障切换
  • 适用于关键业务系统,对数据安全性和可用性要求都很高

高保护模式

  • 主体服务器和镜像服务器之间使用同步提交
  • 提供零数据丢失保证,与高可用性模式类似
  • 不需要见证服务器
  • 只支持手动故障切换,不支持自动故障切换
  • 适用于对数据安全性要求高,但对自动故障切换要求不高的系统

高性能模式

  • 主体服务器和镜像服务器之间使用异步提交
  • 主体服务器提交事务后立即返回给客户端,不等待镜像服务器确认
  • 可能导致数据丢失,尤其是在网络故障或镜像服务器故障时
  • 不需要见证服务器
  • 只支持手动故障切换
  • 适用于对性能要求高,对数据丢失容忍度较高的系统

镜像状态

数据库镜像会话可以处于以下几种状态:

  • SYNCHRONIZING:镜像会话正在同步,主体服务器正在将事务日志发送到镜像服务器,镜像服务器正在应用这些日志
  • SYNCHRONIZED:镜像会话已同步,所有已提交的事务都已传输到镜像服务器,高可用性模式下可以进行自动故障切换
  • SUSPENDED:镜像会话已暂停,主体服务器不再向镜像服务器发送事务日志,可以手动恢复
  • DISCONNECTED:主体服务器和镜像服务器之间的连接已断开,需要手动重新连接

配置步骤

前提条件

在配置数据库镜像之前,需要确保满足以下条件:

  1. 主体数据库必须处于 FULL 恢复模式
  2. 主体服务器和镜像服务器的 SQL Server 版本和补丁级别必须一致
  3. 镜像服务器上必须存在与主体数据库相同名称的数据库,通过还原主体数据库的完整备份创建(使用 NORECOVERY 选项)
  4. 所有服务器必须配置镜像端点
  5. 确保服务器之间的网络连接正常,防火墙已开放镜像通信端口

详细配置步骤

1. 准备数据库

sql
-- 在主体服务器上执行
ALTER DATABASE [PrimaryDB] SET RECOVERY FULL;
BACKUP DATABASE [PrimaryDB] TO DISK = '\\share\backup\PrimaryDB_FullBackup.bak' WITH NOFORMAT, NOINIT, NAME = 'PrimaryDB-Full-Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10;

-- 在镜像服务器上执行
RESTORE DATABASE [PrimaryDB] FROM DISK = '\\share\backup\PrimaryDB_FullBackup.bak' WITH NORECOVERY, STATS = 10;

2. 创建镜像端点

sql
-- 在所有服务器上执行
CREATE ENDPOINT [MirroringEndpoint]
STATE = STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATABASE_MIRRORING (ROLE = ALL);

3. 配置数据库镜像

sql
-- 在镜像服务器上执行
ALTER DATABASE [PrimaryDB] SET PARTNER = 'TCP://PrincipalServer:5022';

-- 在主体服务器上执行
ALTER DATABASE [PrimaryDB] SET PARTNER = 'TCP://MirrorServer:5022';

-- (可选)在主体服务器上配置见证服务器(仅高可用性模式需要)
ALTER DATABASE [PrimaryDB] SET WITNESS = 'TCP://WitnessServer:5022';

4. 验证配置

sql
-- 检查镜像状态
SELECT 
    db_name(database_id) AS database_name,
    mirroring_state_desc,
    mirroring_role_desc,
    mirroring_safety_level_desc,
    mirroring_witness_status_desc
FROM sys.database_mirroring
WHERE mirroring_guid IS NOT NULL;

故障切换操作

自动故障切换

在高可用性模式下,当主体服务器发生故障时,见证服务器会检测到故障,并触发自动故障切换到镜像服务器。自动故障切换的条件:

  1. 主体服务器不可用
  2. 镜像服务器可用且与主体服务器同步
  3. 见证服务器可用
  4. 镜像会话处于 SYNCHRONIZED 状态

自动故障切换是无缝的,客户端连接会自动重定向到新的主体服务器(需要使用 ADO.NET 或 SQL Native Client 并配置连接字符串中的 Failover Partner 属性)。

手动故障切换

手动故障切换用于计划内维护,如操作系统升级、硬件维护等。步骤如下:

  1. 确保镜像会话处于 SYNCHRONIZED 状态
  2. 在主体服务器上执行故障切换命令
sql
ALTER DATABASE [PrimaryDB] SET PARTNER FAILOVER;
  1. 验证故障切换后的状态,确保新的主体服务器正常运行

强制故障切换

强制故障切换仅在紧急情况下使用,当主体服务器不可用且无法恢复时。这种操作可能导致数据丢失,因为镜像服务器可能没有接收或应用所有的事务日志。

sql
-- 在镜像服务器上执行
ALTER DATABASE [PrimaryDB] SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;

监控与管理

监控工具

1. SQL Server Management Studio (SSMS)

  • 查看数据库镜像状态:在对象资源管理器中,右键点击数据库,选择"任务"→"镜像",可以查看当前镜像状态和配置
  • 配置和管理镜像会话:通过图形界面可以进行暂停、恢复、故障切换等操作

2. 动态管理视图

sql
-- 查看镜像状态
SELECT 
    db_name(database_id) AS database_name,
    mirroring_state_desc,
    mirroring_role_desc,
    mirroring_safety_level_desc,
    mirroring_witness_status_desc,
    mirroring_partner_name,
    mirroring_witness_name
FROM sys.database_mirroring
WHERE mirroring_guid IS NOT NULL;

-- 查看镜像端点状态
SELECT * FROM sys.database_mirroring_endpoints;

3. Performance Monitor

  • 监控 "SQL Server:Database Mirroring" 性能对象
  • 关注以下关键计数器:
    • Bytes Sent/sec:主体服务器发送到镜像服务器的字节数/秒
    • Bytes Received/sec:镜像服务器接收的字节数/秒
    • Log Send Queue:主体服务器上尚未发送到镜像服务器的事务日志大小(KB)
    • Redo Queue:镜像服务器上尚未应用的事务日志大小(KB)
    • Mirroring Commit Overhead:同步提交模式下,事务等待镜像服务器确认的平均时间(毫秒)

4. Windows 事件日志

  • 查看数据库镜像相关事件,了解镜像状态变化和错误信息
  • 配置警报,在镜像状态变化时发送通知,及时响应潜在问题

常见管理任务

1. 暂停镜像会话

sql
ALTER DATABASE [PrimaryDB] SET PARTNER SUSPEND;

2. 恢复镜像会话

sql
ALTER DATABASE [PrimaryDB] SET PARTNER RESUME;

3. 移除镜像会话

sql
ALTER DATABASE [PrimaryDB] SET PARTNER OFF;

4. 更改镜像操作模式

sql
-- 更改为高性能模式
ALTER DATABASE [PrimaryDB] SET PARTNER SAFETY OFF;

-- 更改为高保护模式
ALTER DATABASE [PrimaryDB] SET PARTNER SAFETY FULL;

版本差异

SQL Server 2008/2012

  • 完全支持数据库镜像
  • 支持三种操作模式
  • 支持自动故障切换
  • 提供基本的监控和管理功能

SQL Server 2014

  • 继续支持数据库镜像
  • 增强了性能和可靠性
  • 引入了 Always On Availability Groups 作为替代方案
  • 微软开始推荐使用 Always On Availability Groups

SQL Server 2016 及以上

  • 数据库镜像被正式弃用
  • 仍然可用,但不再接受新功能更新
  • 微软强烈推荐迁移到 Always On Availability Groups
  • 将在未来版本中彻底移除

生产场景应用

场景1:关键业务系统高可用性

场景描述:某银行核心交易系统需要 24×7 可用性,对数据安全性要求极高,不允许任何数据丢失。

解决方案

  • 采用高可用性模式配置数据库镜像
  • 主体服务器和镜像服务器位于不同的数据中心,实现灾难恢复
  • 配置见证服务器,实现自动故障切换
  • 客户端连接字符串配置 Failover Partner 属性,实现自动重定向

关键配置

sql
-- 配置为高可用性模式
ALTER DATABASE [CoreDB] SET PARTNER SAFETY FULL;
ALTER DATABASE [CoreDB] SET WITNESS = 'TCP://WitnessServer:5022';

场景2:报表系统性能优化

场景描述:某电商平台的报表系统,需要实时数据,但对查询性能要求很高,对数据丢失容忍度较高。

解决方案

  • 采用高性能模式配置数据库镜像
  • 主体服务器处理所有写操作,镜像服务器配置为可读(需要额外配置)
  • 报表查询指向镜像服务器,实现读写分离,提高整体性能

关键配置

sql
-- 配置为高性能模式
ALTER DATABASE [ReportDB] SET PARTNER SAFETY OFF;

场景3:数据库迁移

场景描述:某企业需要将数据库从旧服务器迁移到新服务器,要求停机时间最短。

解决方案

  • 在新服务器上配置为镜像服务器
  • 主从同步完成后,执行手动故障切换
  • 验证新服务器正常运行后,移除镜像配置

关键步骤

  1. 配置数据库镜像,等待同步完成
  2. 执行手动故障切换:ALTER DATABASE [MigrationDB] SET PARTNER FAILOVER;
  3. 验证新服务器运行正常
  4. 移除镜像配置:ALTER DATABASE [MigrationDB] SET PARTNER OFF;

常见问题(FAQ)

数据库镜像与 Always On Availability Groups 有什么区别?

答案:主要区别包括:

  • 数据库镜像只支持单个数据库,而 Always On Availability Groups 支持多个数据库作为一个组进行管理
  • 数据库镜像只支持一个镜像服务器,而 Always On Availability Groups 支持多个辅助副本
  • 数据库镜像的镜像数据库不可读,而 Always On Availability Groups 支持可读辅助副本
  • 数据库镜像已被弃用,而 Always On Availability Groups 是微软推荐的下一代高可用性解决方案
  • Always On Availability Groups 提供更高级的功能,如自动页面修复、可读辅助副本等

数据库镜像需要多少个服务器?

答案

  • 至少需要 2 个服务器:一个主体服务器和一个镜像服务器
  • 如果需要自动故障切换,还需要一个见证服务器,总共 3 个服务器

如何备份镜像数据库?

答案

  • 镜像数据库处于 RESTORING 状态,不能直接备份
  • 需要从主体服务器备份数据库,或者在故障切换后从新的主体服务器备份
  • 建议定期备份主体数据库,确保数据安全

数据库镜像会影响性能吗?

答案

  • 可能会有一定影响,具体取决于镜像操作模式和配置:
    • 同步提交模式(高可用性和高保护)会增加事务延迟,因为需要等待镜像服务器确认
    • 异步提交模式(高性能)对主体服务器性能影响较小
  • 影响程度还取决于:
    • 网络带宽和延迟
    • 主体服务器和镜像服务器的硬件性能
    • 事务大小和频率

数据库镜像支持跨版本配置吗?

答案

  • 不支持。主体服务器和镜像服务器必须使用相同版本的 SQL Server
  • 版本不匹配会导致镜像配置失败

如何迁移从数据库镜像到 Always On Availability Groups?

答案

  1. 评估当前环境和需求,确定 Always On Availability Groups 的架构
  2. 确保所有服务器都运行 SQL Server 2012 或更高版本的 Enterprise Edition
  3. 配置 Windows 故障转移群集
  4. 配置 Always On Availability Groups 端点
  5. 创建 Availability Group 并添加数据库
  6. 测试故障切换和客户端连接
  7. 逐步迁移客户端应用到 Always On Availability Groups

数据库镜像可以用于报告目的吗?

答案

  • 默认情况下,镜像数据库处于 RESTORING 状态,不可用于查询或报告
  • 如果需要用于报告,建议考虑:
    • 使用 Always On Availability Groups 的可读辅助副本
    • 使用日志传送配置只读副本
    • 考虑使用数据库快照

如何处理镜像会话频繁断开的问题?

答案

  1. 检查网络连接和带宽,确保足够的网络资源
  2. 检查服务器的资源使用率(CPU、内存、磁盘 I/O),确保服务器性能足够
  3. 查看 SQL Server 错误日志和 Windows 事件日志,获取详细错误信息
  4. 考虑调整镜像操作模式,从同步模式切换到异步模式
  5. 优化数据库设计和查询,减少事务大小和频率

数据库镜像支持加密吗?

答案

  • 支持。可以通过配置镜像端点的加密选项来实现
  • 默认情况下,镜像端点使用 AES 加密算法
  • 可以通过以下语句配置加密:
    sql
    CREATE ENDPOINT [MirroringEndpoint]
    STATE = STARTED
    AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
    FOR DATABASE_MIRRORING (ROLE = ALL, ENCRYPTION = REQUIRED ALGORITHM AES);

见证服务器的作用是什么?

答案

  • 见证服务器是一个可选组件,用于实现自动故障切换
  • 它监控主体服务器和镜像服务器的状态
  • 当主体服务器不可用时,见证服务器会与镜像服务器协商,决定是否触发自动故障切换
  • 见证服务器必须运行 SQL Server,但可以是 Express Edition

最佳实践

架构设计

  1. 物理分离:主体服务器和镜像服务器应位于不同的物理位置,实现灾难恢复
  2. 独立网络:使用独立的网络连接进行镜像通信,避免与业务网络冲突
  3. 硬件配置:确保主体服务器和镜像服务器的硬件配置相似,避免性能瓶颈
  4. 见证服务器:如果需要自动故障切换,建议配置见证服务器
  5. 版本一致性:确保所有服务器的 SQL Server 版本和补丁级别一致

性能优化

  1. 网络优化:确保足够的带宽和低延迟,考虑使用专用网络
  2. 压缩配置:考虑使用网络压缩减少传输开销
  3. 事务优化:合理设计事务大小,避免大型事务
  4. 操作模式:根据业务需求选择合适的操作模式
  5. 监控延迟:定期监控镜像延迟,及时调整配置

监控与维护

  1. 定期监控:使用多种工具定期监控镜像状态和性能
  2. 配置警报:在镜像状态变化时及时通知,确保问题得到快速响应
  3. 测试故障切换:定期测试故障切换流程,确保在实际故障时能够正常工作
  4. 备份策略:即使配置了镜像,也要保持定期备份的习惯
  5. 文档记录:详细记录镜像配置和操作步骤,便于维护和故障排查

安全性

  1. 端点保护:使用证书或 Windows 身份验证保护镜像端点
  2. 最小权限:为镜像端点配置最小必要的权限
  3. 防火墙配置:只开放必要的端口,限制访问来源
  4. 定期更换证书:如果使用证书验证,定期更换证书,确保安全性
  5. 加密通信:启用镜像通信加密,保护数据传输安全

总结

SQL Server 数据库镜像是一种成熟的高可用性和灾难恢复解决方案,虽然已在 SQL Server 2016 中被弃用,但仍然是许多现有系统使用的可靠解决方案。

对于仍在使用数据库镜像的组织,建议:

  1. 定期评估系统需求,考虑迁移到 Always On Availability Groups
  2. 保持良好的监控和维护习惯,确保镜像系统稳定运行
  3. 定期测试故障切换流程,确保在实际故障时能够正常工作
  4. 关注微软官方文档,了解相关更新和最佳实践

对于计划部署新的高可用性解决方案的组织,推荐直接使用 Always On Availability Groups,这是微软推荐的下一代高可用性和灾难恢复解决方案,提供了更多的功能和更好的性能。

通过掌握数据库镜像的架构、配置和管理,DBA 可以有效地维护现有系统,确保业务的连续性和数据的安全性。同时,了解 Always On Availability Groups 可以为未来的系统升级和迁移做好准备。