设为首页 收藏本站
查看: 2191|回复: 3

[经验分享] SQL Server 更改跟踪(Chang Tracking)监控表数据

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2013-12-20 08:56:18 | 显示全部楼层 |阅读模式
一、 背景

在SQL Server 2008以上版本中,对数据库中的用户表所做的 DML 更改(插入、更新和删除操作)除了:SQL Server 变更数据捕获(CDC)监控表数据之外,还有一个新增功能,那就是:更改跟踪(Chang Tracking),它跟CDC有什么不同呢?使用场景有什么区别呢?



二、 主要区别与对比

1. SQL Server 2008 引入了两项跟踪功能:变更数据捕获和更改跟踪,以使应用程序能够确定对数据库中的用户表所做的 DML 更改(插入、更新和删除操作);

2. 如果应用程序需要有关所有所做更改的信息以及所更改数据的中间值,则可能适合使用变更数据捕获,而不适合使用更改跟踪。有关详细信息,请参阅比较变更数据捕获和更改跟踪和变更数据捕获。

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

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

更改跟踪可以根据外部传入的应用程序上下文,来完成更细颗粒度的更改处理,参考:WITH CHANGE_TRACKING_CONTEXT



三、 实现监控表数据步骤


/******* Step1:创建示例数据库*******/
USE MASTER
GO
IF EXISTS(SELECT name FROM sys.databases WHERE name = 'CT_DB')
DROP DATABASE CT_DB
GO
CREATE DATABASE CT_DB
GO



(二) 开启数据库更改跟踪Chang Tracking,通过下面的SQL脚本可以查询开启了更改跟踪的数据库列表;


/******* Step2:开启数据库更改跟踪Chang Tracking *******/
--启用更改跟踪(Chang Tracking),天清理一次(HOURS)
ALTER DATABASE CT_DB
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS,
AUTO_CLEANUP = ON)

--查看数据库是否启用更改跟踪
SELECT DB_NAME(database_id) DataBaseName,is_auto_cleanup_on,
retention_period,retention_period_units_desc
FROM sys.change_tracking_databases
(Figure1:查看数据库是否启用更改跟踪)
19172349-0b2f7f14fb2c4a61aefa60781bb3cd3d.jpg
(三) 开启数据库更改跟踪Chang Tracking,通过下面的SQL脚本可以查询开启了更改跟踪的数据库列表;

/******* Step3:对表启用更改跟踪*******/--创建测试表USE CT_DBGOCREATE TABLE [dbo].[Department](    [DepartmentID] [smallint] IDENTITY(1,1) NOT NULL,    [Name] [nvarchar](200) NULL,    [GroupName] [nvarchar](50) NOT NULL,    [ModifiedDate] [datetime] NOT NULL,    [AddName] [nvarchar](120) NULL, CONSTRAINT [PK_Department_DepartmentID] PRIMARY KEY CLUSTERED (    [DepartmentID] ASC) ON [PRIMARY]) ON [PRIMARY]GO
--对表启用更改跟踪ALTER TABLE  [dbo].[Department]ENABLE CHANGE_TRACKINGWITH (TRACK_COLUMNS_UPDATED = ON)
--查看表是否启用更改跟踪SELECT OBJECT_NAME(object_id) TableName,is_track_columns_updated_onFROM sys.change_tracking_tables


(Figure2:查看表是否启用更改跟踪) 19172351-15d4a59065a546d59b988a5a9196be6e.jpg
(四) 测试对Department表进行DML操作:分两次把数据插入到表,并使用下面的SQL脚本查看变更跟踪信息,从中可以发现,两次不同的插入会生成两个版本,这可以证明变更跟踪是跟DML操作是同步的;

/******* Step4:测试DML变更跟踪*******/--测试插入数据(版本将变成1)INSERT  INTO dbo.Department(    Name ,    GroupName ,    ModifiedDate)VALUES('Marketing','Sales and Marketing',GETDATE())
--再次测试插入数据(版本将变成2)INSERT  INTO dbo.Department(    Name ,    GroupName ,    ModifiedDate)VALUES('Production','Manufacturing',GETDATE()),('Purchasing','Inventory Management',GETDATE())
--表记录SELECT * FROM dbo.Department--当前版本SELECT CHANGE_TRACKING_CURRENT_VERSION ()AS CURRENT_VERSION--最小版本SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('dbo.Department')) AS MIN_VERSION--使用Changes关键字查看更改信息SELECT DepartmentID,SYS_CHANGE_OPERATION,SYS_CHANGE_VERSIONFROM CHANGETABLE(CHANGES dbo.Department, 0) AS CT
19172352-8829d6584be3425e872f7d657d70f4c6.jpg
(Figure3:更改跟踪信息)

