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