SQL Server 开启CDC

1. 开启CDC

目标数据库 test

目标表 aaa (id,name)

  • 为数据库开启cdc

    1
    2
    3
    use test
    execute sys.sp_cdc_enable_db
    go

  • 为目标表开启cdc

1
2
3
4
5
6
7
8
9
10
11
use test
execute sys.sp_cdc_enable_table
@source_schema='dbo', --数据库模式名
@source_name='aaa', --目标表
@capture_instance='test_instance', --捕获实例名,自己定义
@supports_net_changes=1, --是否开启净值捕获,通常需要开启
@role_name='sa', --用户名
@index_name=NULL,
@captured_column_list=NULL, --监控哪些列,为NULL时捕获所有列的变更
@filegroup_name='PRIMARY' --暂不知道此参数的含义
GO
  • cdc依赖sqlserver 代理,需要开启

2. 简单测试

1
2
3
4
5
6
7
-- 随意对目标表做一些增删改
insert into test.dbo.aaa
values(4,'wangwu');
update test.dbo.aaa set name='zhaoliu' where ID=3;
delete from test.dbo.aaa where ID=1;
-- 检查捕获表,可以看见里面有了记录。1 删除 2插入 3更新前 4更新后
select * from cdc.test_instance_CT;

3.获取增量数据

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 主要依赖cdc.fn_cdc_get_net_changes_test_instance(开始值,结束值,过滤条件)函数
-- 获取开始值 二进制
SELECT SYS.fn_cdc_map_time_to_lsn('smallest greater than or equal','2016-12-22 13:00:00') --大于等于2016-12-22 13:00:00
-- 获取结束值 二进制
SELECT SYS.fn_cdc_map_time_to_lsn('largest less than or equal','2016-12-22 18:00:00') --小于等于2016-12-22 18:00:00
-- 获取净更改 所谓净更改是指抛弃中间变化,获取最终状态
select *
from
cdc.fn_cdc_get_net_changes_test_instance(0x0000001D000001040003,0x0000001D000001390005,N'all')
-- 也可以获取全部更改
select *
from
cdc.fn_cdc_get_all_changes_test_instance(0x00000018000001A60033,0x00000020000000D90003,N'all')