SqlServer Change Data Capture(CDC)数据变更捕获
最近在使用SqlServer2008r2数据库做系统的时候,在某些重要的、经常涉及到修改的表上,想加上一些恢复机制,一开始想找找看看有没有类似Oracle数据库闪回那样的功能,后来发现CDC的功能可以实现我的需求,SQLServer还有一个功能叫更改跟踪,但是它只记录那些表或者列发生了更改,但是不保存历史数据,所以忽略它。所以接下来就针对CDC做了一些研究和大家分享。
基本概念
变更数据捕获用于捕获应用到 SQL Server 表中的插入、更新和删除活动,并以易于使用的关系格式提供这些变更的详细信息。变更数据捕获所使用的更改表中包含镜像所跟踪源表列结构的列,同时还包含了解所发生的变更所需的元数据。变更数据捕获提供有关对表和数据库所做的 DML 更改的信息。通过使用变更数据捕获,您无需使用费用高昂的方法,如用户触发器、时间戳列和联接查询等。

数据变更历史表会随着业务的持续,变得很大,所以默认情况下,变更数据历史会在本地数据库保留3天(可以通过视图msdb.dbo.cdc_jobs的字段retention来查询,当然也可以更改对应的表来修改保留时间),每天会通过SqlServer后台代理任务,每天晚上2点定时删除。所以推荐定期的将变更数据转移到数据仓库中。
启用变更数据捕获
在为各个表创建捕获实例之前,必须先由 sysadmin 固定服务器角色的成员对数据库启用变更数据捕获。通过在数据库上下文中运行 sys.sp_cdc_enable_db (Transact-SQL) 存储过程可实现这一点。若要确定数据库是否已启用此功能,请在 sys.databases 目录视图中查询 is_cdc_enabled 列。
当对数据库启用了变更数据捕获之后,将为数据库创建 cdc 架构、cdc 用户、元数据表和其他系统对象。cdc 架构包含变更数据捕获元数据表,当对源表启用了变更数据捕获之后,各个更改表将用作更改数据的存储库。cdc 架构还包含用于查询更改数据的关联系统函数。
变更数据捕获要求采用独占方式使用 cdc 架构和 cdc 用户。如果某数据库中当前存在名为 cdc 的架构或数据库用户,那么在删除或重命名此架构或用户之前,不能对此数据库启用变更数据捕获。
--查看数据库是否起用CDC
USE master
GO
SELECT [name], database_id, is_cdc_enabled
FROM sys.databases
GO --数据库起用CDC
USE Demo01
GO
EXEC sys.sp_cdc_enable_db
GO --关闭数据库CDC
USE Demo01
go
exec sys.sp_cdc_disable_db
go --查看表是否启用CDC
USE Demo01
GO
SELECT [name], is_tracked_by_cdc
FROM sys.tables
GO --启用表的CDC,前提是数据库启用CDC
--@role_name 指定角色的目的是控制对更改数据的访问。指定的角色可以为现有的固定服务器角色或数据库角色。如果指定的角色还不存在,则会自动创建具有该名称的数据库角色。sysadmin 或 db_owner 角色的成员对于更改表中的数据拥有完全访问权限。如果不适用角色需要显示指定为null。
--使用自己新建测测试表User来操做,列为id(主键,自增),name,address。
USE Demo01
GO
EXEC sys.sp_cdc_enable_table
@source_schema = 'dbo',
@source_name = 'user',
@capture_instance='user',
@role_name = NULL
GO --关闭表上的CDC功能
USE Demo01
GO
EXEC sys.sp_cdc_disable_table
@source_schema = 'dbo',
@source_name = 'user',
@capture_instance='user'
GO
--可能不记得或者不知道开启了什么表的捕获,返回所有表的变更捕获配置信息
EXECUTE sys.sp_cdc_help_change_data_capture;
GO
--查看对某个实例(即表)的哪些列做了捕获监控:
EXEC sys.sp_cdc_get_captured_columns
@capture_instance = 'user'
--查找配置信息 -retention 变更数据保留的分钟数
SELECT * FROM msdb.dbo.cdc_jobs
--更改数据保留时间为分钟
EXECUTE sys.sp_cdc_change_job
@job_type = N'cleanup',
@retention=1440
GO
--停止捕获作业
exec sys.sp_cdc_stop_job N'capture'
go
--启动捕获作业
exec sys.sp_cdc_start_job N'capture'
go
--开始在user表中进行修改,增加和删除操作
select * from [user];
update [user] set name='Alex' where id=6;
insert into [user] (name,address) values ('你好','4756');
delete from [user] where ID=5;
--查看变更表中的数据,_$operation的含义:1 = 删除,2 = 插入,3 = 更新(旧值),4 = 更新(新值)
select * from CDC.user_CT;
--按照时间范围查询CDC结果
DECLARE @bglsn VARBINARY(10)=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal','2016-3-1 12:00:00.997')
DECLARE @edlsn VARBINARY(10)=sys.fn_cdc_map_time_to_lsn('largest less than or equal',GETDATE())
SELECT * FROM CDC.user_CT
WHERE [__$operation] in (1,2,3,4) AND [__$start_lsn] BETWEEN @bglsn AND @edlsn
--sys.fn_cdc_map_lsn_to_time 查询变更时间:
SELECT [__$operation] ,
CASE [__$operation] WHEN 1 THEN '删除'
WHEN 2 THEN '插入'
WHEN 3 THEN '更新(捕获的列值是执行更新操作前的值)'
WHEN 4 THEN '更新(捕获的列值是执行更新操作后的值)' END [类型],
sys.fn_cdc_map_lsn_to_time([__$start_lsn]) [更改时间] ,
name ,address ,id FROM cdc.user_CT;
注意:
上面都是简单介绍,在使用中过程中肯定会有各种问题,建议可以参考一下官方文档 https://technet.microsoft.com/zh-cn/library/cc280519(v=sql.105).aspx
如果数据库以同一数据库名称还原到同一服务器,变更数据捕获将保持启用状态。如果数据库还原到其他服务器,默认情况下将禁用变更数据捕获,并删除所有相关的元数据。若要保留变更数据捕获,还原数据库时请使用 KEEP_CDC 选项。
SqlServer Change Data Capture(CDC)数据变更捕获的更多相关文章
- Oracle CDC (Change Data Capture)更新数据捕获——概述
Change Data Capture能高效识别并捕获数据的插入.修改和删除,使更新数据供个人或应用使用. CDC从oracle 9i开始引入,//TODO 在11G R2之后的版本里将取消支持,被O ...
- Oracle CDC (Change Data Capture)更新数据捕获——Asynchronous HotLog Mode(附带简单的kettle任务实现数据同步)
Performing Asynchronous HotLog Publishing Step 1 Source Database DBA: Set the database initializat ...
- salesforce零基础学习(一百零五)Change Data Capture
本篇参考: https://developer.salesforce.com/docs/atlas.en-us.232.0.api_streaming.meta/api_streaming/using ...
- 使用SQLServer 2008的CDC功能实现数据变更捕获
原文:使用SQLServer 2008的CDC功能实现数据变更捕获 最近由于工作需要,研究了一下2008 CDC功能,觉得还不错,下面整理了一下研究过程,虽然比较粗略,但是基本上能用了,如果有补充请大 ...
- SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑
SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑 关键词:CDC 原文:http://www.cnblogs.com/chenxizhang/arc ...
- SQLSERVER|CDC日志变更捕获机制
一.什么是CDC? 变更数据捕获(Change Data Capture ,简称 CDC)记录 SQL Server 表的插入.更新和删除活动.SQLServer的操作会写日志,这也是CDC捕获数据的 ...
- SQLSERVER|CDC 日志变更捕获机制
先说一下什么是cdc ,cdc 变更数据捕获(Change Data Capture ,简称 CDC)记录 SQL Server 表的插入.更新和删除活动.SQLServer的操作会写日志,这也是CD ...
- 在SSIS 2012中使用CDC(数据变更捕获)
最新项目稍有空隙,开始研究SQL Server 2012和2014的一些BI特性,参照(Matt)的一个示例,我们开始体验SSIS中的CDC(Change Data Capture,变更数据捕获). ...
- SQL Server审计功能入门:CDC(Change Data Capture)
原文:SQL Server审计功能入门:CDC(Change Data Capture) 介绍 SQL Server 2008引入了CDC(Change Data Capture),它能记录: 1. ...
随机推荐
- Problems encountered while deleting resources.
Error The project was not built due to “Problems encountered while deleting resources.”. Fix the pro ...
- Android使用HttpClient实现文件上传到PHP服务器,并监控进度条
上传 服务器端PHP 代码如下 : <?php $target_path = "./tmp/";//接收文件目录 $target_path = $target_path.($ ...
- html input设置为只读属性
有两种方式可以实现input的只读效果:disabled 和 readonly. 自然两种出来的效果都是只能读取不能编辑,可是两者有很大不同. Disabled说明该input无效,及其value不会 ...
- SQL Server 2008如何进行数据库同步?
复制有三种类:事务复制.快照复制.合并复制.事务复制是将复制启用后的所有发布服务器上发布的内容在修改时传给订阅服务器,数据更改将按照其在发布服务 器上发生的顺序和事务边界,应用于订阅服务器,在发布内部 ...
- oracle 分区和分区索引
一.个人理解:建表时一般都会指定在一个表空间上,但是可能随着表空间扩大,查询越来越慢,分区表就是将一个表实际存在不同的表空间,oracle存储分为块,断,表空间.新建一个表,会给表分配指定大小的段,段 ...
- codeforce 621C Wet Shark and Flowers
题意:输入个n和质数p,n个区间,每个区间可以等概率的任选一个数,如果选的这个区间和它下个区间选的数的积是p的倍数的话(n的下个是1),就挣2000,问挣的期望 思路:整体的期望可以分成每对之间的期望 ...
- windows下virtualenv使用报错
virtualenv为python提供了一个独立的虚拟环境,使各种python依赖库的安装相互独立.在家里ubuntu上安装一切正常,但在公司的win7上安装总是报以下错误: "D:\Pro ...
- 【Java基础】基本类型的包装类作为参数传递是值传递还是引用传递
突然想到这个问题,然后做了下实验,下面以Integer来讲解,其他的忽略: import java.util.Iterator; /** * Created by lili on 15/9/24. * ...
- Linux概念架构的理解
摘要 Linux kernel成功的两个原因:(1)架构设计支持大量的志愿开发者加入到开发过程中:(2)每个子系统,尤其是那些需要改进的,都支持很好的扩展性.正式这两个原因使得Linux kernel ...
- 【荐】Redis学习资料汇总
Redis学习手册(目录) - Stephen_Liu - 博客园 Redis 命令参考 — Redis 命令参考 Redis_php 学习 - 简单--生活 - 博客园