SQL SERVER 開啟CDC 實操詳細

1. 環境檢查

1.1 版本檢查

SELECT @@VERSION;


Microsoft SQL Server 2016 (SP2-GDR)

1.2 檢查CDC服務開啟狀態

select is_cdc_enabled from sys.databases where name='dbname';
--0為關閉,1為開啟。數據庫名為dbname

2. 開啟CDC

2.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功能

ALTER AUTHORIZATION ON DATABASE::[dbname] TO [sa];
-- 2.2.1 變更為sa的權限,數據庫名為dbname
if exists(select 1 from sys.databases where name='dbname' and is_cdc_enabled=0)
begin
    exec sys.sp_cdc_enable_db
end
;
-- 2.2.2 開啟語句
select is_cdc_enabled from sys.databases where name='dbname';
-- 2.2.3 檢查是否開啟成功,為1則開啟
/* -- 本段註釋可不看
或者
USE ERP
GO  
-- 開啟:
EXEC sys.sp_cdc_enable_db  
-- 關閉:
EXEC sys.sp_cdc_disable_db
GO  
 
註釋: 如果在禁用變更數據捕獲時為數據庫定義瞭很多捕獲實例,則長時間運行事務可能導致 sys.sp_cdc_disable_db 的執行失敗。
通過在運行 sys.sp_cdc_disable_db 之前使用 sys.sp_cdc_disable_table 禁用單個捕獲實例,可以避免此問題。
 
示例:
 
USE AdventureWorks2012; 
GO 
EXECUTE sys.sp_cdc_disable_table 
@source_schema = N'HumanResources', 
@source_name = N'Employee', 
@capture_instance = N'HumanResources_Employee';
*/


2.3 添加CDC專用的文件組和文件

SELECT name, physical_name FROM sys.master_files WHERE database_id = DB_ID('dbname');
-- 2.3.1 查詢dbname庫的物理文件
ALTER DATABASE dbname ADD FILEGROUP CDC1;
-- 2.3.2 為該庫添加名為CDC1的文件組
ALTER DATABASE dbname
ADD FILE
(
  NAME= 'dbname_CDC1',
  FILENAME = 'D:\DATA\dbname_CDC1.ndf'
)
TO FILEGROUP CDC1;
-- 2.3.3 將新增文件,並映射到文件組。重復2.3.1查詢操作


2.4 開啟表級別CDC

SELECT name,is_tracked_by_cdc FROM sys.tables WHERE  is_tracked_by_cdc = 0;
-- 2.4.1 查詢未開啟的表
IF EXISTS(SELECT 1 FROM sys.tables WHERE name='AccountBase' AND is_tracked_by_cdc = 0)
BEGIN
    EXEC sys.sp_cdc_enable_table
        @source_schema = 'dbo', -- source_schema
        @source_name = 'AccountBase', -- 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 = 'CDC1' -- filegroup_name
END;
-- 2.4.2 為dbname.dbo.AccountBase開啟表級別CDC,文件組為CDC1
DECLARE @tableName nvarchar(36)  -- 聲明變量
DECLARE My_Cursor CURSOR --定義遊標
    FOR (SELECT 'new_srv_workorderBase' name
union select 'tablename1'
union select 'tablename2'
union select 'tablename3'
 ) --查出需要的集合放到遊標中
OPEN My_Cursor; --打開遊標
FETCH NEXT FROM My_Cursor INTO @tableName;
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sys.sp_cdc_enable_table
         @source_schema = 'dbo', -- source_schema
         @source_name = @tableName, -- 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 = 'CDC1' -- filegroup_name;
    FETCH NEXT FROM My_Cursor INTO @tableName;
END
CLOSE My_Cursor; --關閉遊標
DEALLOCATE My_Cursor; --釋放遊標
-- 2.4.3 遊標批量開啟表
SELECT name,is_tracked_by_cdc FROM sys.tables WHERE  is_tracked_by_cdc = 1 ORDER BY NAME;
-- 2.4.4 查詢已開啟的表


2.5 單表開啟測試范例(僅供參考,可略過)

create table test_hht
(id varchar(36) not null primary key,
city_name varchar(20),
userid bigint,
useramount decimal(18,6),
ismaster bit,
createtime datetime default getdate()); -- 測試表test_hht
IF EXISTS(SELECT 1 FROM sys.tables WHERE name='test_hht' AND is_tracked_by_cdc = 0)
BEGIN
    EXEC sys.sp_cdc_enable_table
        @source_schema = 'dbo', -- source_schema
        @source_name = 'test_hht', -- 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 = 'CDC1' -- filegroup_name
END; -- 開啟表級別CDC
insert into test_hht(id,city_name,userid,useramount,ismaster)values('1','wuhan',     10,1000.25,1);
insert into test_hht(id,city_name,userid,useramount,ismaster)values('1A','xiangyang',11,11000.35,0);
insert into test_hht(id,city_name,userid,useramount,ismaster)values('1B','yichang',  12,12000.45,0); -- 插入數據測試
select *  from dbname.dbo.test_hht; -- 數據表
SELECT * FROM [cdc].[dbo_test_hht_CT]; -- CDC日志表

2.6 開啟成功說明

dbname庫出現cdc模式,並有CT系列表。

/*
cdc.<capture_instance>_CT   可以看到,這樣命名的表,是用於記錄源表更改的表。

對於insert/delete操作,會有對應的一行記錄,而對於update,會有兩行記錄。
對於__$operation列:1 = 刪除、2= 插入、3= 更新(舊值)、4= 更新(新值)
對於__$start_lsn列:由於更改是來源與數據庫的事務日志,所以這裡會保存其事務日志的開始序列號(LSN)
*/

2.7 DDL操作:DDL操作需要重新收集表的信息(以測試表test_hht為例)

alter  table test_hht add   product_count decimal(18,2);
-- 2.7.1 增加新的一列測試
insert into test_hht(id,city_name,userid,useramount,ismaster,product_count)values('2','wuhan',     20,2000.25,1,2.5);
-- 2.7.2 插入數據測試
SELECT * FROM [cdc].[dbo_test_hht_CT];
-- 2.7.3 CT表無新的一列,CDC正常捕獲到之前的列變化
EXEC sys.sp_cdc_enable_table
@source_schema = 'dbo'
,@source_name = 'test_hht'
,@capture_instance ='dbo_test_hht_v2' -- 給一個新的名字
,@supports_net_changes = 1
,@role_name = NULL
,@index_name = NULL
,@captured_column_list = NULL
,@filegroup_name = 'CDC1';
-- 2.7.4 為表dbo.test_hht開啟一個新的CDC捕獲
insert into test_hht(id,city_name,userid,useramount,ismaster,product_count)values('2A','xiangyang',21,121000.35,0,12.5);
-- 2.7.5 插入數據測試
EXEC sys.sp_cdc_disable_table @source_schema = 'dbo',@source_name = 'test_hht', @capture_instance = 'dbo_test_hht';
-- 2.7.6 SQL SERVER最多允許兩個捕獲表,所以多次改變時需要先禁用之前的表

3. 關閉CDC

EXEC sys.sp_cdc_enable_table
@source_schema = 'dbo'
,@source_name = 'test_hht'
,@capture_instance ='dbo_test_hht_v2'
-- 3.1 單表禁用
USE dbname
GO
EXEC sys.sp_cdc_disable_db
GO
-- 3.2 全庫禁用(禁用後cdc的模式消失)

到此這篇關於SQL SERVER CDC開啟實操詳細的文章就介紹到這瞭,更多相關SQL SERVER CDC開啟實操內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: