SQL Server 2008推出了一個新的特性叫做變化數據捕獲(CDC)。CDC捕獲在一個SQL Server表上的DDL和DML活動,並將變化放置在一個單獨的SQL Server關系表中。在這篇文章中,我們將看到CDC怎樣幫助數據庫管理員跟蹤用於SQL Server 表的DML變化。CDC特性默認情況下是在數據庫級別關閉的。Sysadmin服務器角色的一個成員必須使一個數據庫可用於CDC。當這個數據庫可用於CDC時,任何dbo固定數據庫角色的成員都可以使數據庫中的表用於變化數據捕獲。
變化數據捕獲概覽
當CDC可用在數據庫級別時,下一步是使CDC可用於一個需要捕獲變化的特定表。CDC特性集合了從數據庫事務日志文件獲得的變化數據,並將變化信息插入到一個關聯的變化表中,它是在CDC建立和配置過程中創建的。在源表和變化捕獲表之間有一個一對一的關系。你對一個單獨的源表最多可以有兩個變化表。因為CDC特性需要不斷地讀取事務日志文件,所以顯而易見,CDC運行SQL Server代理應該一直執行的。
怎樣使一個SQL Server 2008數據庫可以使用CDC
1. 使用SQL Server管理套件連接到SQL Server 2008實例。
2. 在查詢窗口中,輸入下面的TSQL查詢來創建一個ChangeDataCapture 數據庫。
Use Master
Go
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'ChangeDataCapture')
DROP DATABASE ChangeDataCapture
GO
USE [master]
GO
Create Database ChangeDataCapture
Go
3. 當這個數據庫成功創建之後,你需要使這個數據庫可以使用數據捕獲特性,這可以通過執行下面的TSQL查詢來實現:
Use ChangeDataCapture
Go
EXEC sys.sp_cdc_enable_db
Go
4. 執行下面的查詢來檢查這個數據庫是否可用於CDC:
Select [name] as DBName, is_cdc_enabled from sys.databases
is_cdc_enabled 字段的值為1代表這個數據庫可用於CDC,而0意味著CDC不可用。
5. 當數據庫可用於CDC時,你就可以看到在ChangeDataCapture數據庫中創建的新cdc schema、cdc用戶、新的元數據表和其它系統對象。當使得CDC可用在一個數據庫時,數據庫管理員要時刻牢記的最重要的事情是確保這個數據庫在配置CDC之前沒有cdc schema或cdc用戶。如果在這個數據庫中有cdc schema或cdc用戶,那麼CDC的配置將會失敗,所以數據庫管理員需要在配置CDC之前從數據庫中刪除或重命名之前存在的cdc schema或用戶。
怎樣為一個SQL Server 2008數據庫表配置CDC
1. 現在讓我們執行下面的TSQL查詢在ChangeDataCapture數據庫中創建Currency表:
Use ChangeDataCapture
Go
Create table Currency
(
CurrencyKey Int Identity(1,1) Primary Key NOT NULL,
CurrencyAlternateKey varchar(5)
)
2. 當Currency表成功創建之後,你需要確保SQL Server 代理服務正在運行。為了使CDC成功,SQL Server 代理應該運行。
3. 通過執行下面提到的TSQL查詢使CDC可用於表Currency。
Use ChangeDataCapture
Go
EXEC sp_cdc_enable_table 'dbo', 'Currency', @role_name = NULL, @supports_net_changes =1
Go
4. 執行下面的查詢來檢查這個表是否可以使用CDC:
Use ChangeDataCapture
Go
Select [name], is_tracked_by_cdc from sys.tables
GO
is_tracked_by_cdc字段值為1代表CDC可用於這個表,而值為0代表CDC不可用。
5. 當你使CDC可用於Currency表後,另一個表被創建以保存變化數據和關於源表中變化的信息。新創建的表名稱為cdc.dbo_Currency_CT,如下圖所示。
6. 下一步是修改Currency表來添加CurrencyName字段:
Use ChangeDataCapture
Go
Alter table Currency add CurrencyName varchar(25)
Go
7. 可以通過執行下面的TSQL查詢來查看Currency表所發生的DDL改變:
Use ChangeDataCapture
Go
Select OBJECT_NAME(Source_Object_ID) As [Table Name],
OBJECT_NAME(Object_ID) As [CDC Table Name],
DDL_Command As [DDL Command],
DDL_LSN As [Log Sequence Number],
DDL_Time As [DateModifIEd]
From CDC.ddl_history
Go
總結
變化數據捕獲特性幫助數據庫管理員使得可以在一個數據庫表上使用CDC並跟蹤一個特定用戶表上所有數據庫定義語言的改變。