一、相关文档

老规矩,为了避免我的解释误导大家,请大家务必通过官网了解一波SQL SERVER的相关功能。

文档地址:

整体介绍文档:https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-tracking-sql-server?view=sql-server-2017

Change Data Capture:https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-data-capture-sql-server?view=sql-server-2017

Change Tracking:https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-tracking-sql-server?view=sql-server-2017

英文差的朋友可以把URL中的en-us改成zh-cn来看中文的文档

二、功能介绍

SQL SERVER内置提供了两种抓取数据变更的机制,一种叫Change Data Capture(下文简称CDC),另外一种叫Change Tracking(下文简称CT)。这两个功能能够在用户执行DML操作(插入、更新、删除)时,记录数据的变更。

他们的工作原理是,当对数据表进行操作时,SQL SERVER会记录事务日志,如果你启用了以上两个功能中的任意一个,SQL SERVER会使用SQL SERVER代理(一个独立的程序)来抓取这些日志,并记录到特定的表中(所以该方案会有额外的存储空间和服务器性能的开销),最终SQL SERVER提供了一系列的函数,来帮助使用者解析这些变更记录表,当然也有办法可以直接去读取这些变更记录。

需要注意的是,这些功能在2014及以下的版本中,需要企业版或者开发版中才会有这个功能,在SQL SERVER 2016 以上的版本中,标准版也内置了这个功能。

优势:

  1. 系统内置,无需自定义解决方案
  2. 数据表结构不需要调整,不需要添加标识列之类的东西
  3. CDC有内置的数据清除机制,对于过期后的LOG不需要自定义清除机制
  4. 该方案是异步的,虽说会对服务器性能有影响,但毕竟进程是独立的,这种影响比直接使用触发器之类的影响要小(不知道有没有方案把SQL SERVER代理部署到单独的机器上,知道的大佬可以说下)
  5. 更改是基于事务的提交,更改的顺序就是事务提交的时间,该方案获取的变更顺序一定是可靠的。
  6. SQL SERVER提供了可配置和管理的一些工具

工作原理:

这里主要是实战为主,所以只放官网的两张图片大家自行感受~

区别:

这两个功能的主要区别在于记录数据的格式,CDC更为详细一些,他会记录每条记录的每一次变更的详细内容,即变更前后,数据的每个字段的值。而CT则只是记录,这条记录发生了变更,具体的变更前后的内容不会被记录。

具体记录的内容下面会给大家做详细的介绍,请稍安勿躁~

三、准备工作

开启相关功能

除了本文外,可以参考博客园其他人写的文章:

https://www.cnblogs.com/maikucha/p/9039205.html

https://www.cnblogs.com/chenmh/p/4408825.html

1.添加专用文件组

在需要记录数据变更的数据上右键->属性->文件组,点击添加文件组,添加一个名为TDC的文件组。

2.添加数据库文件

切换到文件Tab页,然后点击添加按钮,新建一个文件,文件类型选择行数据,文件组选择刚才创建好的TDC文件组。

这一步是我从别的博主那边学到的,官方文档中没有前两步,当然你也可以忽略这两步,不过我个人的理解是这两步是为了避免和SQL SERVER主进程抢占mdf文件资源,如果和主进程使用同一个文件,可能会导致性能问题和并发的一些问题,具体可以在正式上PRD之前,多做一些测试。

3.启用SQL SERVER代理

在windows 服务里面找到SQL Server 代理服务,点击启动(必要的话设置成开机自动启动),最后在MSSQL连上数据库之后显示效果如下:

4.数据库级别启用相关功能

这些数据变更追踪功能默认都是关闭状态的,在使用这些功能的时候,首先需要在数据库级别启用这些功能。

启用数据库的CDC功能需要执行以下SQL:

USE MyDB
GO
EXEC sys.sp_cdc_enable_db
GO

启用数据库的CT功能需要执行以下SQL:

ALTER DATABASE JaxTest(数据库名称)
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)

也可以在数据库上右键->属性->更改跟踪页面中配置:

