what CDC?
變更數據捕獲(Change Data Capture ,簡稱 CDC)記錄 SQL Server 表的插入、更新和刪除活動。SQLServer的操作會寫日志,這也是CDC捕獲數據的來源。
開啟CDC檢測
1.開啟的必要條件
-
- sqlsever 2008以上版本
- 需要開啟代理服務(作業)
- 磁盤要有足夠的空間,保存日志文件
- 表必須要有主鍵或者是唯一索引
2.開啟數據庫CDC
2.1、查詢數據庫的CDC查詢狀態(db_name:數據庫名)
select is_cdc_enabled from sys.databases where name='db_name'
查詢結果為“1”,表示開啟成功
--開啟SQL server agent服務 sp_configure 'show advanced options', 1; GO -- 2.1.1 RECONFIGURE; GO -- 2.1.2 sp_configure 'Agent XPs', 1; GO -- 2.1.3 RECONFIGURE GO -- 2.1.4
2.2、開啟、關閉數據庫CDC
1 --開啟數據庫CDC 2 if exists(select 1 from sys.databases where name='HospitalInterfaceDb' and is_cdc_enabled=0) 3 begin 4 exec sys.sp_cdc_enable_db--開啟數據庫CDC 5 END 6 7 -- 關閉數據庫CDC 8 EXEC sys.sp_cdc_disable_db
2.3、 開啟表CDC *注意:表中必須有主鍵或者唯一索引
--添加CDC專用的文件組和文件 -- 2.3.1 查詢dbname庫的物理文件 SELECT name, physical_name FROM sys.master_files WHERE database_id = DB_ID('db_name'); ALTER DATABASE db_name ADD FILEGROUP CDC1; -- 2.3.2 為該庫添加名為CDC1的文件組 ALTER DATABASE db_name ADD FILE ( NAME= 'HospitalInterfaceDb_CDC1', FILENAME = 'C:\WorkFIles\MSSQL_CDC\HospitalInterfaceDb_CDC1.ndf' ) TO FILEGROUP CDC1; -- 2.3.3 將新增文件,並映射到文件組。重復2.3.1查詢操作
1 --操作開啟表CDC 2 IF EXISTS(SELECT 1 FROM sys.tables WHERE name='table_name' AND is_tracked_by_cdc = 0) 3 BEGIN 4 EXEC sys.sp_cdc_enable_table 5 @source_schema = 'dbo', -- source_schema 6 @source_name = 'table_name', -- table_name 7 @capture_instance = 'test_instance', -- capture_instance 8 @supports_net_changes = 1, -- supports_net_changes 9 @role_name = NULL, -- role_name 10 @index_name = NULL, -- index_name 11 @captured_column_list = NULL, -- captured_column_list 12 @filegroup_name = 'CDC1' -- filegroup_name 13 END; -- 開啟表級別CDC
1 --查看表開啟CDC狀態 2 select name, is_tracked_by_cdc from sys.tables where object_id = OBJECT_ID('table_name')
2.5 、開啟成功之后 會存在對應的作業和函數
系統表:
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> 返回此范圍內的數據更改。