探究SQL SERVER 更改跟踪

news2024/11/26 8:33:17

介绍

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

变更数据捕获(CDC )

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

更改跟踪(CT)

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

测试 变更数据捕获(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' )

(有需要查看更详细参数以及语法说明,可查看微软官方资料: )

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

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

函数:()

存储过程:()

系统表:(

开始测试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系统自动生成的系统表进行数据变更查询

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

查询表结构变更记录

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

测试更改跟踪(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操作是同步的。并且一次操作影响两行数据,更改跟踪记录会有两条数据,证明更改跟踪的记录是按照跟踪表主键来记录的。

总结

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基础(二十五):异常处理基础知识

文章目录 异常处理基础知识 一、了解异常 二、异常的写法 1、语法

HNUCM蓝桥杯Python组寒假第二次练习

文章目录1316: 选房子2158: 倍数问题2196: X星游戏1034: 近似回文词1749: 最少硬币2079: X星大学2086: 奖牌榜总结&#xff1a;1316: 选房子 1316: 选房子 [命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述 栋栋和李剑已经大四了&#xff0c;想要出去找…

UDS诊断系列介绍13-31服务

本文框架1. 系列介绍1.1 31服务概述2. 31服务请求与应答2.1 31服务请求2.2 31服务正响应2.3 31服务否定响应3. Autosar系列文章快速链接1. 系列介绍 UDS&#xff08;Unified Diagnostic Services&#xff09;协议&#xff0c;即统一的诊断服务&#xff0c;是面向整车所有ECU的…

”凌寒独自开“绽放不一样的自己

目录 1&#xff1a;介绍 2&#xff1a;细节介绍 ​编辑 3&#xff1a;范例演示 4&#xff1a;平台助力 5&#xff1a;冲冲冲 1&#xff1a;介绍 每一个程序员都有一个产品的梦想&#xff0c;在独自开&#xff0c;每一位开发者为自己写代码。 毕竟谁又想错过每一个展示自…

CSDN网站勋章获取介绍

持之以恒&#xff1a;已下线&#xff0c;目前无法获取 签到勋章&#xff1a;签到新秀、签到达人、签到王者都已下线&#xff0c;目前无法获取 分享勋章&#xff1a;分享学徒、分享小兵、分享达人、分享精英、分享宗师、分享王者、至尊王者都已下线&#xff0c;目前无法获取 …

Git Extensions的安装与使用

一&#xff0c;介绍&#xff1a; Git Extensions是一个工具包&#xff0c;旨在使Windows下的Git更直观。 功能 Git的Windows资源管理器集成 功能丰富的Git用户界面 32位和64位支持 二&#xff0c;安装 csdn下载地址 GitExtensionhttps://download.csdn.net/download/weixin…

前端面试当中 js原型及原型链常考知识点

一、构造函数 讲原型则离不开构造函数&#xff0c;让我们先来认识下构造函数。 1.1 构造函数分为 实例成员 和 静态成员 让我们先来看看他们分别是什么样子的。 实例成员&#xff1a; 实例成员就是在构造函数内部&#xff0c;通过this添加的成员。实例成员只能通过实例化的…

【MyBatis】第三篇:传递参数

前面聊了一些配置文件的标签意义&#xff0c;在实例演示的时候&#xff0c;发现用的sql都是定死的&#xff0c;也就是无法传递参数&#xff0c;这个不符合开发的环境的&#xff0c;毕竟程序是需要交互的&#xff0c;自然也会有参数传递&#xff0c;下面依次进行演示。 在映射文…

一个注解(优雅)搞定SpringBoot项目中的身份证号、手机号等敏感数据脱敏

&#x1f4de; 文章简介&#xff1a;一个注解搞定身份证号、手机号等敏感数据脱敏处理 &#x1f4a1; 创作目的&#xff1a;公司中CRM的第一版快封版了&#xff0c;基本功能都落实了。接下来就是预防等保了&#xff0c;我负责的是核心业务客户模块这里自然有很多数据要做脱敏。…

【十 三】Netty 私有协议栈开发

Netty 私有协议栈开发私有协议介绍跨节点通信私有协议栈设计私有协议栈的网络拓扑图协议栈功能描述协议的通信模型消息体定义消息定义表私有协议消息头定义私有协议支持的字段类型私有协议的编解码规范私有协议的编码私有协议的解码链路的建立客户端握手请求握手请求消息定义服…

智能上线阻断的算法和实践

一、背景 上线是引起系统故障的主要原因之一&#xff0c;在有些公司甚至能占到故障原因的一半&#xff0c;及时地发现并阻断、回滚存在故障隐患的上线&#xff0c;可以有效地减少系统故障。 事实上&#xff0c;现在很多平台已经提供了基于手工配置规则来进行变更阻断的能力。…

Modern C++ | 谈谈万能引用以及它的衍生问题:将亡值、引用折叠和完美转发

文章目录前言左右值引用的铺垫万能引用&&引用折叠完美转发前言 在学习Linux系统编程的过程中&#xff0c;想着得到了新知识&#xff0c;不能把旧知识忘了啊&#xff0c;所以我就读起了以前写的博客&#xff0c;在Modern C介绍这篇博客中&#xff0c;关于完美转发只是介…

安科瑞智能仪表在密集母线行业中的应用

安科瑞 华楠AMB100智能母线监控系列系统示意图功能1.电压、电流、频率、有功功率、无功功率、功率因数、有功电能、无功电能、2-63次谐波、温度、湿度、漏电流等电参量测量&#xff1b;2.交流2DI、2DO&#xff0c;直流4DI、2DO&#xff1b;3.可信号取电或者独立辅助电源供电&am…

windows安装VMware最新版本(VMware Workstation 17.0 Pro)详细教程

目录 一、概述 二、下载 VMware Workstation 17.0 Pro 三、安装 VMware Workstation 17.0 Pro 四、创建一个空的虚拟机 一、概述 VMware Workstation Pro™ 是一个运行在window或Linux系统的软件&#xff0c;使开发人员能够在同一台 PC 上同时运行多个基于 x86 的 Windows、Li…

国内最全的Spring Boot系列之六

在新的一年祝大家兔年大吉&#xff0c;兔耳冲天&#xff0c;动如脱兔! 2022年就这么过去了&#xff0c;闭上眼回首2022年发生的事情&#xff0c;犹如过眼云烟 —— 一事无成的感觉。 2022年到底都发生了什么事情&#xff0c;坚持了什么&#xff1f;于是我闭上眼睛&#xff0c…

2023-1-16 刷题情况

子相似性 III 题目描述 一个句子是由一些单词与它们之间的单个空格组成&#xff0c;且句子的开头和结尾没有多余空格。比方说&#xff0c;“Hello World” &#xff0c;“HELLO” &#xff0c;“hello world hello world” 都是句子。每个单词都 只 包含大写和小写英文字母。…

K8s 如何通过 ConfigMap 来配置 Redis ?

1、创建 ConfigMap YAML 配置文件 cat <<EOF >./example-redis-config.yaml apiVersion: v1 kind: ConfigMap metadata:name: example-redis-config data:redis-config: "" EOF2、创建 ConfigMap 资源 kubectl apply -f example-redis-config.yaml创建完成…

VMware 已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作的解决方法

在电脑上安装VMWare&#xff0c;运行虚拟机发现提示无法执行64位操作。本人系统是windows10,64位系统。错误提示&#xff1a; 已将该虚拟机配置为使用 64 位客户机操作系统。但是&#xff0c;无法执行 64 位操作。 此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态…

HTML的body元素

&#xff08;1&#xff09;HTML的body元素 body是一个简单的HTML稳定最基本的必需元素。 <body> 标签定义文档的主体。 <body> 元素包含文档的所有内容&#xff08;比如文本、超链接、图像、表格和列表等等&#xff09;。 &#xff08;2&#xff09;HTML 网页结…

HTML零基础教程,九大知识点带你玩转前端(上)

博主&#xff1a;冰小九&#xff0c;新人博主一只&#xff0c;欢迎大佬前来指导 冰小九的主页喜欢请给个三连加关注呀&#xff0c;谢谢&#x1f337;&#x1f337;&#x1f337;三连加关注&#xff0c;追文不迷路&#xff0c;你们的支持就是我最大的动力&#xff01;&#xff0…