今天简单说一下cdc 的使用

从08开始,sql server 提供了一种叫做 变更数据捕获 cdc(Change Data Capture) 的功能,可以通过启用这个功能,来实现查看数据库中的表对象的数据的变化情况。(我感觉就是有点像sql server 自己提供的用户能直接看懂的数据变化功能)。

根据官方的说法。使用cdc 功能有以下好处

1、这是数据库自带的功能,无需额外的开发成本。

2、不需要改动表的结构,不需要动用到触发器,存储过程等手段去记录

3、性能开销最小化。(这个我也没有证实过╮(╯_╰)╭)

动用cdc 其实很简单

1、将数据库显示开启cdc 跟踪

EXEC sys.sp_cdc_enable_db

2、然后我创建一个表,并对其开启cdc。这里列出的是最简单的参数,跟踪还可以设置到具体捕获哪些列产生变化的。具体参照

sys.sp_cdc_enable_table : https://msdn.microsoft.com/zh-cn/library/bb522475(v=sql.120).aspx

CREATE TABLE AAA2
(
    ID INT PRIMARY KEY,
    Col1 NVARCHAR(50),
    Col2 INT
)

EXEC sys.sp_cdc_enable_table @source_schema = ‘dbo‘,
    @source_name = ‘AAA2‘

3、启动代理服务器。(不启动也可以使跟踪创建成功,但是就不工作而已)

4、然后我们能在系统表里面看到多了一个cdc 的架构然后框住的那个就是开启了AAA2的跟踪了。

5、然后就可以往AAA2 里面搞些操作,看下是否有效了~

INSERT INTO dbo.AAA2
        ( ID, Col1,Col2 )
VALUES  ( 1, ‘pp‘,34 ),( 2, ‘bb‘,234 ),( 3, ‘cc‘,12 )

UPDATE dbo.AAA2 SET Col1 = ‘dd‘
    WHERE ID = 3

DELETE FROM dbo.AAA2 WHERE ID = 2

SELECT * FROM cdc.dbo_AAA2_CT

__$start_lsn           __$end_lsn    __$seqval              __$operation __$update_mask       ID   Col1   Col2
---------------------- ------------- ---------------------- ------------ -------------------- ---- ------ -----------
0x0000015B0001378F0019 NULL          0x0000015B0001378F0016 2            0x07                 1    pp     34
0x0000015B0001378F0019 NULL          0x0000015B0001378F0017 2            0x07                 2    bb     234
0x0000015B0001378F0019 NULL          0x0000015B0001378F0018 2            0x07                 3    cc     12
0x0000015B000137A50003 NULL          0x0000015B000137A50002 3            0x02                 3    cc     12
0x0000015B000137A50003 NULL          0x0000015B000137A50002 4            0x02                 3    dd     12
0x0000015B000137AB0005 NULL          0x0000015B000137AB0002 1            0x07                 2    bb     234

有一个东东,启用的cdc ,意味着不能用truncate 了~会提示不能使用的哟~,至于查出来的结果基本都看懂吧?

有几个说明一下,

__$operation  : 1 删除 2 新增 3 修改(修改前的值) 4 修改(修改后的值)
__$update_mask :  表示那个列做了操作,02 就是0010 表示第二列 ,那07就是 0111 表示123列都做了修改罗~就酱~

6 看到这里都还是觉得这个功能好好是不是啊~但是我觉得还是有一点不方便的。比方说当你需要修改表结构的时候~

栗子1 ,删除了一列Col2 然后再插入2条数据,然后还是会存在Col2的列(因为不需要改结构嘛╮(╯_╰)╭),然后跟踪的时候把值设置成空

ALTER TABLE dbo.AAA2 DROP COLUMN Col2

INSERT INTO dbo.AAA2
        ( ID, Col1 )
VALUES  ( 4, N‘DD‘),( 5, N‘EE‘)

__$start_lsn    __$seqval    __$operation    __$update_mask    ID    Col1    Col2
0x0000015B000138F40004    0x0000015B000138F40002    2    0x07    4    DD    NULL
0x0000015B000138F40004    0x0000015B000138F40003    2    0x07    5    EE    NULL

栗子2 ,然后我脑抽的重新把Col2 加进去~然而我改成了字符串类型,然后从新插入数据 ,Col2 没值啊!!!那也正常,因为这是就结构,虽然名字一样,但是ColumnID已经不一样了啊!所以追踪不到是很正常的。

ALTER TABLE dbo.AAA2 ADD Col2 NVARCHAR(50)

INSERT INTO dbo.AAA2
        ( ID, Col1, Col2 )
VALUES  ( 6, -- ID - int
          N‘jj‘, -- Col1 - nvarchar(50)
          ‘jjj‘  -- Col2 - int
          )

__$start_lsn    __$seqval    __$operation    __$update_mask    ID    Col1    Col2
0x0000015B000138F40004    0x0000015B000138F40002    2    0x07    4    DD    NULL
0x0000015B000138F40004    0x0000015B000138F40003    2    0x07    5    EE    NULL
0x0000015B000139640003    0x0000015B000139640002    2    0x07    6    jj    NULL

栗子3 ,那我更新总可以了吧!当更新的是元结构有的列,是可以更新成功的,但是如果是新列做了改动,则捕获不了,正常嘛(想想既然可以给你配置可跟踪的列,那么不存在这个列表里面的列发生变化不捕捉,就是这个道理罗~)

UPDATE dbo.AAA2 SET Col2 = ‘ee‘ WHERE ID = 4
UPDATE dbo.AAA2 SET Col1 = ‘III‘ WHERE ID = 6

__$start_lsn    __$seqval    __$operation    __$update_mask    ID    Col1    Col2
0x0000015B000139C00003    0x0000015B000139C00002    4    0x02    6    III    NULL

