1.介绍

SQL SERVER在2008以上的版本提供两个用于数据库中跟踪数据更改的功能:变更数据捕获(CDC)与更改跟踪(CT)。这两个功能使应用程序能够确定对数据库中的用户表所做的 DML 更改(插入、更新和删除操作)

变更数据捕获(CDC)

变更数据捕获通过获取进行 DML 更改的方面和更改的实际数据,提供用户表的历史更改信息。更改是使用异步进程捕获的,此进程读取事务日志,并且对系统造成的影响很小。

                

更改跟踪(CT)

 

更改跟踪捕获更改了表行这一事实,但不会捕获更改的数据。因此,与变更数据捕获相比,更改跟踪可以解答的历史问题比较有限。但是,对于不需要历史信息的那些应用程序,更改跟踪产生的存储开销要小得多,因为它不需要捕获更改的数据。它使用同步跟踪机制来跟踪更改。此功能旨在最大限度地减少 DML 操作开销。

 

2. 测试变更数据捕获(CDC)功能

场景与优势

为了满足数据迁移和数据抽取的业务需要,使得有机会在数据库层面上直接实现增量抽取功能,ORACLE综合性能和场景需要,在数据库引擎层面直接集成了CDC功能,由于提供了类似API的功能接口,变更数据捕获和更改跟踪均不要求在源中进行任何架构更改或使用触发器,所以比第三方工具具有一定的优势。利用CDC捕获变更有以下特点:

① 性能影响小。使用异步进程捕获,通过进程读取事务日志,对系统造成的影响很小,不对业务系统造成太大的压力,影响现有业务。

② 监控范围大。对该表的所有DML和DDL操作都会被记录,有助于跟踪表的变化,实现表操作的追根溯源。

③ 操作简单 。CDC是在数据库引擎中添加的功能,封装在数据库中,类似于API接口调用,不需要复杂的业务处理逻辑就可以实现DML和DDL的操作监控。

④ 有一定时延性。由于捕获进程从事务日志中提取更改数据,因此,向源表提交更改的时间与更改出现在其关联更改表中的时间之间存在内在的延迟。虽然这种延迟通常很小,但务必记住,在捕获进程处理相关日志项之前无法使用更改数据。

开启CDC的必要条件
  • sqlserver 2008 以上版本

  • 需要开启代理服务(作业)

  • 磁盘要有足够的空间,保存日志文件

  • 表必须要有主键或者是唯一索引

准备测试条件

 1、首先创建测试数据库和表:

use  master

go

create  database test

go

use  test

go

CREATE  TABLE [dbo].[test](

[id] [int] NOT NULL,

[name] [varchar](20) NULL,

CONSTRAINT [id] PRIMARY KEY CLUSTERED(

[id] ASC

)  ON [PRIMARY])

go

2、然后开启数据库的CDC功能

USE  test

GO

EXEC  sys.sp_cdc_enable_db

GO

3、添加次要数据文件组及文件

 

4、执行脚本开启表的CDC功能

EXEC sys.sp_cdc_enable_table

@source_schema  = 'dbo', -- 源表所属的架构的名称

@source_name  = 'test', -- 要启用的表名称

@capture_instance  = NULL, -- capture_instance

@supports_net_changes  = 1, -- supports_net_changes

@role_name  = NULL, -- role_name

@index_name  = NULL, -- index_name

@captured_column_list  = NULL, -- captured_column_list

@filegroup_name  = 'CDC' -- 要用于创建捕获实例的更改表的文件组

执行结果:

 

查询CDC开启状态

SELECT  name ,

is_tracked_by_cdc  ,

CASE WHEN is_tracked_by_cdc  = 0 THEN 'CDC功能禁用'

ELSE  'CDC功能启用'

END 描述

FROM    sys.tables

WHERE   OBJECT_ID= OBJECT_ID('test')

