SQL Server 复制残留 LSN 导致日志无法收缩
2026/7/23 14:17:33 网站建设 项目流程

什么是LSN?

LSN(Log Sequence Number)日志序列号,是SQL Server事务日志唯一且递增的编号,用来区分事务的先后顺序,备份恢复时依靠它标记备份节点、确定恢复区间,数据同步、CDC 及事务复制场景中则用它精准定位增量变更日志,且数据库仅能截断最早活跃事务 LSN 之前的日志。

什么是复制残留LSN,为什么会导致复制残留?

复制残留 LSN,是 SQL Server 事务复制 / CDC 功能留下的长期未被清理的事务日志保留标记,会强制数据库一直保留某个 LSN 之前的日志,导致日志文件无法自动截断、持续膨胀。

可能是因为删除复制 / CDC 发布、订阅或作业,但没有按流程彻底清理元数据导致LSN 标记仍存在,以CDC为例,删除或禁用cdc capture 作业,但是未执行sp_cdc_disable_db,可能会导致复制残留。

什么是CDC,怎么判断是不是 CDC 残留??

Change Data Capture(变更数据捕获),用来自动捕获数据库表的增、删、改操作,并把这些变更记录存到专门的系统表中,不会影响原表的业务性能。开启 CDC 后,SQL Agent 会有一个捕获作业,不停扫描事务日志,把捕获的变更,写到系统表cdc.dbo_xxx_CT 中。

-- 1. 查数据库是否开启过 CDC SELECT name, is_cdc_enabled, log_reuse_wait_desc FROM sys.databases WHERE name='DB1'; -- 2. 查 CDC 作业(SQL Agent)有没有 cdc.DB1_capture /_cleanup -- 3. 查残留 LSN(关键)最早的非分布式 LSN,就是CDC/复制残留 DBCC OPENTRAN;

如何解决复制残留?

1、前置检查

USE master; GO -- 查看数据库复制状态,is_published/is_subscribed 发布状态/订阅状态 SELECT name,is_published,is_subscribed FROM sys.databases WHERE name='DB1'; -- 查看残留复制事务LSN USE DB1; GO DBCC OPENTRAN; GO

2、强制清理复制元数据

USE master; GO -- 强制移除发布/复制配置 EXEC sp_removedbreplication @dbname = 'DB1', @type = N'publish', @force = 1; GO

3、重置复制 LSN 标记

注意:切换SINGLE_USER WITH ROLLBACK IMMEDIATE会强制断开所有业务连接,导致业务中断、必须维护窗口、操作前完整备份。

USE DB1; GO -- 切单用户,立刻回滚所有连接 ALTER DATABASE DB1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO -- 清空复制事务标记、解除日志锁定 EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1; GO -- 手动检查点,截断日志 CHECKPOINT; GO -- 恢复多用户模式 ALTER DATABASE DB1 SET MULTI_USER; GO

4、验证 LSN 是否清除

USE DB1; GO DBCC OPENTRAN; GO

5、收缩事务日志

SQL SERVER 数据库日志文件收缩_sqlserver收缩日志文件-CSDN博客

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询