天天看點

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

<a href="#_labelContents">本文所涉及的内容(Contents)</a>

<a href="#_labelContexts">背景(Contexts)</a>

<a href="#_labelRealization">實作過程(Realization)</a>

<a href="#_labelAddon">補充說明(Addon)</a>

<a href="#_labelReferences">參考文獻(References)</a>

  在SQL Server 2008版本之前,對表資料庫的變更監控,我們通常使用DML觸發器進行監控,把DML操作中的INSERT/UPDATE/DELETE資料記錄下來,但是觸發器的維護比較困難;

  當SQL Server 2008新功能:變更資料捕獲(Change Data Capture,即CDC)出來之後,我發現這正是我想要的,因為我之前使用DML觸發器實作的時候也是把UPDATE操作按照兩條記錄進行記錄的,共同的缺點都是在使用者修改了表結構後,CDC不會自動同步到記錄中,不過CDC也有DDL的監控可以補充這個缺陷;CDC的優點就是以異步程序讀取事務日志進行捕獲資料變更的。

(一) 建立一個測試資料庫;

(二) 在開啟資料庫的CDC之前先查詢一下狀态,is_cdc_enabled值為0表示沒有開啟,1表示開啟,當為資料庫[CDC_DB]啟用了CDC之後,在CDC_DB系統表中會出現下圖Figure2所示的6個表;

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure1:資料庫CDC狀态)

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure2:啟用資料庫CDC建立的系統表)

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure3:資料庫CDC狀态)

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure4:添加新使用者和架構)

開啟資料庫的CDC之後,分别在使用者和架構上建立新的使用者cdc,新的架構cdc;

(三) 建立一個測試表,對表行變更啟用捕獲,為表[Department]啟用CDC,首先會在系統表中建立[cdc].[dbo_Department_CT],會在Agent中建立兩個作業,cdc.CDC_DB_capture和cdc.CDC_DB_cleanup,啟用表變更捕獲需要開啟SQL Server Agent服務,不然會報錯。每對一個表啟用捕獲就會生成一個向對應的記錄表。

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure5:提示資訊)

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure6:新增加的系統表)

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure7:生成的捕獲和清理作業)

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure8:表的CDC狀态)

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure9:多了個資料庫角色)

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)
SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure10:sys.sp_cdc_enable_table配置選項)

上圖深色部分的字段值是在執行sys.sp_cdc_enable_table的時候設定的。

(四) 測試插入資料、更新資料、删除資料,執行完這些DML,我們來觀察下cdc.dbo_Department_CT幫我們記錄些什麼?

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure11:變更記錄表)

對于insert/delete操作,會有對應的一行記錄,而對于update,會有兩行記錄。__$operation列:1 = 删除、2= 插入、3= 更新(舊值)、4= 更新(新值);

(五) 啟用CDC之後,你怎麼從中擷取到資料呢?通過資料我們可以對資料進行恢複;

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure15:通過時間擷取LSN更新)

(六) CDC的維護

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure12:監控表字段資訊)

由于sys.sp_cdc_enable_table 的參數:@captured_column_list = NULL,是以dbo.Department表的所有字段都進行監控了,如果你隻關心某些字段,強烈建議在建立捕獲的時候設定這個屬性;

SQL Server 變更資料捕獲(CDC)監控表資料一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作過程(Realization)四.補充說明(Addon)五.參考文獻(References)

(Figure13:資料庫作業資訊)

  SQL Server記錄資料變更有四種方法:觸發器、Output子句、變更資料捕獲(Change Data Capture 即CDC)功能、同步更改跟蹤。其中後兩個為SQL Server 2008所新增。

CDC功能主要捕獲SQLServer指定表的增删改操作;

CDC除了捕獲資料變更之外,還能捕獲DDL操作的變化;

無法對系統資料庫和分發資料庫啟用該功能。且執行者需要用sysadmin角色權限;

cdc.&lt;capture_instance&gt;_CT   可以看到,這樣命名的表,是用于記錄源表更改的表。對于insert/delete操作,會有對應的一行記錄,而對于update,會有兩行記錄;

對于__$start_lsn列:由于更改是來源與資料庫的事務日志,是以這裡會儲存其事務日志的開始序列号(LSN);

對于__$end_lsn列:

對于__$seqval列:

對于__$operation列:1 = 删除、2= 插入、3= 更新(舊值)、4= 更新(新值);

對于__$update_mask列:

恢複模式為簡單模式一樣可以進行CDC;

雖然能捕獲到資料變更,但是沒有辦法找到是誰更新的?

能使用這個做復原嘛?備份的另外一種路徑?對表更新不頻繁的情況下?

如果是添加或者删除了某些字段DDL,那麼建立的CDC表并沒有做更改,那新字段的資料怎麼捕獲呢?修改字段長度等這些操作同樣會一起修改CDC對應的表字段;

sys.sp_cdc_enable_table 的@role_name參數,是指角色-資料庫角色,這個有什麼用呢?應用程式角色又有什麼用呢?

cdc.Person_Contact_CT這名字中CT代表什麼意思呢?Capture Table?(使用者.架構_表_CT)

SQL Server 自啟動了兩個job,一個捕獲,一個清除,注意清除是預設淩晨2點,清除72小時以上的資料。如果同一資料庫的表中CDC已經啟用,不會重建job。

all

傳回指定 LSN 範圍内的所有更改。 對于由更新操作導緻的更改,此選項隻傳回在應用更新之後包含新值的行。

all update old

傳回指定 LSN 範圍内的所有更改。 對于由更新操作導緻的更改,此選項将傳回在更新之前包含列值的行和更新之後包含列值的行。

<a href="http://technet.microsoft.com/zh-cn/library/bb500244.aspx">更改資料捕獲存儲過程 (Transact-SQL)</a>

<a href="http://technet.microsoft.com/zh-cn/library/cc645937.aspx">關于變更資料捕獲 (SQL Server)</a>

<a href="http://technet.microsoft.com/zh-cn/library/bb500353.aspx">變更資料捕獲表 (Transact-SQL)</a>

<a href="http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html">SQL Server 2008中新增的變更資料捕獲(CDC)和更改跟蹤</a>

<a href="http://msdn.microsoft.com/zh-cn/library/bb522489(v=sql.100).aspx">變更資料捕獲</a>

<a href="http://msdn.microsoft.com/zh-cn/library/cc645937(v=sql.100).aspx">變更資料捕獲基本知識</a>

<a href="http://technet.microsoft.com/zh-cn/library/bb933994.aspx">跟蹤資料更改 (SQL Server)</a>

<a href="http://www.cnblogs.com/chenxizhang/archive/2011/08/10/2133408.html">SQL Server 2008中的CDC(Change Data Capture)功能使用及釋疑</a>

<a href="http://www.cnblogs.com/chenxizhang/archive/2009/04/28/1445297.html">SQL Server 2008 的CDC功能</a>

<a href="http://www.cnblogs.com/chenxizhang/archive/2009/05/16/1458388.html">關于CDC功能的答疑</a>

<a href="http://technet.microsoft.com/zh-cn/library/bb510627.aspx">cdc.fn_cdc_get_all_changes_&lt;捕獲執行個體&gt; (Transact-SQL)</a>

<a href="http://technet.microsoft.com/zh-cn/magazine/ms187359(SQL.90).aspx">ALTER AUTHORIZATION (Transact-SQL)</a>