那该如何处理这个问题呢~

从心做一个捕获实例~从心做一个捕获实例~从心做一个捕获实例 重要的事情说3便 ╮(╯_╰)╭。也只有这样罗

综上所述,cdc 我就描述到这里~有什么发现的话我会补充哒~

还是祝大家新年快乐~

时间: 2024-11-03 20:54:38

今天简单说一下cdc 的使用的相关文章

MFC的运行机制 以及 MFC中的DC、CDC、HDC、句柄、设备上下文 [转]

在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API.你说你喜欢C++而MFC换一种说法就是一个用C++写的一个函数库 然后你来调用 只不过这个类不是你写的 MFC提供数百个类,最重要的.也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石. 1>封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库.这些类封装W

【转载】COM 组件设计与应用(四)——简单调用组件

原文:http://vckbase.com/index.php/wv/1211.html 一.前言 同志们.朋友们.各位领导,大家好. VCKBASE 不得了, 网友众多文章好. 组件设计怎么学? 知识库里闷头找! 摘自---杨老师打油集录 在 VCKBASE 的顶力支持下,在各位网友回帖的鼓励下,我才能顺利完成系列论文的前三回.书到本回,我们终于开始写代码啦.写点啥那?恩,有了!咱们先从如何调用现成的简单的组件开始吧,同时也顺便介绍一些相关的知识. 二.组件的启动和释放 在第三回中,大家用“小

Data Flow ->> CDC Control Task, CDC Source, CDC Splitter

CDC Control Task可以从控制CDC数据同步,比如初始化加载.LSN范围的管理.它可以代替另一种做法,就是通过调用一批CDC函数来完成同样的事情.从SSIS的角度来完成,事情编程简单,和另外两个空间配合起来(CDC Source,和CDC Splitter),仅需配置一些控件参数便可以完成整个数据抽取过程. CDC Source从启用了CDC的数据表中查询数据 CDC Splitter和Conditional Split组件功能相似.它生成三个数据流分支:Inserts, Updat

VC/MFC的HDC,CDC,CWindowDC,CClientDC,CPaintDC详解:

首先说一下什么是DC(设备描述表) 解:Windows应用程序通过为指定设备(屏幕,打印机等)创建一个设备描述表(Device Context, DC)在DC表示的逻辑意义的“画布”上进行图形的绘制.DC是一种包含设备信息的数据结构,它包含了物理设备所需的各种状态信息.Win32程序在绘制 图形之前需要获取DC的句柄HDC,并在不继续使用时释放掉. 在c++ 编程中常会见到HDC,CDC,CClientDC,CPaintDC,CWindowDC这样的类 HDC是DC的句柄,API中的一个类似指针

[MFC] 梳理一个简单的图片处理桌面软件中用到的MFC控件技巧

 前言 前些天应好友之拖,帮忙设计一个简单的图像处理的小软件.朋友把核心算法封装好了,但是是用openCV类似于console的编程环境,要我在此基础上改成MFC桌面程序.下图是做成之后的效果: 我是两年前稍微学了点MFC的知识,这两年中基本没有涉及,因为诸多相同的需求都可以用C#来搞定.这个本来也是想用C#来弄,可是我朋友用了openCV的相关函数封装了核心的“美颜算法”,我就只好重温经典了! 本文只涉及开发该小软件中与MFC控件相关的操作技巧,不提供朋友的“美颜算法”,还请各位见谅! 工程中

Oracle Data Integrator 12c----简单CDC(Simple CDC)

Simple CDC最简单的一种 CDC.在这里,每一张 CDC 的表的变化都是独立捕获的,不需要考虑多张存在主外键引用关系的表之间的数据一致性. 1 环境准备 源表:ODI_SRC.DEPT 目标表:ODI_TAG.DEPT 配置拓扑结构见ODI Studio拓扑结构的创建与配置(Oracle) 模型反向工程见:Oracle Data Integrator 12c-模型(Model)和 数据存储(DataStore) 2导入并配置JKM 首先在项目中导入 JKM JKM Oracle Simp

PIC32MZ 通过USB在线升级 -- USB CDC bootloader

了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 最近给我的开发板PIC32MZ EC starter kit写了个USB 在线升级程序--USB CDC bootloader.有了它,我可以很方便的升级我的应用程序.我大概是一个星期前开始决定写这个USB在线升级程序的,USB 有很两种类型,USB host和USB device. 由于USB host接触不多,所以我

Oracle Data Integrator 12c----一致性 CDC(Consistent CDC)

一致性 CDC 中引入了变化集的概念.一个变化集中可以包括多个相互存在关联关系(如主外键引用关系)的表.CDC 在捕获和发布一个变化集中的变化时能够保证数据的一致性.这个练习介绍如何使用能够保证一致性的CDC. 1 环境准备 源表:ODI_SRC.DEPT,ODI_SRC.EMP 目标表:ODI_TAG.DEPT, ODI_TAG.EMP 配置拓扑结构见ODI Studio拓扑结构的创建与配置(Oracle) 模型反向工程见:Oracle Data Integrator 12c-模型(Model

CDC问题的解决方案总结

CDC(不同时钟之间传数据)问题是ASIC/FPGA设计中最头疼的问题.CDC本身又分为同步时钟域和异步时钟域.这里要注意,同步时钟域是指时钟频率和相位具有一定关系的时钟域,并非一定只有频率和相位相同的时钟才是同步时钟域.异步时钟域的两个时钟则没有任何关系.这里假设数据由clk1传向clk2. 单bit传输时,同步时钟域因为频率和相位关系都是已知的,可以推导的,所以不需要采用额外的硬件电路就可以解决CDC问题,只需要源数据在clk1端保持足够长时间即可.让其保持足够长时间有两个好处:即便出现亚稳