一. CDC(Change Data Capture)原理
異步讀取事務日誌,記錄DML操作發生的時間,類型和實際影響的數據變化,然後將這些數據記錄到啓用CDC時自動創建的表中。
二. 對比Trigger方式的實現
由於是異步讀取的,因此對整體性能的影響不大,遠小於通過Trigger實現的數據變化記錄;
三. 應用方法
1. 數據庫啓用CDC
Use test
EXEC sys.sp_cdc_enable_db;
2. 啓用Agent
3. 表啓用CDC
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'tb', --跟蹤的表名
@capture_instance = N'dbo_tb_col', --本跟蹤的名字
@role_name = NULL,
@captured_column_list = N'id,col1,col2'; --需要跟蹤的列,如果不設置,則表示跟蹤所有列
4. 啓用CDC後,會創建的一些系統表
(1)cdc.captured_columns 記錄所有要跟蹤的列
(2)cdc.change_tables 創建了跟蹤的表
(3)cdc.<capture_instance>_CT 實際記錄變更的表,每建立一個跟蹤,就會自動生成一張對應的表
列名
|
描述
|
__$start_lsn
|
數據變動所屬的LSN
|
__$end_lsn
|
2012後才支持,2008中爲NULL
|
__$seqval
|
表示該變動,是事務中第幾行改動
|
__$operation
|
1 = delete
2 = insert
3 = update (old values) Column data has row values before executing the update statement.
4 = update (new values) Column data has row values after executing the update statement.
|
__$update_mask
|
表示某列是否改動過,對應bit爲1則有變動
|
所有要跟蹤的列
|
例如,該表有5個要跟蹤的列,那麼就有5列
|
(4)cdc.ddl_history 記錄DDL操作
(5)cdc.lsn_time_mapping LSN及時間對應表
5. CDC是通過Agent實現的,因此在代理中會看到創建的作業
6. 主要的幾個相關係統函數
(1)sys.fn_cdc_get_min_lsn( 'capture_instance_name' )
sys.fn_cdc_get_max_lsn( 'capture_instance_name' ) 返回要跟蹤的表的最大,最小 start_lsn 值
(2)cdc.fn_cdc_get_all_changes_<capture_instance> ( from_lsn , to_lsn , '<row_filter_option>' ) 每一個變動返回一行
(3)cdc.fn_cdc_get_net_changes_<capture_instance> ( from_lsn , to_lsn , '<row_filter_option>' ) 每一行變動返回一行