(五) 继续测试对Department表进行DML操作:做一次Update操作、做一次Delete操作;

--测试更新数据(版本将变成3)UPDATE dbo.Department SET Name = 'Marketing Group',ModifiedDate = GETDATE()WHERE Name = 'Marketing'--测试删除数据(版本将变成4)DELETE FROM dbo.Department WHERE Name='Production'
--表记录SELECT * FROM dbo.Department--当前版本SELECT CHANGE_TRACKING_CURRENT_VERSION ()AS CURRENT_VERSION--最小版本SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('dbo.Department')) AS MIN_VERSION--查看版本2之后的更改SELECT DepartmentID,SYS_CHANGE_OPERATION,SYS_CHANGE_VERSION,SYS_CHANGE_COLUMNSFROM CHANGETABLE(CHANGES dbo.Department, 2) AS CT
19172354-8e54578d4ddc43aa966a824b86f58010.jpg
(Figure4:更改跟踪信息)

(六) 查看列变更说明;

--返回哪些列被修改,1为真,0为假SELECT DepartmentID,CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('dbo.Department'),'Name', 'ColumnId') ,SYS_CHANGE_COLUMNS) '是否改变Name',CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('dbo.Department'),'GroupName', 'ColumnId') ,SYS_CHANGE_COLUMNS) '是否改变GroupName',CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('dbo.Department'), 'ModifiedDate', 'ColumnId') ,SYS_CHANGE_COLUMNS) '是否改变ModifiedDate'FROM CHANGETABLE(CHANGES dbo.Department, 2) AS CTWHERE SYS_CHANGE_OPERATION = 'U'
19172355-29ddf87d3088444f8c7dda47df3a5176.jpg
(Figure5:列变更说明)

(七) 使用Version关键字查看更改信息;
--使用Version关键字查看更改信息SELECT *FROM dbo.Department dCROSS APPLY CHANGETABLE(VERSION dbo.Department, (DepartmentID), (d.DepartmentID)) AS ct
19172356-d3d6baaca55841b688c182f359e1fafc.jpg (Figure6:Version关键字查看更改信息)

(八) 通过在外部应用程序中的上下文信息判断这个DML是由哪个应用产生的;

--设置跟踪外部程序上下文信息DECLARE @context VARBINARY(128) = CAST('我要插入记录' AS VARBINARY(128));WITH CHANGE_TRACKING_CONTEXT (@context)--测试插入数据(版本将变成)INSERT  INTO dbo.Department(    Name ,    GroupName ,    ModifiedDate)VALUES('Document Control','Quality Assurance',GETDATE())
--查询Context更改SELECT DepartmentID,SYS_CHANGE_OPERATION,SYS_CHANGE_VERSION,CAST(SYS_CHANGE_CONTEXT AS VARCHAR) ApplicationContextFROM CHANGETABLE(CHANGES dbo.Department, 4) AS CT
19172358-a9c5f300789e496eb92ff13d6740521b.jpg
(Figure7:上下文信息)

(九) 获取更改跟踪版本2之后的表数据;
--获取更改跟踪版本2之后的表数据SELECT SYS_CHANGE_OPERATION,SYS_CHANGE_VERSION,SYS_CHANGE_COLUMNS,D.*FROM CHANGETABLE(CHANGES dbo.Department, 2) AS CTLEFT JOIN dbo.Department AS DON CT.DepartmentID = D.DepartmentID
19172359-42cb7ff7f5184929a56a505ea5c2fcb3.jpg (Figure8:更改表记录)

(十) 总结:在更改跟踪的记录中包括了表Department 的唯一编号,还有DML的操作符字段SYS_CHANGE_OPERATION,枚举这些值(I=Insert、U=Update、D=Delete),还有DML操作的版本号:SYS_CHANGE_VERSION,它是每进行一次DML,都会递增一个版本号,所以你可以针对I=Insert、U=Update、D=Delete不同的类型加上版本号过滤,就可以找到那些数据进行了更新;



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-11962-1-1.html 上篇帖子: SQLSERVER与C#中数据类型的对应关系 下篇帖子: SQL2005:SQL Server 2005还原数据库时出现“不能选择文件或文... 监控

尚未签到

发表于 2013-12-25 18:20:45 | 显示全部楼层
就这样擦身而过,如果是注定的结果。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2014-1-1 01:48:50 | 显示全部楼层
我不是不温柔,背叛和欺骗太多,我只好强悍。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2014-1-3 04:52:31 | 显示全部楼层
为你唱这首歌,没有什么风格。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表