(有需要查看更详细参数以及语法说明,可查看微软官方资料:https://docs.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sys-sp-cdc-enable-table-transact-sql?view=sql-server-2017)

开启成功后,CDC会在数据库中生成多个系统表,视图,系统存储过程,函数,作业等。

 

详细的介绍可查看微软官方文档:

函数:(https://docs.microsoft.com/zh-cn/sql/relational-databases/system-functions/change-data-capture-functions-transact-sql?view=sql-server-2017)

存储过程:(https://docs.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/change-data-capture-stored-procedures-transact-sql?view=sql-server-2017)

系统表:(https://docs.microsoft.com/zh-cn/sql/relational-databases/system-tables/change-data-capture-tables-transact-sql?view=sql-server-2017)

开始测试CDC功能

 执行对表数据增删改的脚本以及修改表结构的脚本

use  test

insert  into test values(1,'one'),(2,'two'),(3,'three')

update  test set id=4,name='four' where id =2

delete  from test where id = 1

ALTER  TABLE test ADD name2 varchar(20)

通过之前开启CDC系统自动生成的系统表进行数据变更查询

 

可以看到相关的数据变更信息,在这些系统表里都有数据变更的记录。

查询表结构变更记录

 

可以看到相关的数据变更信息,在这些系统表里都有表结构变更的记录

 3    测试更改跟踪(CT)功能

场景与优势

 

对于不需要历史信息的那些应用程序,更改跟踪产生的存储开销要小得多,因为它不

需要捕获更改的数据(不需要触发器和表时间戳).它使用同步跟踪机制来

跟踪更改.此功能旨在最大限度地减少DML 操作开销.

准备测试条件

1、开启更改跟踪功能

必须先在数据库级别启用更改跟踪,然后才能使用更改跟踪。

开启数据库级别更改跟踪脚本如下:

ALTER  DATABASE test

SET  CHANGE_TRACKING =  ON  --开启更改跟踪功能

(CHANGE_RETENTION =  35 DAYS, AUTO_CLEANUP = ON) --设置保持期与是否自动清除

开启成功后,创建测试表。(注意,表必须要有主键)

CREATE  TABLE [dbo].[test](

[c1] [int] IDENTITY(1,1) NOT NULL,

[c2] [varchar](20) NOT NULL,

[c3] [varchar](max) NULL

CONSTRAINT  [PK_test] PRIMARY  KEY CLUSTERED

(

[c1] ASC

)ON [PRIMARY])

插入数据:

insert  into test values('test1','one'),('test2','two'),('test3','three')

 

开启表更改跟踪:

 

开启表更改跟踪功能脚本如下:

ALTER  TABLE test

ENABLE  CHANGE_TRACKING  --开启更改跟踪功能

WITH  (TRACK_COLUMNS_UPDATED  = ON)  --开启跟踪已更新的列

开始测试CT功能

 对表做增删改操作

insert  into test values('test4','four')

update  test set c2 = 't2' where c1 <3

delete  from test where c2='test3'

上边的脚本每执行一次,都要对应执行一次下面的脚本,查看版本号以及跟踪信息。

SELECT  CHANGE_TRACKING_CURRENT_VERSION()

AS当前版本号

SELECT

SYS_CHANGE_OPERATION  as 操作类型,

SYS_CHANGE_VERSION  as 版本号,

SYS_CHANGE_CONTEXT  as 语句,

SYS_CHANGE_COLUMNS  as 发生更改的列,

c1  --跟踪表主键值

FROM  CHANGETABLE(CHANGES dbo.test, 0) AS CT

结果如下:

          

从中可以发现,三次不同的DML操作会生成三个版本,这可以证明变更跟踪是跟DML操作是同步的。并且一次操作影响两行数据,更改跟踪记录会有两条数据,证明更改跟踪的记录是按照跟踪表主键来记录的。

 4总结

变更数据捕获中的跟踪机制涉及从事务日志中异步捕获更改,因此,可以在执行 DML 操作后获得更改信息。更改跟踪中的跟踪机制涉及在执行 DML 操作的同时同步跟踪更改,因此,可以立即获得更改信息。

两种机制的功能差异如下图:

1.变更数据捕获使用异步进程捕获,此进程读取事务日志;更改跟踪是与DML操作同步的,不需要读取事务日志;

2.变更数据捕获包含了变更的历史记录,更改跟踪只保存行,但不会捕获更改的数据。

希望通过本文章,大家对SQL SERVER更改跟踪功能有所了解。

探究SQL SERVER 更改跟踪的更多相关文章

  1. SQL Server 更改跟踪(Chang Tracking)监控表数据

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 主要区别与对比(Compare) 实现监控表数据步骤(Process) 参考文献(Refere ...

  2. 【转载,备忘】SQL Server 更改跟踪(Chang Tracking)监控表数据

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 主要区别与对比(Compare) 实现监控表数据步骤(Process) 参考文献(Refere ...

  3. SQL Server更改排序规则的实现过程

    摘自: http://www.2cto.com/database/201112/115138.html 以下的文章主要向大家描述的是SQL Server更改排序规则的实现过程,以及在实现其实际操作过程 ...

  4. 【SQL Server】sql server更改了数据表的字段/新增数据表的字段 无法保存

    sql server更改了数据表的字段/新增数据表的字段  无法保存 解决方法:进入 工具-->选项-->Designers-->表设计器和数据库设计器-->取消勾选   即可

  5. SQL Server 默认跟踪(Trace)捕获事件详解

    SQL Server 默认跟踪 -- 捕获事件详解 哪些具体事件默认跟踪文件能够捕获到? --returns full list of events SELECT * FROM sys.trace_e ...

  6. 使用 sql server 默认跟踪分析执行的 SQL 语句

    如果没有启用 SQL SERVER 的跟踪器来跟踪 SQL SERVER 的 SQL 执行情况,又想查最近的 SQL 执行情况,网上一般说是使用 LogExprorer 这个工具,网上找了这个工具很久 ...

  7. SQL Server 默认跟踪(Default Trace)介绍使用

    背景 当数据库的表.存储过程经常别修改,当这些修改造成BUG的时候,很多开发都不承认是他们干的,那我们有没办法找出谁干的呢? SQL Server有Default Trace默认跟踪,数据库记录信息到 ...

  8. SQL Server 默认跟踪(Default Trace)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 查看默认跟踪信息(Default Tr ...

  9. 使用sql server profilter跟踪sql

    最近在研究EF延迟加载和贪婪加载的用法时,想要查看Linq生成的sql.一开始通过VS-->调试-->窗口-->IntelliTrace事件,来查看生成的sql,并不是十分准确.然后 ...

随机推荐

  1. 个人音乐博客 h5、css和js等

    浅说一下吧 这个小项目由h5和css还有js和jq写的 主题内容为个人音乐 博客等 首页一级导航栏 以及侧边栏 整合部分图标(侧边栏未添加收起操作 时间原因 会的朋友们可以自行添加一个动画就可以 在m ...

  2. 文本转语音TTS(文本阅读和视频配音制作)MP3

    DL-TTS 通过AI驱动引擎可将文本转化为逼真的语音,它可以:(1)生成逼真的合成语音实现与人声的语调和情感匹配的流畅.发音自然的文本转语音.(2)细化的文本转语音控制支持多种语言,并可调整语速.语 ...

  3. 6.channels 配置websocket

      Django默认不支持websockey,需要Django支持的话需要安装第三方组件 django channels 是django支持websocket的一个模块.   1.安装 pip3 in ...

  4. 11.mixins混合类

      一.混合类(mixins) 使用基于类的视图,最大的优势之一就创建可复用的代码 我们编写的非常类似的代码,可以抽象出来,将这部分代码放到mixin类系列中,然后作为父类提供子类继承使用 from ...

  5. React实现一个简易版Swiper

    背景 最近在公司内部进行一个引导配置系统的开发中,需要实现一个多图轮播的功能.到这时很多同学会说了,"那你直接用swiper不就好了吗?".但其实是,因为所有引导的展示都是作为np ...

  6. nrf9160 做modem—— 连接云(接入方式MQTT)

    今天测试把nrf9160作为modem的例程Serial LTE Modem程序(后面简称slm),何为做modem,通俗来说就是将nrf9160作为无线模块,主控由其余MCU做,主控通过AT命令控制 ...

  7. ES6 学习笔记(六)基本类型String

    字符串String 1.字面量 需要注意的地方: 由单引号或双引号括起来的字符序列. 单双引号可以嵌套,由最外围引号定界字符串 字符串字面量可以拆分成数行,每行必须以反斜线(\)结束,且反斜线都不计入 ...

  8. VM虚拟机搭建Linux CentOS7(手把手教程)

    VM虚拟机搭建Linux CentOS7(手把手教程) 目录 VM虚拟机搭建Linux CentOS7(手把手教程) 一.VM虚拟机和Linux镜像文件下载 1. 登录VM虚拟机官方地址: 2. 安装 ...

  9. 解决 net core 3.x 跨域问题

    跨域:指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 以下几种情况是造成跨域的原因: 域名相同,端口不同 域名相同,协议不同(即,一个 ...

  10. JUC学习笔记——共享模型之管程

    JUC学习笔记--共享模型之管程 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的管程部分 我们会分为以下几部分进行介绍: 共享问题 共享问题解决方案 线程安全分析 Monitor ...