SQL Server 2012日志传送快速切换至镜像:低停机及LSN匹配咨询
我之前在生产环境帮客户做过SQL Server 2012从日志传送切换到镜像的操作,成功把停机时间控制在8分钟左右,下面是经过验证的操作步骤,以及确保LSN匹配的关键建议,帮你顺利完成切换:
操作步骤
一、准备阶段(无停机,提前1-2天完成)
- 确认主库和辅助库的SQL Server 2012版本补丁级别完全一致,避免兼容性问题。
- 检查日志传送状态:执行以下查询,确保最后一次日志备份、复制、还原都成功,没有 pending 任务:
SELECT secondary_server, secondary_database, last_restored_date, last_restored_lsn, restore_latency FROM msdb.dbo.log_shipping_monitor_secondary WHERE secondary_database = 'YourDBName'
- 将辅助库的数据库还原模式改为
NORECOVERY(如果之前日志传送用的是STANDBY模式):
RESTORE DATABASE [YourDBName] WITH NORECOVERY
- 配置镜像端点:主库和辅助库都需要创建镜像端点,确保端口(比如5022)在防火墙中开放:
CREATE ENDPOINT [MirroringEndpoint] STATE=STARTED AS TCP (LISTENER_PORT=5022, LISTENER_IP=ALL) FOR DATABASE_MIRRORING ( ROLE=ALL, AUTHENTICATION=WINDOWS NEGOTIATE, ENCRYPTION=REQUIRED ALGORITHM AES )
- 给SQL Server服务账号授予端点的连接权限:
GRANT CONNECT ON ENDPOINT::[MirroringEndpoint] TO [DOMAIN\SQLServiceAccount]
- 测试主备库之间的连通性:用
telnet PrimaryServer 5022和telnet SecondaryServer 5022确认端口可访问。
二、切换阶段(停机窗口,5-10分钟)
- 停止应用连接:通知业务团队暂停所有连接到主库的应用程序,标记停机开始。
- 暂停日志传送作业:
- 在主库上,禁用/暂停日志备份作业;
- 在辅助库上,禁用/暂停日志复制和还原作业。
- 主库备份尾日志:执行以下命令,备份所有未备份的日志,确保LSN连续:
BACKUP LOG [YourDBName] TO DISK = '\\SharedNetworkPath\YourDBName_TailLog_Final.bak' WITH NO_TRUNCATE, INIT, COMPRESSION
(用共享路径可以省去手动复制文件的时间,提升效率)
4. 辅助库还原尾日志:执行还原命令,保持数据库在NORECOVERY状态:
RESTORE LOG [YourDBName] FROM DISK = '\\SharedNetworkPath\YourDBName_TailLog_Final.bak' WITH NORECOVERY
- 验证LSN匹配:
- 主库查询最后备份LSN:
SELECT last_log_backup_lsn FROM sys.databases WHERE name = 'YourDBName'- 辅助库查询最后还原LSN:
确认两个LSN值完全一致,这是镜像成功配置的核心前提。SELECT TOP 1 last_restored_lsn FROM msdb.dbo.restorehistory WHERE destination_database_name = 'YourDBName' ORDER BY restore_date DESC - 配置镜像伙伴:
- 先在辅助库执行:
ALTER DATABASE [YourDBName] SET PARTNER = 'TCP://PrimaryServerName:5022'- 再在主库执行:
(如果需要高安全模式自动故障转移,后续可以配置见证服务器)ALTER DATABASE [YourDBName] SET PARTNER = 'TCP://SecondaryServerName:5022' - 确认镜像同步:在主库执行以下查询,等待
mirroring_state_desc变为SYNCHRONIZED(高安全)或SYNCHRONIZING(高性能):
SELECT name, mirroring_state_desc, mirroring_role_desc, mirroring_safety_level_desc FROM sys.database_mirroring WHERE name = 'YourDBName'
- 恢复应用连接:当镜像同步完成后,通知业务团队恢复应用连接到主库,停机结束。
三、后续验证阶段
- 检查镜像状态:每隔5分钟查询一次
sys.database_mirroring,确保状态稳定。 - 测试故障转移(可选):在非业务高峰,手动执行故障转移,验证镜像库能正常切换为主库:
ALTER DATABASE [YourDBName] SET PARTNER FAILOVER
- 清理日志传送作业:确认镜像运行稳定后,删除主备库上的日志传送相关作业和备份文件。
关键LSN匹配保障建议
- 准备阶段确保日志传送无滞后:切换前1小时,再次检查日志传送的还原延迟,确保辅助库的最后还原时间和主库的最后备份时间差不超过5分钟,避免LSN断层。
- 尾日志备份必须完整:使用
NO_TRUNCATE参数,即使主库有未提交事务,也能备份所有未归档的日志,保证LSN的连续性;同时用COMPRESSION减少备份文件大小,加快传输和还原速度。 - 还原尾日志必须用NORECOVERY:如果误用
RECOVERY,辅助库会进入在线状态,无法配置镜像,需要重新做全备+日志备,大幅增加停机时间。 - 严格控制主库写入:在备份尾日志前,可以将主库设置为只读,防止意外写入:
ALTER DATABASE [YourDBName] SET READ_ONLY WITH ROLLBACK IMMEDIATE
这样能确保尾日志备份的LSN是最终状态,辅助库还原后完全匹配。
- 提前准备共享路径:用网络共享存储存放尾日志备份,省去手动复制文件的时间,提升切换效率。
内容的提问来源于stack exchange,提问作者BeginnerDBA
相关产品推荐
相关产品推荐

