SQL Server:启用 CDC 实战笔记

当然可以,下面是一份完整、清晰的 SQL Server 启用 CDC(Change Data Capture)功能的整理笔记,适用于学习、测试或部署前的准备工作。


📘 SQL Server 启用 CDC 实战笔记(以 Employee 表为例)


🧱 一、创建数据库并配置

-- 1. 创建测试数据库
CREATE DATABASE cdc_test_db;
GO

-- 2. 切换到该数据库
USE cdc_test_db;
GO

-- 3. 设置为 FULL 恢复模式(CDC 推荐)
ALTER DATABASE cdc_test_db SET RECOVERY FULL;
GO

🔌 二、启用数据库级别的 CDC

-- 启用数据库层面的 CDC 功能
EXEC sys.sp_cdc_enable_db;
GO

成功后,SQL Server 会自动创建:

  • 架构:cdc
  • 管理表:如 cdc.change_tablescdc.captured_columns
  • Agent 作业(如启用表时会自动创建)

📋 三、创建测试表

-- 创建一个示例员工表
CREATE TABLE dbo.Employee (
    EmployeeID INT PRIMARY KEY,
    Name NVARCHAR(100),
    Department NVARCHAR(50),
    HireDate DATETIME DEFAULT GETDATE()
);
GO

在这里插入图片描述

🧩 四、启用表级别的 CDC

EXEC sys.sp_cdc_enable_table
    @source_schema = N'dbo',
    @source_name   = N'Employee',
    @role_name     = NULL,  -- 可填入数据库角色名来限制访问
    @supports_net_changes = 1;  -- 启用净变更视图(可选)
GO

成功后,SQL Server 会创建:

  • 变更表:cdc.dbo_Employee_CT

  • 查询函数:

    • cdc.fn_cdc_get_all_changes_dbo_Employee
    • cdc.fn_cdc_get_net_changes_dbo_Employee
      在这里插入图片描述
      在这里插入图片描述

✅ 五、验证 CDC 状态

查看当前启用的 CDC 表:

SELECT * FROM cdc.change_tables;

查看被捕获的列:

SELECT * 
FROM cdc.captured_columns
WHERE object_id = OBJECT_ID('dbo.Employee');

在这里插入图片描述


🧪 六、插入数据并验证 CDC 是否捕获变更

-- 插入测试数据
INSERT INTO dbo.Employee (EmployeeID, Name, Department)
VALUES 
    (1, 'Alice', 'HR'),
    (2, 'Bob', 'IT');
GO

-- 等待 SQL Server Agent 的日志扫描作业运行完(或手动执行)

-- 查询捕获到的所有变更数据
SELECT * 
FROM cdc.fn_cdc_get_all_changes_dbo_Employee(
    sys.fn_cdc_get_min_lsn('dbo_Employee'),
    sys.fn_cdc_get_max_lsn(),
    'all');

在这里插入图片描述


⚠️ 常见问题排查

问题解决方法
报错 14234(@srv 无效)执行 EXEC sp_helpserver 查看本地服务器是否正确注册。必要时使用 sp_addserver 添加并重启实例。
无法看到变更数据检查 SQL Server Agent 是否已启动。CDC 日志扫描依赖 Agent 作业运行。
查询函数不存在确认表级 CDC 是否启用成功,并检查 cdc.change_tables 中是否有记录。

🧼 七、禁用 CDC(可选)

禁用表的 CDC:

EXEC sys.sp_cdc_disable_table
    @source_schema = N'dbo',
    @source_name = N'Employee',
    @capture_instance = N'dbo_Employee';
GO

禁用数据库级 CDC(必须先禁用所有表):

EXEC sys.sp_cdc_disable_db;
GO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值