目录标题
当然可以,下面是一份完整、清晰的 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_tables
、cdc.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