• 今天简单说一下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 我就描述到这里~有什么发现的话我会补充哒~

    还是祝大家新年快乐~

  • 相关阅读:
    [小技巧]记录PHP错误日志
    PHP __autoload函数(自动载入类文件)的使用方法
    php5.3以前的版本安装出现Fatal error: Call to undefined function mysql_connect()
    mysqlnoinstall5.1.62win32 安装
    [php]PHP错误处理
    哈希表1
    哈希表2
    WinSock編程的多線程式控制
    编码转换 unicode gbk big5
    Parameters转换为Variant数组
  • 原文地址:https://www.cnblogs.com/Gin-23333/p/5190645.html
Copyright © 2020-2023  润新知