外观
SQLServer 数据库镜像
数据库镜像概述
SQL Server 数据库镜像(Database Mirroring)是一种高可用性和灾难恢复解决方案,它将主数据库的事务日志实时传输到辅助服务器,并在辅助服务器上应用这些日志,从而保持主数据库和辅助数据库的同步。
核心组件
- 主体服务器:包含主体数据库,负责处理所有客户端请求,是用户应用程序的主要连接点
- 镜像服务器:包含镜像数据库,接收并应用从主体服务器传输过来的事务日志,保持与主体数据库的同步
- 见证服务器:可选组件,用于监控镜像会话状态并参与自动故障切换决策,确保高可用性
- 镜像端点:用于主体服务器和镜像服务器之间的通信,基于 TCP/IP 协议
- 镜像会话:主体服务器和镜像服务器之间的连接,用于传输事务日志和监控状态
主要特性
- 提供数据库级别的高可用性和灾难恢复保护
- 支持自动和手动故障切换,满足不同场景需求
- 主体服务器和镜像服务器之间的延迟较低
- 镜像数据库可以处于不同的恢复状态,适应不同的业务需求
- 实现相对简单,配置和管理成本较低
- 已在 SQL Server 2016 中被弃用,微软推荐迁移到 Always On Availability Groups
镜像操作模式
数据库镜像支持三种操作模式,每种模式具有不同的特性和适用场景:
高可用性模式
- 主体服务器和镜像服务器之间使用同步提交
- 提供零数据丢失保证,事务必须在主体服务器和镜像服务器上都提交成功才算完成
- 需要见证服务器参与,实现自动故障切换
- 适用于关键业务系统,对数据安全性和可用性要求都很高
高保护模式
- 主体服务器和镜像服务器之间使用同步提交
- 提供零数据丢失保证,与高可用性模式类似
- 不需要见证服务器
- 只支持手动故障切换,不支持自动故障切换
- 适用于对数据安全性要求高,但对自动故障切换要求不高的系统
高性能模式
- 主体服务器和镜像服务器之间使用异步提交
- 主体服务器提交事务后立即返回给客户端,不等待镜像服务器确认
- 可能导致数据丢失,尤其是在网络故障或镜像服务器故障时
- 不需要见证服务器
- 只支持手动故障切换
- 适用于对性能要求高,对数据丢失容忍度较高的系统
镜像状态
数据库镜像会话可以处于以下几种状态:
- SYNCHRONIZING:镜像会话正在同步,主体服务器正在将事务日志发送到镜像服务器,镜像服务器正在应用这些日志
- SYNCHRONIZED:镜像会话已同步,所有已提交的事务都已传输到镜像服务器,高可用性模式下可以进行自动故障切换
- SUSPENDED:镜像会话已暂停,主体服务器不再向镜像服务器发送事务日志,可以手动恢复
- DISCONNECTED:主体服务器和镜像服务器之间的连接已断开,需要手动重新连接
配置步骤
前提条件
在配置数据库镜像之前,需要确保满足以下条件:
- 主体数据库必须处于 FULL 恢复模式
- 主体服务器和镜像服务器的 SQL Server 版本和补丁级别必须一致
- 镜像服务器上必须存在与主体数据库相同名称的数据库,通过还原主体数据库的完整备份创建(使用 NORECOVERY 选项)
- 所有服务器必须配置镜像端点
- 确保服务器之间的网络连接正常,防火墙已开放镜像通信端口
详细配置步骤
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;故障切换操作
自动故障切换
在高可用性模式下,当主体服务器发生故障时,见证服务器会检测到故障,并触发自动故障切换到镜像服务器。自动故障切换的条件:
- 主体服务器不可用
- 镜像服务器可用且与主体服务器同步
- 见证服务器可用
- 镜像会话处于 SYNCHRONIZED 状态
自动故障切换是无缝的,客户端连接会自动重定向到新的主体服务器(需要使用 ADO.NET 或 SQL Native Client 并配置连接字符串中的 Failover Partner 属性)。
手动故障切换
手动故障切换用于计划内维护,如操作系统升级、硬件维护等。步骤如下:
- 确保镜像会话处于 SYNCHRONIZED 状态
- 在主体服务器上执行故障切换命令
sql
ALTER DATABASE [PrimaryDB] SET PARTNER FAILOVER;- 验证故障切换后的状态,确保新的主体服务器正常运行
强制故障切换
强制故障切换仅在紧急情况下使用,当主体服务器不可用且无法恢复时。这种操作可能导致数据丢失,因为镜像服务器可能没有接收或应用所有的事务日志。
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:数据库迁移
场景描述:某企业需要将数据库从旧服务器迁移到新服务器,要求停机时间最短。
解决方案:
- 在新服务器上配置为镜像服务器
- 主从同步完成后,执行手动故障切换
- 验证新服务器正常运行后,移除镜像配置
关键步骤:
- 配置数据库镜像,等待同步完成
- 执行手动故障切换:
ALTER DATABASE [MigrationDB] SET PARTNER FAILOVER; - 验证新服务器运行正常
- 移除镜像配置:
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?
答案:
- 评估当前环境和需求,确定 Always On Availability Groups 的架构
- 确保所有服务器都运行 SQL Server 2012 或更高版本的 Enterprise Edition
- 配置 Windows 故障转移群集
- 配置 Always On Availability Groups 端点
- 创建 Availability Group 并添加数据库
- 测试故障切换和客户端连接
- 逐步迁移客户端应用到 Always On Availability Groups
数据库镜像可以用于报告目的吗?
答案:
- 默认情况下,镜像数据库处于 RESTORING 状态,不可用于查询或报告
- 如果需要用于报告,建议考虑:
- 使用 Always On Availability Groups 的可读辅助副本
- 使用日志传送配置只读副本
- 考虑使用数据库快照
如何处理镜像会话频繁断开的问题?
答案:
- 检查网络连接和带宽,确保足够的网络资源
- 检查服务器的资源使用率(CPU、内存、磁盘 I/O),确保服务器性能足够
- 查看 SQL Server 错误日志和 Windows 事件日志,获取详细错误信息
- 考虑调整镜像操作模式,从同步模式切换到异步模式
- 优化数据库设计和查询,减少事务大小和频率
数据库镜像支持加密吗?
答案:
- 支持。可以通过配置镜像端点的加密选项来实现
- 默认情况下,镜像端点使用 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
最佳实践
架构设计
- 物理分离:主体服务器和镜像服务器应位于不同的物理位置,实现灾难恢复
- 独立网络:使用独立的网络连接进行镜像通信,避免与业务网络冲突
- 硬件配置:确保主体服务器和镜像服务器的硬件配置相似,避免性能瓶颈
- 见证服务器:如果需要自动故障切换,建议配置见证服务器
- 版本一致性:确保所有服务器的 SQL Server 版本和补丁级别一致
性能优化
- 网络优化:确保足够的带宽和低延迟,考虑使用专用网络
- 压缩配置:考虑使用网络压缩减少传输开销
- 事务优化:合理设计事务大小,避免大型事务
- 操作模式:根据业务需求选择合适的操作模式
- 监控延迟:定期监控镜像延迟,及时调整配置
监控与维护
- 定期监控:使用多种工具定期监控镜像状态和性能
- 配置警报:在镜像状态变化时及时通知,确保问题得到快速响应
- 测试故障切换:定期测试故障切换流程,确保在实际故障时能够正常工作
- 备份策略:即使配置了镜像,也要保持定期备份的习惯
- 文档记录:详细记录镜像配置和操作步骤,便于维护和故障排查
安全性
- 端点保护:使用证书或 Windows 身份验证保护镜像端点
- 最小权限:为镜像端点配置最小必要的权限
- 防火墙配置:只开放必要的端口,限制访问来源
- 定期更换证书:如果使用证书验证,定期更换证书,确保安全性
- 加密通信:启用镜像通信加密,保护数据传输安全
总结
SQL Server 数据库镜像是一种成熟的高可用性和灾难恢复解决方案,虽然已在 SQL Server 2016 中被弃用,但仍然是许多现有系统使用的可靠解决方案。
对于仍在使用数据库镜像的组织,建议:
- 定期评估系统需求,考虑迁移到 Always On Availability Groups
- 保持良好的监控和维护习惯,确保镜像系统稳定运行
- 定期测试故障切换流程,确保在实际故障时能够正常工作
- 关注微软官方文档,了解相关更新和最佳实践
对于计划部署新的高可用性解决方案的组织,推荐直接使用 Always On Availability Groups,这是微软推荐的下一代高可用性和灾难恢复解决方案,提供了更多的功能和更好的性能。
通过掌握数据库镜像的架构、配置和管理,DBA 可以有效地维护现有系统,确保业务的连续性和数据的安全性。同时,了解 Always On Availability Groups 可以为未来的系统升级和迁移做好准备。
