SQL Server 2008 CDC功能的主要作用是什么?
以下的文章主要向大家描述的是SQL Server 2008 CDC功能,我們大家都知道SQL Server 2008 CDC(Change Data Capture)其主要是通過對(duì)事務(wù)日志的異步讀取,記錄DML操作的發(fā)生時(shí)間、類型和實(shí)際影響的數(shù)據(jù)變化,然后將這些數(shù)據(jù)記錄到啟用CDC時(shí)自動(dòng)創(chuàng)建的表中。
通過SQL Server 2008 CDC相關(guān)的存儲(chǔ)過程,可以獲取詳細(xì)的數(shù)據(jù)變化情況。由于數(shù)據(jù)變化是異步讀取的,因此對(duì)整體性能的影響不大,遠(yuǎn)小于通過Trigger實(shí)現(xiàn)的數(shù)據(jù)變化記錄。
下面我用一個(gè)實(shí)例講解這個(gè)功能。該功能主要在ETL解決方案中比較有用。
- USE AdventureWorksDW;
- GO
- EXECUTE sys.sp_cdc_enable_db; --啟用數(shù)據(jù)庫對(duì)CDC的支持
- GO
- EXEC sys.sp_cdc_enable_table 'dbo',
- 'FactInternetSales', @role_name = NULL, @supports_net_changes =0; --啟用某個(gè)表對(duì)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;
這個(gè)表其實(shí)是在系統(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)建一個(gè)存儲(chǔ)過程,根據(jù)開始時(shí)間和結(jié)束時(shí)間讀取變更記錄
- 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)用該存儲(chǔ)過程
- 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
有朋友可能會(huì)問到:CDC到底是怎么做到的呢?
下面這篇文章很詳細(xì)地講解到了該原理
http://technet.microsoft.com/zh-cn/library/cc645937.aspx
我總結(jié)幾個(gè)重點(diǎn)
1. 其實(shí),它是有一個(gè)獨(dú)立的進(jìn)程的。它是異步地讀取日志文件。如果某部分更改沒有被進(jìn)程讀到,那么此時(shí)日志截?cái)嘁彩菦]有效果的,很顯然需要這樣來保證。
2. net_changes是什么意思呢?說的是針對(duì)一行記錄,如果有多個(gè)更改的話,那么以***的一條為準(zhǔn)。
3. 這個(gè)更改是不是會(huì)永遠(yuǎn)保存?不會(huì)的,它會(huì)定期清除的
捕獲和清除作業(yè)都是使用默認(rèn)參數(shù)創(chuàng)建的。將立即啟動(dòng)捕獲作業(yè)。它連續(xù)運(yùn)行,每個(gè)掃描周期最多可處理 1000 個(gè)事務(wù),并在兩個(gè)周期之間停頓 5 秒鐘。清除作業(yè)在每天凌晨 2 點(diǎn)運(yùn)行一次。它將更改表項(xiàng)保留三天(4320 分鐘),可使用單個(gè)刪除語句最多刪除 5000 項(xiàng)。
4. 如果啟用了之后,修改了表的結(jié)構(gòu),會(huì)怎么樣?
為適應(yīng)固定列結(jié)構(gòu)更改表,在為源表啟用變更數(shù)據(jù)捕獲后,負(fù)責(zé)填充更改表的捕獲進(jìn)程將忽略未指定進(jìn)行捕獲的任何新列。如果刪除了某個(gè)跟蹤的列,則會(huì)為在后續(xù)更改項(xiàng)中為該列提供 Null 值。
但是,如果現(xiàn)有列更改了其數(shù)據(jù)類型,則會(huì)將更改傳播到更改表,以確保捕獲機(jī)制沒有導(dǎo)致跟蹤的列發(fā)生數(shù)據(jù)丟失。捕獲進(jìn)程還會(huì)將檢測(cè)的跟蹤表列結(jié)構(gòu)的任何更改發(fā)送到 cdc.ddl_history 表。如果使用者希望得到下游應(yīng)用程序中可能需要進(jìn)行的調(diào)整的通知,請(qǐng)使用 sys.sp_cdc_get_ddl_history 存儲(chǔ)過程。
【編輯推薦】
- MS SQL Server問題與其正確解答方案
- SQL Server數(shù)據(jù)庫與指定范圍行的SQL語句的寫法
- SQL Server 數(shù)據(jù)導(dǎo)入的實(shí)際行為規(guī)范描述
- SQL Server 2000的安全策略的正確打造
- SQL Server DateTime數(shù)據(jù)類型的另類解讀