一、什么是CDC?
變更數據捕獲(Change Data Capture ,簡稱 CDC)記錄 SQL Server 表的插入、更新和刪除活動。SQLServer的操作會寫日志,這也是CDC捕獲數據的來源。
開啟cdc的源表在插入、更新和刪除活動時會插入數據到日志表中。cdc通過捕獲進程將變更數據捕獲到變更表中,通過cdc提供的查詢函數,我們可以捕獲這部分數據。
二、開啟CDC
2.1、開啟CDC的必要條件
-
sqlserver 2008 以上版本
-
需要開啟代理服務(作業)
-
磁盤要有足夠的空間,保存日志文件
-
表必須要有主鍵或者是唯一索引
2.2、開啟數據庫CDC
1、 在需要開啟cdc的數據庫上執行腳本如下:
if exists(select 1 from sys.databases where name='db_name' and is_cdc_enabled=0) begin exec sys.sp_cdc_enable_db end
2、查詢數據庫的cdc開啟狀態
select is_cdc_enabled from sys.databases where name='db_name'
查詢結果為“1”,表示開啟成功。
2.3、開啟表CDC
*注意:表中必須有主鍵或者唯一索引
1、添加次要數據文件組及文件
數據庫右鍵“屬性” >> “文件組”>> ”添加”
“文件” >> “添加”
2、執行以下腳本,開啟表cdc
--CDC是數據庫文件組的名稱 IF EXISTS(SELECT 1 FROM sys.tables WHERE name='table_name' AND is_tracked_by_cdc = 0) BEGIN EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', -- source_schema @source_name = 'table_name', -- table_name @capture_instance = NULL, -- capture_instance @supports_net_changes = 1, -- supports_net_changes @role_name = NULL, -- role_name @index_name = NULL, -- index_name @captured_column_list = NULL, -- captured_column_list @filegroup_name = 'CDC' -- filegroup_name END
3、查看表cdc開啟狀態
SELECT is_tracked_by_cdc FROM sys.tables WHERE name='table_name'
查詢結果為“1”,表示開啟成功。
三、使用CDC
開啟cdc后會在數據庫中生成以下文件,開啟數據庫GY_DB,開啟表VW_GHZDK
下面我們會對部分表和函數進行說明
系統表:
cdc.change_tables:表開啟cdc后會插入一條數據到這張表中,記錄表一些基本信息
cdc.captured_columns:開啟cdc后的表,會記錄它們的字段信息到這張表中
cdc.dbo_VW_GHZDK_CT:記錄VW_GHZDK表中所有變更的數據,字段“__$operation”為“1”代表刪除,“2”代表插入,“3”執行更新操作前的值,“4”執行更新操作后的值。字段“__$start_lsn”由於更改是來源於數據庫的事務日志,所以這里會保存其事務日志的開始序列號(LSN)
函數:
cdc.fn_cdc_get_all_changes_dbo_VW_GHZDK:針對在指定日志序列號 (LSN) 范圍內應用到源表的每項更改均返回一行。如果源行在該間隔內有多項更改,則每項更改都會表示在返回的結果集中
cdc.fn_cdc_get_net_changes_dbo_VW_GHZDK:針對指定 LSN 范圍內每個已更改的源行返回一個凈更改行。也就是說,如果在 LSN 范圍內源行具有多項更改,則該函數將返回反映該行最終內容的單一行
sys.fn_cdc_map_time_to_lsn:為指定的時間返回 cdc.lsn_time_mapping 系統表中 start_lsn 列中的日志序列號 (LSN) 值。可以使用此函數系統地將日期時間范圍映射到基於 LSN 的范圍,以供變更數據捕獲枚舉函數 cdc.fn_cdc_get_all_changes_<capture_instance> 和 cdc.fn_cdc_get_net_changes_<capture_instance> 返回此范圍內的數據更改。
以上我只列出了部分經常使用的表和函數,如果想對其他內容有更深的了解,可以參考以下網址: