什么是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; GO2、强制清理复制元数据
USE master; GO -- 强制移除发布/复制配置 EXEC sp_removedbreplication @dbname = 'DB1', @type = N'publish', @force = 1; GO3、重置复制 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; GO4、验证 LSN 是否清除
USE DB1; GO DBCC OPENTRAN; GO5、收缩事务日志
SQL SERVER 数据库日志文件收缩_sqlserver收缩日志文件-CSDN博客