探究SQL SERVER 更改跟踪
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 以上版本
需要开启代理服务(作业)
磁盘要有足够的空间,保存日志文件
表必须要有主键或者是唯一索引
准备测试条件
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系统自动生成的系统表进行数据变更查询

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

可以看到相关的数据变更信息,在这些系统表里都有表结构变更的记录
场景与优势
对于不需要历史信息的那些应用程序,更改跟踪产生的存储开销要小得多,因为它不
需要捕获更改的数据(不需要触发器和表时间戳).它使用同步跟踪机制来
跟踪更改.此功能旨在最大限度地减少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 更改跟踪的更多相关文章
- SQL Server 更改跟踪(Chang Tracking)监控表数据
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 主要区别与对比(Compare) 实现监控表数据步骤(Process) 参考文献(Refere ...
- 【转载,备忘】SQL Server 更改跟踪(Chang Tracking)监控表数据
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 主要区别与对比(Compare) 实现监控表数据步骤(Process) 参考文献(Refere ...
- SQL Server更改排序规则的实现过程
摘自: http://www.2cto.com/database/201112/115138.html 以下的文章主要向大家描述的是SQL Server更改排序规则的实现过程,以及在实现其实际操作过程 ...
- 【SQL Server】sql server更改了数据表的字段/新增数据表的字段 无法保存
sql server更改了数据表的字段/新增数据表的字段 无法保存 解决方法:进入 工具-->选项-->Designers-->表设计器和数据库设计器-->取消勾选 即可
- SQL Server 默认跟踪(Trace)捕获事件详解
SQL Server 默认跟踪 -- 捕获事件详解 哪些具体事件默认跟踪文件能够捕获到? --returns full list of events SELECT * FROM sys.trace_e ...
- 使用 sql server 默认跟踪分析执行的 SQL 语句
如果没有启用 SQL SERVER 的跟踪器来跟踪 SQL SERVER 的 SQL 执行情况,又想查最近的 SQL 执行情况,网上一般说是使用 LogExprorer 这个工具,网上找了这个工具很久 ...
- SQL Server 默认跟踪(Default Trace)介绍使用
背景 当数据库的表.存储过程经常别修改,当这些修改造成BUG的时候,很多开发都不承认是他们干的,那我们有没办法找出谁干的呢? SQL Server有Default Trace默认跟踪,数据库记录信息到 ...
- SQL Server 默认跟踪(Default Trace)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 查看默认跟踪信息(Default Tr ...
- 使用sql server profilter跟踪sql
最近在研究EF延迟加载和贪婪加载的用法时,想要查看Linq生成的sql.一开始通过VS-->调试-->窗口-->IntelliTrace事件,来查看生成的sql,并不是十分准确.然后 ...
随机推荐
- RAID5 IO处理之对齐读代码详解
1 总体流程 当一个读请求的覆盖范围落在一个chunk范围内时为对齐读,流程图如下所示: 2 入口 在RAID5的IO处理函数 make_request() 一开始进行了对齐读的判断和处理,代码如下所 ...
- 虚拟化_Xen——敬请期待!
更改Workstation兼容性为12.x,选择系统版本为RHEL6-64位,安装XenServer7.6成功!
- SpringCloud微服务实战——搭建企业级开发框架(四十六):【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建
近年来uni-app发展势头迅猛,只要会vue.js,就可以开发一套代码,发布移动应用到iOS.Android.Web(响应式).以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/ ...
- 七、docker镜像私有仓库
在Docker中,当我们执行 docker pull xxx 的时候 ,它实际上是从 hub.docker.com 这个地址去查找,这就是 Docker 公司为我们提供的公共仓库.在工作中,我们不可能 ...
- Istio(十一):向istio服务网格中引入虚拟机
目录 一.模块概览 二.系统环境 三.虚拟机负载 3.1 虚拟机负载 3.2 单网络架构 3.3 多网络架构 3.4 Istio 中如何表示虚拟机工作负载? 四.实战:向istio Mesh中引入虚拟 ...
- c语言求输入的任一整数的各位数之和
c语言求解代码: # include<stdio.h> int main(void){ int a,i=0,sum=0; scanf("%d",&a); if( ...
- Maven 聚合工程的创建
简单场景举例 聚合工程创建示例 说明: 创建 Maven Project:表示创建 maven 项目,new Project 方式创建 创建 Maven Module:表示创建 maven 项目,ne ...
- 1742C
题目链接 题目大意: 在一个8x8的方格中你每次可以将一行全部涂成红色或者将一列涂成蓝色.问最后一次操作是什么操作: 如果是行操作就输出R 如果是列操作就输出B 解题思路: 我们可一枚举每行每列,如果 ...
- 2022春每日一题:Day 16
题目:不同子串个数 这题需要利用后缀数组求出的height的性质,我们发现对于每个后缀,他的height后的所有子串就是算在答案里,因此答案只需要求出n-height[i]-sa[i]+1的和就可以了 ...
- C#调用WPS转换文档到PDF的的实现代码。
1.WPS安装,最好用这个版本别的版本不清楚,安装Pro Plus2016版本. https://ep.wps.cn/product/wps-office-download.html 2.添加相关的引 ...