SQL SERVER 開(kāi)啟CDC 實(shí)操詳細(xì)
1. 環(huán)境檢查
1.1 版本檢查
SELECT @@VERSION;
Microsoft SQL Server 2016 (SP2-GDR)
1.2 檢查CDC服務(wù)開(kāi)啟狀態(tài)
select is_cdc_enabled from sys.databases where name='dbname'; --0為關(guān)閉,1為開(kāi)啟。數(shù)據(jù)庫(kù)名為dbname
2. 開(kāi)啟CDC
2.1 開(kāi)啟SQL server agent服務(wù)
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 開(kāi)啟數(shù)據(jù)庫(kù)級(jí)別的CDC功能
ALTER AUTHORIZATION ON DATABASE::[dbname] TO [sa];
-- 2.2.1 變更為sa的權(quán)限,數(shù)據(jù)庫(kù)名為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 開(kāi)啟語(yǔ)句
select is_cdc_enabled from sys.databases where name='dbname';
-- 2.2.3 檢查是否開(kāi)啟成功,為1則開(kāi)啟
/* -- 本段注釋可不看
或者
USE ERP
GO
-- 開(kāi)啟:
EXEC sys.sp_cdc_enable_db
-- 關(guān)閉:
EXEC sys.sp_cdc_disable_db
GO
注釋?zhuān)?如果在禁用變更數(shù)據(jù)捕獲時(shí)為數(shù)據(jù)庫(kù)定義了很多捕獲實(shí)例,則長(zhǎng)時(shí)間運(yùn)行事務(wù)可能導(dǎo)致 sys.sp_cdc_disable_db 的執(zhí)行失敗。
通過(guò)在運(yùn)行 sys.sp_cdc_disable_db 之前使用 sys.sp_cdc_disable_table 禁用單個(gè)捕獲實(shí)例,可以避免此問(wèn)題。
示例:
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專(zhuān)用的文件組和文件
SELECT name, physical_name FROM sys.master_files WHERE database_id = DB_ID('dbname');
-- 2.3.1 查詢(xún)dbname庫(kù)的物理文件
ALTER DATABASE dbname ADD FILEGROUP CDC1;
-- 2.3.2 為該庫(kù)添加名為CDC1的文件組
ALTER DATABASE dbname
ADD FILE
(
NAME= 'dbname_CDC1',
FILENAME = 'D:\DATA\dbname_CDC1.ndf'
)
TO FILEGROUP CDC1;
-- 2.3.3 將新增文件,并映射到文件組。重復(fù)2.3.1查詢(xún)操作
2.4 開(kāi)啟表級(jí)別CDC
SELECT name,is_tracked_by_cdc FROM sys.tables WHERE is_tracked_by_cdc = 0;
-- 2.4.1 查詢(xún)未開(kāi)啟的表
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開(kāi)啟表級(jí)別CDC,文件組為CDC1
DECLARE @tableName nvarchar(36) -- 聲明變量
DECLARE My_Cursor CURSOR --定義游標(biāo)
FOR (SELECT 'new_srv_workorderBase' name
union select 'tablename1'
union select 'tablename2'
union select 'tablename3'
) --查出需要的集合放到游標(biāo)中
OPEN My_Cursor; --打開(kāi)游標(biāo)
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; --關(guān)閉游標(biāo)
DEALLOCATE My_Cursor; --釋放游標(biāo)
-- 2.4.3 游標(biāo)批量開(kāi)啟表
SELECT name,is_tracked_by_cdc FROM sys.tables WHERE is_tracked_by_cdc = 1 ORDER BY NAME;
-- 2.4.4 查詢(xún)已開(kāi)啟的表
2.5 單表開(kāi)啟測(cè)試范例(僅供參考,可略過(guò))
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()); -- 測(cè)試表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; -- 開(kāi)啟表級(jí)別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); -- 插入數(shù)據(jù)測(cè)試
select * from dbname.dbo.test_hht; -- 數(shù)據(jù)表
SELECT * FROM [cdc].[dbo_test_hht_CT]; -- CDC日志表
2.6 開(kāi)啟成功說(shuō)明
dbname庫(kù)出現(xiàn)cdc模式,并有CT系列表。
/* cdc.<capture_instance>_CT 可以看到,這樣命名的表,是用于記錄源表更改的表。 對(duì)于insert/delete操作,會(huì)有對(duì)應(yīng)的一行記錄,而對(duì)于update,會(huì)有兩行記錄。 對(duì)于__$operation列:1 = 刪除、2= 插入、3= 更新(舊值)、4= 更新(新值) 對(duì)于__$start_lsn列:由于更改是來(lái)源與數(shù)據(jù)庫(kù)的事務(wù)日志,所以這里會(huì)保存其事務(wù)日志的開(kāi)始序列號(hào)(LSN) */
2.7 DDL操作:DDL操作需要重新收集表的信息(以測(cè)試表test_hht為例)
alter table test_hht add product_count decimal(18,2);
-- 2.7.1 增加新的一列測(cè)試
insert into test_hht(id,city_name,userid,useramount,ismaster,product_count)values('2','wuhan', 20,2000.25,1,2.5);
-- 2.7.2 插入數(shù)據(jù)測(cè)試
SELECT * FROM [cdc].[dbo_test_hht_CT];
-- 2.7.3 CT表無(wú)新的一列,CDC正常捕獲到之前的列變化
EXEC sys.sp_cdc_enable_table
@source_schema = 'dbo'
,@source_name = 'test_hht'
,@capture_instance ='dbo_test_hht_v2' -- 給一個(gè)新的名字
,@supports_net_changes = 1
,@role_name = NULL
,@index_name = NULL
,@captured_column_list = NULL
,@filegroup_name = 'CDC1';
-- 2.7.4 為表dbo.test_hht開(kāi)啟一個(gè)新的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 插入數(shù)據(jù)測(cè)試
EXEC sys.sp_cdc_disable_table @source_schema = 'dbo',@source_name = 'test_hht', @capture_instance = 'dbo_test_hht';
-- 2.7.6 SQL SERVER最多允許兩個(gè)捕獲表,所以多次改變時(shí)需要先禁用之前的表
3. 關(guān)閉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 全庫(kù)禁用(禁用后cdc的模式消失)
到此這篇關(guān)于SQL SERVER CDC開(kāi)啟實(shí)操詳細(xì)的文章就介紹到這了,更多相關(guān)SQL SERVER CDC開(kāi)啟實(shí)操內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sqlserver 日志恢復(fù)方法(搞定drop和truncate)
這是一次數(shù)據(jù)恢復(fù)中,我們老大在Sql中敲的,我這里最想記錄的是他優(yōu)良的代碼風(fēng)格.2009-10-10
圖解SSIS批量導(dǎo)入Excel文件的實(shí)現(xiàn)方法
本篇文章是對(duì)SSIS批量導(dǎo)入Excel文件的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
小系統(tǒng)單據(jù)自動(dòng)生成存儲(chǔ)過(guò)程
此處判斷有兩種方法:一種是根據(jù)傳入6位日期判斷;另一種根據(jù)單據(jù)創(chuàng)建日期字段(前提:表有創(chuàng)建時(shí)間字段)2010-07-07
SQL基礎(chǔ)查詢(xún)和LINQ集成化查詢(xún)
本文詳細(xì)講解了SQL基礎(chǔ)查詢(xún)和LINQ集成化查詢(xún),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
sql查詢(xún)一個(gè)數(shù)組中是否包含某個(gè)內(nèi)容find_in_set問(wèn)題
這篇文章主要介紹了sql查詢(xún)一個(gè)數(shù)組中是否包含某個(gè)內(nèi)容find_in_set問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
詳解SQL Server的簡(jiǎn)單查詢(xún)語(yǔ)句
本篇文章詳細(xì)講解了SQL ServerSQL的簡(jiǎn)單查詢(xún)語(yǔ)句。圖文并茂,方便大家理解與學(xué)習(xí)。有興趣的朋友可以看下2016-12-12
SQL Server 2005作業(yè)設(shè)置定時(shí)任務(wù)
這篇文章主要介紹了SQL Server 2005作業(yè)設(shè)置定時(shí)任務(wù)的相關(guān)詳細(xì)步驟,需要的朋友可以參考下2017-01-01
數(shù)據(jù)庫(kù)性能優(yōu)化一:數(shù)據(jù)庫(kù)自身優(yōu)化提升性能
數(shù)據(jù)庫(kù)自身優(yōu)化包括:增加次數(shù)據(jù)文件,設(shè)置文件自動(dòng)增長(zhǎng)、表分區(qū),索引分區(qū)、分布式數(shù)據(jù)庫(kù)設(shè)計(jì)、整理數(shù)據(jù)庫(kù)碎片等等.需要了解的朋友可以參考下2013-01-01