5.表级别启用相关功能

数据库级别启用完成后,还需要在表级别也启用相关功能,启用过程如下:

我们先创建一张表:

CREATE TABLE Person
(Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,Name NVARCHAR(32) NOT NULL,Age INT NOT NULL,Remark NVARCHAR(512) NULL
)

启用CDC需要执行下面的SQL:

exec sys.sp_cdc_enable_table [ @source_schema = ] 'source_schema', ---表所属的架构名,一般是dbo[ @source_name = ] 'source_name' ,----表名[ @role_name = ] 'role_name'---是用于控制更改数据访问的数据库角色的名称。[,[ @capture_instance = ] 'capture_instance' ]--是用于命名变更数据捕获对象的捕获实例的名称,这个名称在后面的存储过程和函数中需要经常用到。[,[ @supports_net_changes = ] supports_net_changes ]---指示是否对此捕获实例启用净更改查询支持如果此表有主键,或者有已使用 @index_name 参数进行标识的唯一索引,则此参数的默认值为 1。否则,此参数默认为 0。[,[ @index_name = ] 'index_name' ]--用于唯一标识源表中的行的唯一索引的名称。index_name 为 sysname,并且可以为 NULL。如果指定,则 index_name 必须是源表的唯一有效索引。如果指定 index_name,则标识的索引列优先于任何定义的主键列,就像表的唯一行标识符一样。[,[ @captured_column_list = ] 'captured_column_list' ]--需要对哪些列进行捕获。captured_column_list 的数据类型为 nvarchar(max),并且可以为 NULL。如果为 NULL,则所有列都将包括在更改表中。[,[ @filegroup_name = ] 'filegroup_name' ]--是要用于为捕获实例创建的更改表的文件组。[,[ @partition_switch = ] 'partition_switch' ]--指示是否可以对启用了变更数据捕获的表执行 ALTER TABLE 的 SWITCH PARTITION 命令。allow_partition_switch 为 bit,默认值为 1。

上面的内容可能有点啰嗦,举个实际例子吧,比如我要对Person这张表启用CDC,则执行的SQL如下:

EXEC sys.sp_cdc_enable_table @source_name = 'Person',@source_schema = 'dbo',@capture_instance = 'dbo_Personal',@filegroup_name = 'TDC',@supports_net_changes = 1,@role_name = NULL

启用CT需要执行下面的SQL:

ALTER TABLE dbo.Person(表名)
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)

当然,也可以在数据表上右键->属性->变更跟踪 Tab页中进行启用。

到这里为止,就已经启用了数据库的CDC和CT两个功能,当然,实际大部分情况下,只需要根据需要,选择其中一种即可,这里只是都做一个说明。你可以只挑一个来进行实践。

使用CDC和CT功能进行变更抓取

1.使用CDC进行变更抓取

在我们先向表中插入一些数据,然后再修改、删除插入的这些数据,再使用SQL SERVER提供的相关SP来抓取这些变更。

本文中的数据变化过程如下:

首先新增三条数据:

然后修改成下面这样子:

最后再把第二条删掉:

此时,我们先使用CDC的相关脚本来查询所有变更:

DECLARE @from_lsn binary(10), @to_lsn binary(10);
SET @from_lsn = sys.fn_cdc_get_min_lsn('dbo_Personal');
SET @to_lsn   = sys.fn_cdc_get_max_lsn();
SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_Personal(@from_lsn, @to_lsn, N'all update old');
GO

这段脚本中有两个地方用到了dbo_Personal这个名字,这个名字其实是在上面启用CDC的时候,指定的@capture_instance = 'dbo_Personal', 这个参数,如果你已经忘记了,可以翻到博客的上面回顾一下~

如果你已经忘记你执行的时候指定的这个参数名字,可以在DB的Function列表中找到它,都是以cdc.fn_cdc_get_all_changes开头的。

执行脚本后,会得到如下结果:

调用这个Function时候的参数含义和返回的每一列的含义可以参考微软官方文档:https://docs.microsoft.com/zh-cn/sql/relational-databases/system-functions/cdc-fn-cdc-get-all-changes-capture-instance-transact-sql?view=sql-server-2017,下面也给懒人朋友们截个图。

从这个LOG中,其实我们已经可以获得非常详细的我们每一次对Person这张表的操作了,而且可以发现,微软的这个顺序也已经是按照我们执行的SQL语句的顺序进行排列了,每一个字段每次的变更前后也记录的非常的清楚了。

此外,对于CDC,也可以抓取净变更记录,即再一段时间内,数据差异,并且把反复修改的中间过程会过滤掉,比如把某条记录的某个字段从A改成B,又从B改成A,这时候就会被忽略掉这个修改:

我们可以执行下面的SQL来抓取净变更:

DECLARE @from_lsn binary(10), @to_lsn binary(10);
SET @from_lsn = sys.fn_cdc_get_min_lsn('dbo_Personal');
SET @to_lsn   = sys.fn_cdc_get_max_lsn();
SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_Personal(@from_lsn, @to_lsn, N'all ');
GO

最终得到的结果如下:

可以看到,对于Id为2的那条数据,是没有体现在这里的,因为他在这个过程中,是从新增变为了删除,相当于是没有变化的,所以这个函数获取出来就没有那条记录~

这个函数的相关参数以及返回列的含义请参考:https://docs.microsoft.com/en-us/sql/relational-databases/system-functions/cdc-fn-cdc-get-net-changes-capture-instance-transact-sql?view=sql-server-2017

2.使用CT进行变更抓取

使用CT进行变更抓取需要执行以下SQL:

SELECT *
FROM  CHANGETABLE(CHANGES dbo.Person,0) AS CT

对于上面的操作记录来说,最终会得到以下结果:

可以看到CT记录的结果很简单,他只会记录哪些ID发生了变化,至于变更的内容是什么,他不会记录,但他会告诉你,你如果想同步这种变更到另外一个地方,需要使用的操作是Insert,Delete还是Update(SYS_CHANGE_OPERATION列),当然还有很多高级的用法,需要大家继续探索。

小结

本文主要讲了如何使用CDC的功能来抓取数据的变化,其实整体说的也比较浅,一是我自己对这个的认识也没用那么深,另外一方面是文章篇幅所限,本文的重点也不是将这些东西的各种用法讲清楚,我们的目的只有一个,就是将SQL SERVER中的数据同步到ES中。所以,下篇文章我们将直接使用今天说到的这些功能,结合一些其他的函数,来将数据尝试导入到ES中。

天色已晚,上床睡觉保头发~

转载于:https://www.cnblogs.com/baiyunchen/p/11361372.html

