SQLSERVER 生产环境关闭CDC的完整流程(全库表关闭CDC)


-->>关闭shukuinfo库中,表中已开启CDC的功能

一、先确认当前哪些表开启了 CDC(建议先看)
USE shukuinfo;
GO
SELECT 
    s.name AS SchemaName,
    t.name AS TableName,
    t.is_tracked_by_cdc
FROM sys.tables t
JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE t.is_tracked_by_cdc = 1;


二、批量关闭所有表中已开启的 CDC

推荐方式:按 capture_instance 关闭(最安全)
USE shukuinfo;
GO
DECLARE @sql NVARCHAR(MAX);
DECLARE cur CURSOR FAST_FORWARD FOR
SELECT 
    'EXEC sys.sp_cdc_disable_table 
        @source_schema = ''' + s.name + ''', 
        @source_name = ''' + t.name + ''', 
        @capture_instance = ''' + c.capture_instance + ''';' AS sqlcmd
FROM 
    cdc.change_tables c
JOIN 
    sys.tables t ON c.source_object_id = t.object_id
JOIN 
    sys.schemas s ON t.schema_id = s.schema_id;


OPEN cur;
FETCH NEXT FROM cur INTO @sql;


WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @sql;
    EXEC sp_executesql @sql;
    FETCH NEXT FROM cur INTO @sql;
END


CLOSE cur;
DEALLOCATE cur;
GO


说明
cdc.change_tables只记录真正开启 CDC 的表
一个表可能有多个 capture_instance(如重新启用过)
该脚本会全部正确关闭,不会报错


三、(可选)关闭整个数据库的 CDC
这会删除所有 CDC 元数据、作业和变更数据,不可恢复
USE shukuinfo;
GO


EXEC sys.sp_cdc_disable_db;
GO
一般不建议在生产环境直接执行,除非你确定不再需要 CDC。


四、验证是否已关闭

-- 表级 CDC 应全部为 0
SELECT 
    s.name AS SchemaName,
    t.name AS TableName,
    t.is_tracked_by_cdc
FROM sys.tables t
JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE t.is_tracked_by_cdc = 1;


-- 数据库级 CDC 状态
SELECT name, is_cdc_enabled
FROM sys.databases
WHERE name = 'shukuinfo';


五、常见注意事项(很重要)
权限要求
sysadmin或 db_owner
SQL Server 版本
CDC 仅 Enterprise / Developer 版支持
CDC 关闭后
cdc.*_CT表会被自动删除
CDC 作业会自动移除
历史变更数据无法再查询
事务复制 / 发布
如果该库同时启用了复制,CDC 关闭前需确认无依赖


六、如果你只想“临时停用”
CDC 没有暂停功能,只能:
✅ 关闭表级 CDC(如上脚本)
❌ 无法 pause/resume


步骤 1:停用之前创建的定时日志备份 JOB
sql
USE msdb;
GO
-- 禁用30分钟日志备份作业,防止切换模式后定时备份报错
EXEC sp_update_job
    @job_name = N'每30分钟执行日志备份',
    @enabled = 0; -- 0=禁用,1=启用
GO


步骤 2:切换数据库为简单恢复模式(关闭完整日志恢复)
sql
USE master;
GO
ALTER DATABASE [shukuinfo] SET RECOVERY SIMPLE WITH NO_WAIT;
GO
切换完成后,数据库会自动触发检查点,自动截断已提交事务日志,日志使用率立刻下降。


步骤 3:查询日志占用,确认已自动截断
sql
DBCC SQLPERF(LOGSPACE);


步骤 4:收缩事务日志文件,清空缩小磁盘占用
4.1 先查询日志文件逻辑名(必须拿到正确逻辑名再收缩)
sql
USE shukuinfo;
GO
SELECT name AS 日志文件逻辑名, size*8/1024 AS 当前大小MB FROM sys.database_files WHERE type=1;
查询结果里 name 字段就是日志逻辑文件名,一般为 shukuinfo_log。


4.2 执行收缩日志(示例目标缩到 4096MB,可自行调整)
sql
USE shukuinfo;
GO
-- 收缩日志至4GB,按需修改数字,如2048=2G、1024=1G
DBCC SHRINKFILE (N'UAT_shukuinfo_log', 4096);
GO


分割线
感谢打赏
江西数库信息技术有限公司
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS