添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

确保SQLServer数据库已经开启SQL Server代理。

二、CDC功能介绍

CDC(change data capture)功能主要捕获SQLServer指定表的增删改操作,由于任何操作都会写日志(哪怕truncate),所以CDC的捕获来源于日志文件。日志文件会把更改应用到数据文件中,同时也会标记符合要求的数据标记为需要添加跟踪的项。然后通过一些配套函数,最后写入到数据仓库中。

三、具体同步步骤

1、确定哪些表进行CDC同步

2、对数据库开启CDC功能

USE  [Finance]

EXEC  sys . sp_cdc_enable_db

对于__$operation列:1 = 删除、2= 插入、3= 更新(旧值)、4= 更新(新值)

对于__$start_lsn列:由于更改是来源与数据库的事务日志,所以这里会保存其事务日志的开始序列号(LSN)

但是微软不建议直接查询这类表,建议使用cdc.fn_cdc_get_all_changes_<捕获实例> 和cdc.fn_cdc_get_net_changes_<capture_instance>  来查询。

查询已经开启的捕获: EXECUTE sys.sp_cdc_help_change_data_capture;

SET @to_lsn   = sys.fn_cdc_get_max_lsn()

SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_dept

(@from_lsn, @to_lsn, N'all');

现在先来对HumanResources.Department 表修改一下,把name的长度加长:

ALTER TABLE HumanResources.Department ALTER COLUMN Name NVARCHAR(120) ;

使用CDC的函数来获取更改:

A、使用cdc.fn_cdc_get_all_changes_HumanResources_Department 函数报告捕获实例HumanResources_Department 的当前所有可用更改:

DECLARE @from_lsn binary(10), @to_lsn binary(10)

SET @from_lsn =

sys.fn_cdc_get_min_lsn('HumanResources_Department')

SET @to_lsn   = sys.fn_cdc_get_max_lsn()

SELECT * FROM cdc.fn_cdc_get_all_changes_HumanResources_Department

(@from_lsn, @to_lsn, N'all update old');

先根据日志序列号(logsequence number ,LSN)来获取跟踪变更数据:

Sys.fn_cdc_map_time_to_lsn获取变更范围内的最大、最小LSN值。可以使用:

Smallest greater than;smallest greater than orequal;largest less than;largest less than or equal.

如查询某个时间段插入的数据:

--插入数据

INSERT INTO HumanResources.Department(name,GroupName,ModifiedDate)

VALUES('test','abc',GETDATE())

INSERT INTO HumanResources.Department(name,GroupName,ModifiedDate)

VALUES('test1','abc1',GETDATE())

--检查数据

DECLARE @bglsn VARBINARY(10)=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal','2012-10-12 12:00:00.997')

DECLARE @edlsn VARBINARY(10)=sys.fn_cdc_map_time_to_lsn('largest less than or equal',GETDATE())

SELECT DepartmentID,GroupName,Name

FROM cdc.HumanResources_Department_CT

WHERE [__$operation]=2 AND [__$start_lsn] BETWEEN @bglsn AND @edlsn

SELECT  [__$operation] ,

CASE [__$operation] WHEN 1 THEN '删除' WHEN 2 THEN '插入' WHEN 3 THEN '更新(捕获的列值是执行更新操作前的值)'

WHEN 4 THEN '更新(捕获的列值是执行更新操作后的值)' END [类型],

sys.fn_cdc_map_lsn_to_time([__$start_lsn]) [更改时间] ,

name ,

DepartmentID ,

GroupName ,

ModifiedDate

FROM    cdc.HumanResources_Department_CT

在零售、金融、互联网行业从事数据库相关工作10余年,有丰富的数据库管理和架构的相关经验。 涉及SQLServer、Oracle、MySQL、PostgreSQL等多种数据库。 目前在一家互联网公司担任数据库负责人。 负责整个集团数据库的架构设计和管理工作。

注册时间: 2010-01-19

361992

广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员