SQL数据同步到ELK(四)- 利用SQL SERVER Track Data相关功能同步数据(上)相关推荐

  1. SQL语句详解(四)——SQL联表查询

    今天我们继续给大家介绍MySQL相关知识,本文主要内容是SQL联表查询. 一.SQL联表查询简介 在前文SQL语句详解(三)--SQL子查询中,我们给大家介绍了SQL子查询的相关知识和使用示例.实际上 ...

  2. SQL Server 2016的新功能–动态数据屏蔽

    There are many new features in SQL Server 2016, but the one we will focus on in this post is: SQL Se ...

  3. SQL Server 2016的新功能–临时数据表

    There are many new features in SQL Server 2016, but the one we will focus on in this post is: SQL Se ...

  4. tp5大数据批量导入mysql_TP5框架下MySQL通过LOAD DATA INFILE批量导入数据详细操作

    LOAD DATA INFILE 语句用法 参考手册 本文语句参数使用默认值 PHP: TP框架环境// 定义文件路径 $file_path = 'LOAD_DATA_LOCAL_INFILE.txt ...

  5. .net里鼠标选中的text数据怎么获取_怎么利用Excel设置当天生日提醒功能

    怎么设置当天生日提醒功能?本期技巧妹与大家分享相关的处理方法. 1.利用TEXT函数 在单元格中输入公式输入公式=--TEXT(F2,"m-d"),利用EXT(F2,"m ...

  6. 【效能平台】接口模块——获取列表数据、查看详情数据、增加以及更新项目接口、删除接口相关功能开发(六)

    今日状态:充充实实 打卡学习 星期一 星期二 星期三 星期四 星期五 星期六 星期日 成功 暂无 暂无 暂无 暂无 暂无 暂无 一.获取接口列表数据 二.获取接口详情数据和更新数据 三.增加接口数据

  7. 山东大学软件学院2022项目实训——(四)SQL注入的学习

    目录 (一)什么是SQL注入 (二)SQL注入的类型 (三)SQL注入的危害 (四)SQL注入的防护 1.分级管理 2.参数传值 3.基础过滤与二次过滤 4.使用安全参数 5.漏洞扫描 6.多层验证 ...

  8. sql注释符注入防御_WAF的SQL注入绕过手段和防御技术

    一.关于SQL注入 SQL注入是一种常见的入侵WEB应用的手法.SQL注入是利用应用系统的编程漏洞和SQL语言的语法特征,改变原始的SQL语句执行逻辑而产生的. 攻击者向Web应用发送精心构造的输入数 ...

  9. 数据中台稳定性的“四高” | StartDT Tech Lab 18

    写在前面 这是奇点云技术专栏「StartDT Tech Lab」的第18期. 在这里,我们聚焦数据技术,分享方法论与实战.一线的项目经历,丰富的实践经验,真实的总结体会-滑到文末,可以看到我们的往期内 ...

  10. 财宝通告诉你如何利用网络POS机及时到账功能养卡

    相约YY项目工程 简介:相约YY的缘由,财宝通 "以人为本,仁义天下"为宗旨.承诺,一对一的服务,绝不抛弃,绝不放弃,达到共赢为目的每周相约YY频道号: 一.成立YY会议的目的: ...

最新文章

  1. leetcode-20 valid-parentheses(有效的括号)
  2. 用曼哈顿距离来巧解---输出菱形的问题
  3. 边框回归的损失函数_分类损失函数,边框回归损失函数
  4. CQYZOJ P1392 拔河问题
  5. oracle ldap 配置,ldap 安装
  6. 快速入门PyTorch(2)--如何构建一个神经网络
  7. ARM指令 LDR 和 ADR的一些区别
  8. Github上的版本和本地版本冲突的解决方法
  9. 检测工控设备SNMP漏洞工具:SNMP Fuzzer
  10. 计算机一级信息技术基础知识,计算机一级考试之信息技术基础.doc
  11. 感悟 | 一个 33 岁老程序员的自白:因为那时候我还不懂得…
  12. h5保存图片到手机_如何快速制作一个【H5】作品?
  13. 基于H5的实时语音聊天
  14. 恩尼格玛密码机原理解析(Enigma principle )
  15. 登录到接受邮件服务器,使用outlook2016配置imap 登陆到接收服务器(imap) 失败
  16. 【马仔创业感悟】什么是初创公司
  17. 华为 荣耀 6x android哪个版本,华为荣耀畅玩6X官方rom刷机包_华为荣耀6X原版系统包_升级包...
  18. 高德运维基于阿里云的最佳实践
  19. mysql集合运算_SQL基础教程(mick)学习
  20. 2022年度猫狗粮销售数据:十大热门品牌排行榜,哪些品牌入围?

热门文章

  1. leetcode [35]搜索插入位置/Search Insert Position 优雅的暴力可能比二分查找效率更高
  2. git 如何忽略掉指定目录
  3. codeforces 460C - Present 二分加模拟
  4. Acrobat Pro DC 2021 for Mac(pdf编辑器)中文版
  5. 如何在苹果Mac上使用 Siri?
  6. Mac不能进入休眠状态?怎么解决
  7. 移形换影 - 短视频色彩特效背后的故事
  8. CSS 控制滚动条样式
  9. crazy-tentacles -- 一个非常有意思的东西
  10. 玩转VIM编辑器-vim的命令行