SQL Server 2008 CDC功能的主要作用是什么?
以下的文章主要向大家描述的是SQL Server 2008 CDC功能,我們大家都知道SQL Server 2008 CDC(Change Data Capture)其主要是通過對事務(wù)日志的異步讀取,記錄DML操作的發(fā)生時間、類型和實際影響的數(shù)據(jù)變化,然后將這些數(shù)據(jù)記錄到啟用CDC時自動創(chuàng)建的表中。
通過SQL Server 2008 CDC相關(guān)的存儲過程,可以獲取詳細的數(shù)據(jù)變化情況。由于數(shù)據(jù)變化是異步讀取的,因此對整體性能的影響不大,遠小于通過Trigger實現(xiàn)的數(shù)據(jù)變化記錄。
下面我用一個實例講解這個功能。該功能主要在ETL解決方案中比較有用。
- USE AdventureWorksDW;
- GO
- EXECUTE sys.sp_cdc_enable_db; --啟用數(shù)據(jù)庫對CDC的支持
- GO
- EXEC sys.sp_cdc_enable_table 'dbo',
- 'FactInternetSales', @role_name = NULL, @supports_net_changes =0; --啟用某個表對CDC的支持
- GO
這里的supports_net_changes指的是是否支持所謂的凈更改,即過濾掉重復(fù)的
- SELECT name, is_tracked_by_cdc FROM sys.tables
- WHERE name LIKE ('fact%');
- INSERT INTO FactInternetSales
- VALUES(484,1127,1139,1134,18759,1,100,6,'SO75124',1,1,1,21.9800,21.9800,0,0,8.2205,8.2205,21.9800,1.7584,0.5495,NULL,NULL);
- INSERT INTO FactInternetSales
- VALUES(486,1127,1139,1134,18759,1,100,6,'SO75125',1,1,1,21.9800,21.9800,0,0,8.2205,8.2205,21.9800,1.7584,0.5495,NULL,NULL);
- UPDATE FactInternetSales
- SET PromotionKey = 2
- WHERE SalesOrderNumber = 'SO75124';
- DELETE FROM FactInternetSales WHERE SalesOrderNumber='SO75125'
- SELECT * FROM cdc.dbo_FactInternetSales_CT;
這個表其實是在系統(tǒng)表里面
這里將看到4條結(jié)果,其中operation為3和4是update操作的那條,3表示舊值,4表示新值
2表示新增
1表示刪除
- DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
- -- Obtain the beginning of the time interval.
- SET @begin_time = GETDATE()-1;
- SET @end_time = GETDATE();
- -- Map the time interval to a change data capture query range.
- SELECT @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
- SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
- print @begin_time
- print @end_time
- print @from_lsn
- print @to_lsn
創(chuàng)建一個存儲過程,根據(jù)開始時間和結(jié)束時間讀取變更記錄
- CREATE PROC GetCDCResult
- (@begin_time DATETIME,@end_time DATETIME)
- AS
- DECLARE @from_lsn binary(10), @to_lsn binary(10);
- SELECT @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
- SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
- SELECT * FROM cdc.dbo_FactInternetSales_CT WHERE __$start_lsn BETWEEN @from_lsn AND @to_lsn
調(diào)用該存儲過程
- EXEC GetCDCResult '2009-4-27','2009-4-29'
撤銷SQL Server 2008 CDC
- EXEC sys.sp_cdc_disable_table 'dbo',
- 'FactInternetSales','All'
- EXEC sys.sp_cdc_disable_db
有朋友可能會問到:CDC到底是怎么做到的呢?
下面這篇文章很詳細地講解到了該原理
http://technet.microsoft.com/zh-cn/library/cc645937.aspx
我總結(jié)幾個重點
1. 其實,它是有一個獨立的進程的。它是異步地讀取日志文件。如果某部分更改沒有被進程讀到,那么此時日志截斷也是沒有效果的,很顯然需要這樣來保證。
2. net_changes是什么意思呢?說的是針對一行記錄,如果有多個更改的話,那么以***的一條為準(zhǔn)。
3. 這個更改是不是會永遠保存?不會的,它會定期清除的
捕獲和清除作業(yè)都是使用默認(rèn)參數(shù)創(chuàng)建的。將立即啟動捕獲作業(yè)。它連續(xù)運行,每個掃描周期最多可處理 1000 個事務(wù),并在兩個周期之間停頓 5 秒鐘。清除作業(yè)在每天凌晨 2 點運行一次。它將更改表項保留三天(4320 分鐘),可使用單個刪除語句最多刪除 5000 項。
4. 如果啟用了之后,修改了表的結(jié)構(gòu),會怎么樣?
為適應(yīng)固定列結(jié)構(gòu)更改表,在為源表啟用變更數(shù)據(jù)捕獲后,負(fù)責(zé)填充更改表的捕獲進程將忽略未指定進行捕獲的任何新列。如果刪除了某個跟蹤的列,則會為在后續(xù)更改項中為該列提供 Null 值。
但是,如果現(xiàn)有列更改了其數(shù)據(jù)類型,則會將更改傳播到更改表,以確保捕獲機制沒有導(dǎo)致跟蹤的列發(fā)生數(shù)據(jù)丟失。捕獲進程還會將檢測的跟蹤表列結(jié)構(gòu)的任何更改發(fā)送到 cdc.ddl_history 表。如果使用者希望得到下游應(yīng)用程序中可能需要進行的調(diào)整的通知,請使用 sys.sp_cdc_get_ddl_history 存儲過程。
【編輯推薦】
- MS SQL Server問題與其正確解答方案
- SQL Server數(shù)據(jù)庫與指定范圍行的SQL語句的寫法
- SQL Server 數(shù)據(jù)導(dǎo)入的實際行為規(guī)范描述
- SQL Server 2000的安全策略的正確打造
- SQL Server DateTime數(shù)據(jù)類型的另類解讀