外观
SQLServer 日志传送
日志传送概述
SQL Server 日志传送(Log Shipping)是一种高可用性和灾难恢复解决方案,它通过定期备份主数据库的事务日志,将日志文件复制到一个或多个辅助服务器,并在辅助服务器上还原这些日志,从而保持主数据库和辅助数据库的同步。
核心组件
- 主服务器:包含主数据库,负责生成事务日志备份
- 辅助服务器:包含辅助数据库,负责还原从主服务器复制过来的事务日志
- 监视服务器:可选组件,用于监视日志传送状态并生成警报
- 事务日志备份作业:在主服务器上运行,定期备份事务日志
- 复制作业:在辅助服务器上运行,将事务日志备份文件从主服务器复制到辅助服务器
- 还原作业:在辅助服务器上运行,将复制过来的事务日志还原到辅助数据库
主要特性
- 提供数据库级别的高可用性和灾难恢复保护
- 支持一个主数据库和多个辅助数据库(最多32个)
- 仅支持手动故障切换
- 辅助数据库可以处于只读(STANDBY)或恢复(RESTORING)模式
- 辅助数据库可用于报告和查询目的,实现读写分离
- 实现简单,配置成本较低
- 支持跨版本复制(辅助服务器版本不低于主服务器)
架构设计
基本架构
日志传送由以下核心组件组成:
- 主服务器:运行主数据库和事务日志备份作业
- 主数据库:必须处于 FULL 或 BULK_LOGGED 恢复模式
- 共享目录:用于存储主服务器生成的事务日志备份文件
- 辅助服务器:运行辅助数据库、复制作业和还原作业
- 辅助数据库:通过还原主数据库的完整备份和事务日志备份创建
- 监视服务器:可选组件,用于集中监视日志传送状态
辅助数据库模式
1. 恢复模式(RESTORING)
- 辅助数据库处于 RESTORING 状态
- 不可用于查询或报告
- 还原速度较快,资源消耗较低
- 适用于纯灾难恢复场景
2. 备用模式(STANDBY)
- 辅助数据库处于 STANDBY 状态
- 可用于只读查询和报告
- 还原时需要断开所有用户连接
- 支持在还原间隙进行查询
- 适用于需要读写分离的场景
工作流程
日志传送的工作流程分为三个主要阶段:
备份阶段:
- 主服务器上的事务日志备份作业定期运行
- 生成事务日志备份文件,存储到共享目录
- 记录备份信息到主服务器的 msdb 数据库
复制阶段:
- 辅助服务器上的复制作业定期运行
- 将共享目录中的事务日志备份文件复制到辅助服务器的本地目录
- 记录复制信息到辅助服务器的 msdb 数据库(如果配置了监视服务器,也会记录到监视服务器)
还原阶段:
- 辅助服务器上的还原作业定期运行
- 将本地目录中的事务日志备份文件还原到辅助数据库
- 记录还原信息到辅助服务器的 msdb 数据库(如果配置了监视服务器,也会记录到监视服务器)
配置步骤
前提条件
在配置日志传送之前,需要确保满足以下条件:
- 主数据库必须处于 FULL 或 BULK_LOGGED 恢复模式
- 主服务器和辅助服务器必须能够访问共享目录
- 确保所有服务器的 SQL Server Agent 服务都已启动
- 主服务器和辅助服务器的 SQL Server 版本必须兼容(辅助服务器版本不低于主服务器)
- 已经创建主数据库的完整备份
详细配置步骤
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;
-- 在辅助服务器上执行:还原完整备份(使用 NORECOVERY 或 STANDBY 选项)
-- 使用 NORECOVERY 选项(恢复模式)
RESTORE DATABASE [SecondaryDB] FROM DISK = '\\share\backup\PrimaryDB_FullBackup.bak' WITH NORECOVERY, STATS = 10;
-- 或使用 STANDBY 选项(备用模式)
RESTORE DATABASE [SecondaryDB] FROM DISK = '\\share\backup\PrimaryDB_FullBackup.bak' WITH STANDBY = 'D:\backup\UndoFile.ldf', STATS = 10;2. 使用 SSMS 配置日志传送
配置主服务器:
- 打开 SQL Server Management Studio (SSMS)
- 右键点击主数据库,选择 "属性"
- 选择 "事务日志传送"
- 勾选 "启用此数据库作为日志传送配置中的主数据库"
- 点击 "备份设置",配置以下参数:
- 备份目录:指定共享目录路径
- 备份作业计划:设置备份频率(如每15分钟)
- 备份压缩:建议启用,减少网络传输和存储开销
- 备份保留期:设置合适的保留时间
添加辅助服务器:
- 点击 "添加" 按钮,打开 "辅助数据库设置" 对话框
- 选择或连接到辅助服务器实例
- 选择或创建辅助数据库
配置复制设置:
- 点击 "复制文件" 选项卡
- 指定辅助服务器上的复制目标目录
- 设置复制作业计划(建议与备份作业频率一致)
配置还原设置:
- 点击 "还原事务日志" 选项卡
- 选择还原模式:NORECOVERY(恢复模式)或 STANDBY(备用模式)
- 设置还原作业计划(建议与备份作业频率一致)
- 配置延迟还原选项(可选)
配置监视服务器(可选):
- 勾选 "使用监视服务器实例"
- 选择或连接到监视服务器实例
- 配置警报设置,在日志传送出现问题时发送通知
完成配置:
- 点击 "确定" 保存配置
- 系统会自动创建所需的 SQL Server Agent 作业
3. 验证配置
sql
-- 检查日志传送配置
SELECT * FROM msdb.dbo.log_shipping_primary_databases;
SELECT * FROM msdb.dbo.log_shipping_secondary_databases;
-- 查看日志传送状态
EXEC master.dbo.sp_help_log_shipping_monitor;
-- 查看作业状态
SELECT job_id, name, enabled, last_run_date, last_run_time, last_run_outcome
FROM msdb.dbo.sysjobs
WHERE name LIKE '%log shipping%';版本差异
SQL Server 2008/2012
- 完全支持日志传送功能
- 支持最多32个辅助服务器
- 提供基本的监控和管理功能
- 支持通过 SSMS 图形界面配置
SQL Server 2014
- 增强了日志传送的性能
- 改进了监控和报告功能
- 支持与 Always On Availability Groups 结合使用
- 引入了新的动态管理视图和存储过程
SQL Server 2016 及以上
- 保留了日志传送功能,但微软开始推荐使用 Always On Availability Groups
- 增强了与 Azure 存储的集成
- 改进了错误处理和报告机制
- 支持更多的备份压缩选项
- 增强了安全功能,如透明数据加密 (TDE) 支持
故障切换操作
手动故障切换
日志传送不支持自动故障切换,需要手动执行故障切换操作。以下是详细步骤:
准备工作:
- 确认主服务器已经不可用
- 确保所有事务日志备份都已复制到辅助服务器
在主服务器上执行最后的日志备份(如果可能):
sqlBACKUP LOG [PrimaryDB] TO DISK = '\\share\backup\PrimaryDB_FinalLogBackup.trn' WITH NOFORMAT, NOINIT, NAME = 'PrimaryDB-Final-Log-Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10;在辅助服务器上还原最后的日志备份:
sql-- 确保最后一次日志备份已复制到辅助服务器 -- 使用 RECOVERY 选项将辅助数据库恢复为可用状态 RESTORE LOG [SecondaryDB] FROM DISK = 'D:\backup\PrimaryDB_FinalLogBackup.trn' WITH RECOVERY;更新辅助数据库名称(如果需要):
sqlALTER DATABASE [SecondaryDB] MODIFY NAME = [PrimaryDB];更新客户端连接:
- 更新应用程序连接字符串,指向新的主服务器
- 更新 DNS 记录或负载均衡配置(如果适用)
重新配置日志传送:
- 将原辅助服务器配置为新的主服务器
- 配置原主服务器(如果已恢复)或其他服务器作为新的辅助服务器
故障恢复
当原主服务器恢复正常后,可以选择将其重新集成到日志传送配置中:
准备原主服务器:
- 从新主服务器获取最新的完整备份
- 在原主服务器上还原完整备份和所有事务日志备份(使用 NORECOVERY 选项)
配置原主服务器为辅助服务器:
- 使用 SSMS 或 T-SQL 将原主服务器添加为新主服务器的辅助服务器
- 配置复制和还原作业
验证配置:
- 检查所有作业是否正常运行
- 验证数据同步状态
监控与管理
监控工具
1. SQL Server Management Studio (SSMS)
- 日志传送状态报告:在对象资源管理器中,右键点击数据库,选择 "报表" → "事务日志传送状态"
- 作业监视器:查看 SQL Server Agent 作业的运行状态和历史记录
- 日志传送配置:查看和修改日志传送配置
2. 系统视图和存储过程
sql
-- 查看主服务器配置
SELECT * FROM msdb.dbo.log_shipping_primary_databases;
SELECT * FROM msdb.dbo.log_shipping_primary_secondaries;
-- 查看辅助服务器配置
SELECT * FROM msdb.dbo.log_shipping_secondary_databases;
SELECT * FROM msdb.dbo.log_shipping_secondary_log;
-- 查看监视服务器信息
SELECT * FROM msdb.dbo.log_shipping_monitor_primary;
SELECT * FROM msdb.dbo.log_shipping_monitor_secondary;
-- 获取日志传送状态报告
EXEC master.dbo.sp_help_log_shipping_monitor;
EXEC master.dbo.sp_help_log_shipping_monitor_primary;
EXEC master.dbo.sp_help_log_shipping_monitor_secondary;3. 监视服务器报告
如果配置了监视服务器,可以使用内置的报告查看日志传送状态:
- 在监视服务器上,打开 SSMS
- 连接到监视服务器实例
- 展开 "管理" → "维护计划" → "事务日志传送状态报告"
4. 自定义监控脚本
可以创建自定义脚本定期检查日志传送状态,并在出现问题时发送警报:
sql
-- 示例:检查日志传送延迟
DECLARE @threshold_minutes INT = 60; -- 延迟阈值(分钟)
SELECT
primary_server,
primary_database,
secondary_server,
secondary_database,
DATEDIFF(MINUTE, last_backup_date, GETDATE()) AS backup_delay_minutes,
DATEDIFF(MINUTE, last_copy_date, GETDATE()) AS copy_delay_minutes,
DATEDIFF(MINUTE, last_restore_date, GETDATE()) AS restore_delay_minutes
FROM msdb.dbo.log_shipping_monitor_secondary
WHERE
DATEDIFF(MINUTE, last_backup_date, GETDATE()) > @threshold_minutes OR
DATEDIFF(MINUTE, last_copy_date, GETDATE()) > @threshold_minutes OR
DATEDIFF(MINUTE, last_restore_date, GETDATE()) > @threshold_minutes;常见管理任务
1. 修改作业计划
- 打开 SQL Server Agent
- 找到对应的日志传送作业
- 右键点击作业,选择 "属性"
- 点击 "调度" 选项卡,修改作业执行频率
2. 切换辅助数据库模式
sql
-- 从 RESTORING 切换到 STANDBY 模式
RESTORE DATABASE [SecondaryDB] WITH STANDBY = 'D:\backup\UndoFile.ldf';
-- 从 STANDBY 切换到 RESTORING 模式
RESTORE DATABASE [SecondaryDB] WITH NORECOVERY;3. 添加新的辅助服务器
- 按照初始配置步骤,在主服务器的日志传送配置中添加新的辅助服务器
- 确保新辅助服务器已还原主数据库的完整备份
4. 移除辅助服务器
- 在主服务器的日志传送配置中移除辅助服务器
- 删除辅助服务器上对应的 SQL Server Agent 作业
- 可选:删除辅助数据库
生产场景应用
场景1:企业核心数据库灾难恢复
场景描述:某企业核心业务数据库需要高可用性保护,要求在主服务器发生故障时能够快速恢复业务,同时实现异地灾难恢复。
解决方案:
- 配置主服务器和本地辅助服务器,实现本地高可用性
- 配置异地辅助服务器,实现灾难恢复
- 本地辅助服务器使用 STANDBY 模式,用于报告查询
- 异地辅助服务器使用 RESTORING 模式,纯用于灾难恢复
- 配置监视服务器,实时监控日志传送状态
- 定期测试故障切换流程,确保灾难恢复能力
关键配置:
- 备份频率:每15分钟
- 复制和还原频率:每15分钟
- 备份压缩:启用
- 本地辅助服务器延迟:0分钟
- 异地辅助服务器延迟:30分钟(防止误删除数据导致同步到所有服务器)
场景2:报表系统读写分离
场景描述:某电商平台的报表系统需要访问实时数据,但直接查询主数据库会影响交易性能,需要实现读写分离。
解决方案:
- 配置主服务器处理所有写操作
- 配置辅助服务器,使用 STANDBY 模式
- 报表系统连接到辅助服务器进行查询
- 日志传送备份频率设置为每5分钟,确保数据延迟最小
- 配置警报,在日志传送延迟超过10分钟时通知管理员
关键配置:
- 辅助数据库模式:STANDBY
- 备份、复制、还原频率:每5分钟
- 备份压缩:启用
- 配置报表系统连接字符串指向辅助服务器
场景3:数据库迁移(零停机)
场景描述:某企业需要将数据库从旧服务器迁移到新服务器,要求零停机或最小停机时间。
解决方案:
- 在新服务器上配置为辅助服务器
- 日志传送同步完成后,执行手动故障切换
- 将旧服务器的流量切换到新服务器
关键步骤:
- 配置日志传送,将新服务器作为辅助服务器
- 等待数据同步完成
- 在业务低峰期执行故障切换
- 验证新服务器正常运行
- 将旧服务器从日志传送配置中移除
优势:
- 迁移过程中业务持续可用
- 停机时间仅为故障切换和连接更新的时间(通常几分钟)
- 可回滚(如果新服务器出现问题)
常见问题(FAQ)
日志传送与 Always On Availability Groups 有什么区别?
答案:
- 故障切换:日志传送只支持手动故障切换,Always On AG 支持自动故障切换
- 复杂度:日志传送实现简单,配置成本低;Always On AG 实现复杂,需要 Windows 故障转移群集
- 数据库数量:日志传送支持一个主数据库和多个辅助数据库(最多32个);Always On AG 支持多个数据库组成一个组,最多9个辅助副本
- 只读访问:两者都支持只读辅助数据库,但 Always On AG 的只读副本性能更好
- 适用场景:日志传送适用于对自动故障切换要求不高的场景;Always On AG 适用于对可用性要求极高的关键业务系统
日志传送需要多少个服务器?
答案:
- 最少需要2个服务器:1个主服务器和1个辅助服务器
- 最多可以有1个主服务器和多个辅助服务器(最多32个)
- 监视服务器是可选的,用于集中监控日志传送状态
如何初始化辅助数据库?
答案: 有三种主要方式:
- 从完整备份初始化:在主服务器上创建完整备份,在辅助服务器上使用 NORECOVERY 或 STANDBY 选项还原
- 从完整备份和差异备份初始化:如果主数据库很大,可以先还原完整备份,再还原最近的差异备份,减少事务日志还原数量
- 使用数据库复制工具:如 SQL Server Integration Services (SSIS) 或第三方工具,直接复制数据库文件
日志传送会影响主服务器性能吗?
答案: 日志传送对主服务器性能有一定影响,主要体现在:
- 事务日志备份会消耗 CPU 和 I/O 资源
- 生成的日志备份文件会占用存储空间
- 网络传输日志文件会占用带宽
可以通过以下方式减少影响:
- 合理设置备份频率,平衡数据一致性和性能
- 使用高性能存储设备存储日志备份
- 启用备份压缩,减少网络传输和存储开销
- 安排在业务低峰期进行完整备份
如何处理日志传送延迟?
答案: 日志传送延迟可能由以下原因导致:
- 备份作业问题:检查主服务器备份作业是否正常运行
- 网络问题:检查主服务器和辅助服务器之间的网络带宽和延迟
- 存储问题:检查备份存储和辅助服务器存储的 I/O 性能
- 还原作业问题:检查辅助服务器还原作业是否正常运行
- 事务量过大:主服务器事务量超过日志传送处理能力
解决方法:
- 检查并修复故障的 SQL Server Agent 作业
- 优化网络连接,增加带宽
- 升级存储设备,提高 I/O 性能
- 增加辅助服务器资源(CPU、内存)
- 调整备份、复制、还原作业的频率
- 考虑使用 Always On AG 替代日志传送(如果事务量持续过大)
日志传送支持跨版本复制吗?
答案: 支持,但有以下限制:
- 辅助服务器的 SQL Server 版本不能低于主服务器版本
- 从低版本到高版本的复制是完全支持的
- 从高版本到低版本的复制是不支持的
- 建议主服务器和辅助服务器使用相同的补丁级别
如何监控日志传送状态?
答案: 可以通过以下方式监控:
- SSMS 日志传送状态报告:图形化展示日志传送状态
- 监视服务器报告:集中监控多个日志传送配置
- 动态管理视图和存储过程:通过 T-SQL 查询日志传送状态
- 自定义监控脚本:创建脚本定期检查状态并发送警报
- 第三方监控工具:如 SentryOne、Redgate SQL Monitor 等
如何更改日志传送的备份目录?
答案:
- 暂停日志传送作业:禁用备份、复制和还原作业
- 修改备份目录:
- 更新主服务器上的备份作业,修改备份目标路径
- 更新辅助服务器上的复制作业,修改源目录路径
- 重启作业:启用所有日志传送作业
- 验证配置:检查作业是否正常运行,验证数据同步
日志传送的备份文件如何管理?
答案:
- 设置合适的备份保留期:根据存储容量和业务需求设置
- 启用备份压缩:减少存储占用
- 使用集中存储:便于管理和备份
- 定期清理过期备份:可以通过备份作业的 "删除过期文件" 选项自动清理
- 备份备份文件:将日志传送备份文件纳入企业备份策略,防止主备份丢失
如何测试日志传送的故障切换?
答案:
- 选择测试时间:在业务低峰期进行
- 准备测试环境:确保有完整的测试计划和回滚方案
- 执行故障切换:按照故障切换步骤执行
- 验证业务功能:测试关键业务功能是否正常
- 回滚或保持新配置:根据测试结果决定是否回滚
- 更新文档:记录测试结果和改进措施
最佳实践
架构设计
- 物理分离:主服务器和辅助服务器应位于不同的物理位置,实现灾难恢复
- 独立存储:使用独立的存储设备存储事务日志备份,避免单点故障
- 监视服务器:建议配置监视服务器,集中监控日志传送状态
- 多辅助服务器:根据业务需求配置多个辅助服务器,实现本地高可用和异地灾难恢复
- 版本一致性:确保所有服务器的 SQL Server 版本和补丁级别一致
性能优化
- 合理设置作业频率:根据业务需求和系统性能,设置合适的备份、复制和还原频率
- 启用备份压缩:减少网络传输和存储开销,提高备份和还原速度
- 优化存储:使用高性能存储设备存储事务日志备份,提高 I/O 性能
- 优化网络:确保主服务器和辅助服务器之间有足够的带宽和低延迟
- 合理设置备份保留期:避免备份文件占用过多存储空间
监控与维护
- 定期监控:建立日常监控机制,及时发现和解决问题
- 配置警报:在日志传送出现延迟或故障时发送警报,确保快速响应
- 定期测试:每季度至少测试一次故障切换流程,确保灾难恢复能力
- 文档更新:及时更新日志传送配置文档,包括服务器信息、作业配置和故障切换步骤
- 培训:确保DBA团队熟悉日志传送配置、监控和故障处理流程
安全性
- 保护共享目录:限制共享目录的访问权限,仅允许主服务器和辅助服务器访问
- 最小权限原则:为 SQL Server Agent 服务账户配置最小必要的权限
- 加密备份:考虑使用透明数据加密 (TDE) 或备份加密,保护敏感数据
- 定期审计:审计日志传送配置和作业,确保安全性
- 网络安全:使用专用网络或 VPN 连接主服务器和辅助服务器,保护数据传输安全
总结
SQL Server 日志传送是一种成熟、可靠的高可用性和灾难恢复解决方案,具有配置简单、成本低、支持多辅助服务器等优点。它通过定期备份、复制和还原事务日志,保持主数据库和辅助数据库的同步,可用于本地高可用性、异地灾难恢复和读写分离场景。
虽然日志传送只支持手动故障切换,但其可靠性和易用性使其成为许多组织的首选解决方案。对于需要自动故障切换和更高级功能的环境,可以考虑使用 Always On Availability Groups。
作为 DBA,深入理解日志传送的架构、配置和管理是至关重要的。通过合理设计日志传送架构、优化配置参数、建立完善的监控机制和定期测试故障切换流程,可以确保数据库系统的高可用性和灾难恢复能力,保障业务的连续性。
