SQL SERVER 開啟CDC 實操詳細


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

 


免責聲明!

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



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