SQLSERVER|CDC日志變更捕獲機制


一、什么是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> 返回此范圍內的數據更改。

以上我只列出了部分經常使用的表和函數,如果想對其他內容有更深的了解,可以參考以下網址:

微軟官網

網友總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM