SQL Server 變動數據捕獲(CDC)

標籤:SQL SERVER/MSSQL SERVER/數據庫/DBA/字段/對象更改數據庫

概述  

變動數據捕獲用於捕獲應用到 SQL Server 表中的插入、更新和刪除活動,並以易於使用的關係格式提供這些變動的詳細信息。變動數據捕獲所使用的更改表中包含鏡像所跟蹤源表列結構的列,同時還包含了解所發生的變動所需的元數據。session

對錶開啓了變動捕獲以後,對該表的全部DML和DDL操做都會被記錄,有助於跟蹤表的變化。架構

測試環境: SQL SERVER 2008 R2,案例庫AdventureWorks2008R2app

 

目錄less

配置變動數據捕獲

啓動數據庫捕獲

--開啓cdc
USE [AdventureWorks2008R2]
EXECUTE sys.sp_cdc_enable_db
GO
---若是開啓數據庫捕獲報錯誤:15517,使用下面的方法處理
ALTER AUTHORIZATION ON DATABASE::[AdventureWorks2008R2] TO [sa]

---查看是否設置成功,1表明開啓cdc
SELECT is_cdc_enabled  FROM SYS.databases WHERE name='AdventureWorks2008R2'

設置跟蹤表

爲當前數據庫中指定的源表啓用變動數據捕獲。對錶啓用變動數據捕獲時,應用於此表的每一個數據操縱語言 (DML) 操做的記錄都將寫入事務日誌中。變動數據捕獲進程將從日誌中檢索此信息,並將其寫入可經過使用一組函數訪問的更改表中。函數

格式:性能

sys.sp_cdc_enable_table 
    [ @source_schema = ] 'source_schema', ---表所屬的架構名
    [ @source_name = ] 'source_name' ,----表名
    [ @role_name = ] 'role_name'---是用於控制更改數據訪問的數據庫角色的名稱。
    [,[ @capture_instance = ] 'capture_instance' ]--是用於命名變動數據捕獲對象的捕獲實例的名稱,這個名稱在後面的存儲過程和函數中須要常常用到。
    [,[ @supports_net_changes = ] supports_net_changes ]---指示是否對此捕獲實例啓用淨更改查詢支持若是此表有主鍵,或者有已使用 @index_name 參數進行標識的惟一索引,則此參數的默認值爲 1。不然,此參數默認爲 0。
    [,[ @index_name = ] 'index_name' ]--用於惟一標識源表中的行的惟一索引的名稱。index_name 爲 sysname,而且能夠爲 NULL。若是指定,則 index_name 必須是源表的惟一有效索引。若是指定 index_name,則標識的索引列優先於任何定義的主鍵列,就像表的惟一行標識符同樣。
    [,[ @captured_column_list = ] 'captured_column_list' ]--須要對哪些列進行捕獲。captured_column_list 的數據類型爲 nvarchar(max),而且能夠爲 NULL。若是爲 NULL,則全部列都將包括在更改表中。
    [,[ @filegroup_name = ] 'filegroup_name' ]--是要用於爲捕獲實例建立的更改表的文件組。
  [,[ @partition_switch = ] 'partition_switch' ]--指示是否能夠對啓用了變動數據捕獲的表執行 ALTER TABLE 的 SWITCH PARTITION 命令。allow_partition_switch 爲 bit,默認值爲 1。
  

注意:
對錶啓用變動數據捕獲時,將生成一個更改表以及一個或兩個查詢函數。更改表充當捕獲進程從事務日誌中提取的源表更改的存儲庫。查詢函數則用於從更改表中提取數據。這些函數的名稱按如下方式派生自 capture_instance 參數:測試

全部更改函數: cdc.fn_cdc_get_all_changes_ < capture_instance >
淨更改函數: cdc.fn_cdc_get_net_changes_ < capture_instance >spa

1.若是源表是數據庫中第一個要啓用變動數據捕獲的表,而且數據庫不存在事務發佈,則 sys.sp_cdc_enable_table 還將爲數據庫建立捕獲和清理做業。
它將 sys.tables 目錄視圖中的 is_tracked_by_cdc 列設置爲 1。
2.對錶啓用變動數據捕獲時,SQL Server 代理沒必要正在運行。可是,只有當 SQL Server 代理正在運行時,捕獲進程纔會處理事務日誌並將條目寫入更改表。代理

USE AdventureWorks2008R2;
GO
EXEC sys.sp_cdc_enable_table
    @source_schema = N'HumanResources'
  , @source_name = N'Department'
  , @role_name = N'cdc_admin'--增長的角色
  , @capture_instance = N'HR_Department'--實例名 
  , @supports_net_changes = 1
  , @index_name = N'AK_Department_Name' 
  , @captured_column_list = N'Name, GroupName'--跟蹤的字段
  , @filegroup_name = N'PRIMARY';
GO
---查詢表是否啓動跟蹤,值爲1標示已啓動
SELECT is_tracked_by_cdc  FROM SYS.tables WHERE name='Department'

數據庫的變化

  •  增長的系統表

 

  • 增長的系統視圖

 

  • 增長的系統存儲過程

  • 增長的函數

 

 

  • 增長的用戶與角色 
 
---全部cdc有關的對象
SELECT * FROM SYS.all_objects  WHERE name LIKE '%CDC%'OR SCHEMA_ID IN(SELECT SCHEMA_ID FROM SYS.schemas WHERE name='CDC')
 ORDER BY TYPE
SELECT * FROM msdb.SYS.objects WHERE name='cdc_jobs'  

對象分析

插入測試數據

---查詢插入數據以前表中的內容
USE
[AdventureWorks2008R2] SELECT * FROM [HumanResources].[Department]

--1.插入一條記錄 INSERT INTO [AdventureWorks2008R2].[HumanResources].[Department]([Name],[GroupName],[ModifiedDate]) VALUES('TEST','TEST',GETDATE()) GO --更新一條記錄 UPDATE [HumanResources].[Department] SET GroupName='TEST1' WHERE GroupName='TEST' --增長一個字段 ALTER TABLE [HumanResources].[Department] ADD Dcolumn INT

分析系統表

SELECT * FROM cdc.ddl_history---與DDL有關的操做記錄

SELECT * FROM cdc.HR_Department_CT
/*
__$operation字段的值:
1 = 刪除
2 = 插入
3 = 更新(舊值)
列數據中具備執行更新語句以前的行值。
4 = 更新(新值)
列數據中具備執行更新語句以後的行值。
*/

爲每一個在更改表中存在行的事務返回一行。該表用於在日誌序列號 (LSN) 提交值和提交事務的時間之間創建映射。沒有對應的更改表項的項也能夠記錄下來,以便表在變動活動少或者無變動活動期間將 LSN 處理的完成過程記錄下來。
SELECT
* FROM cdc.lsn_time_mapping

分析存儲過程

---查詢當前做業配置
SELECT * FROM MSDB.dbo.cdc_jobs
--或者使用
USE AdventureWorks2008R2;
GO
EXEC sys.sp_cdc_help_jobs;
GO
1.sys.sp_cdc_add_job
在當前數據庫中建立變動數據捕獲清理或捕獲做業

    1.建立捕獲做業
    USE AdventureWorks2008R2;
    GO
    EXEC sys.sp_cdc_add_job 
         @job_type = N'capture';
    GO
    2.建立清理做業
    ---建立清理做業,做業連續運行,更改數據行將在更改表中保留2880分鐘,清除時使用一條語句最多刪除4000條記錄
    USE AdventureWorks2008R2;
    GO
    EXEC sys.sp_cdc_add_job
         @job_type = N'cleanup'
         ,@start_job=1
         ,@retention=2880
         ,@threshold =4000
2.sys.sp_cdc_change_job
修改當前數據庫中變動數據捕獲清除或捕獲做業的配置
--僅在使用 sp_cdc_stop_job 中止做業並使用 sp_cdc_start_job 從新啓動該做業後,對該做業所作的更改纔會生效

    1.更改捕獲做業
    --將每一個循環掃描最多處理的事務數更改成200,爲了從日誌中提取全部行而要執行的最大掃描循環50次
    USE AdventureWorks2008R2;
    GO
    EXECUTE sys.sp_cdc_change_job 
        @job_type = N'capture',
        @maxtrans = 200,
        @maxscans = 50;
        
    GO
    2.更改清除做業,將記錄保留時間更改成3440分鐘
    USE AdventureWorks2008R2;
    GO
    EXECUTE sys.sp_cdc_change_job 
        @job_type = N'cleanup',
        @retention = 3440;
    GO
3.sys.sp_cdc_cleanup_change_table
根據指定的 low_water_mark 值從當前數據庫的更改表中刪除行,重置更改表中的最小 __$start_lsn,並刪除小於該值的數據.
將同時清除cdc.HR_Department_CT,cdc.lsn_time_mapping表的記錄

    USE AdventureWorks2008R2;
    GO
    EXEC sys.sp_cdc_cleanup_change_table 
    @capture_instance =N'HR_Department',
    @low_water_mark=0x0000037D000000D30008,
    @threshold=2000;
    
    
    SELECT sys.fn_cdc_increment_lsn(sys.fn_cdc_get_max_lsn())
4.sys.sp_cdc_drop_job
從 msdb 中刪除當前數據庫的變動數據捕獲清除或捕獲做業。

--下例刪除 AdventureWorks2008R2 數據庫的清除做業和捕獲做業
    USE AdventureWorks2008R2;
    GO
    EXEC sys.sp_cdc_drop_job @job_type = N'cleanup';
    USE AdventureWorks2008R2;
    GO
    EXEC sys.sp_cdc_drop_job @job_type = N'capture';

5.sys.sp_cdc_disable_db    
對當前數據庫禁用變動數據捕獲

禁用當前對數據庫中的全部表啓用的變動數據捕獲。與變動數據捕獲相關的全部系統對象(如更改表、做業、存儲過程和函數)都將被刪除。sys.databases 目錄視圖中的數據庫條目的 is_cdc_enabled 列設置爲 0。
若是在禁用變動數據捕獲時爲數據庫定義了不少捕獲實例,則長時間運行事務可能致使 sys.sp_cdc_disable_db 的執行失敗。經過在運行 sys.sp_cdc_disable_db 以前使用 sys.sp_cdc_disable_table 禁用單個捕獲實例,能夠避免此問題。
    USE AdventureWorks2008R2;
    GO
    EXECUTE sys.sp_cdc_disable_db;
    GO
6.sys.sp_cdc_disable_table
對當前數據庫中指定的源表和捕獲實例禁用變動數據捕獲
刪除與指定的源表和捕獲實例相關聯的變動數據捕獲更改表和系統函數。它會刪除任何與來自變動數據捕獲系統表的指定捕獲實例相關聯的行,並將 sys.tables 目錄視圖中的表項的 is_tracked_by_cdc 列設置爲 0---下例對 HumanResources.Department 表禁用了變動數據捕獲
    USE AdventureWorks2008R2;
    GO
    EXEC sys.sp_cdc_disable_table
        @source_schema = N'HumanResources'
      , @source_name = N'Department'
      , @capture_instance = N'HR_Department' ---這裏是定義的實例名稱,在一開始建立捕獲的時候建立的,這裏也能夠制定ALL(禁用表HumanResources.Department的全部捕獲),



7.sys.sp_cdc_enable_db
對當前數據庫啓用變動數據捕獲。必須先對數據庫執行此過程,而後才能對該數據庫中的任何表啓用變動數據捕獲。變動數據捕獲可記錄應用到所啓用的表中的插入、更新和刪除活動,同時採用易於使用的關係格式提供變動詳細信息。此操做將爲已修改的行捕獲反映了所跟蹤源表列結構的列信息,同時還捕獲將更改應用到目標環境所需的元數據。
將建立以全數據庫爲做用域的變動數據捕獲對象,包括元數據表和 DDL 觸發器。它還會建立 cdc 架構和 cdc 數據庫用戶,並將 sys.databases 目錄視圖中的數據庫條目的 is_cdc_enabled 列設置爲 1USE AdventureWorks2008R2;
    GO
    EXECUTE sys.sp_cdc_enable_db;
    GO

8.sys.sp_cdc_enable_table
--對須要進行跟蹤的表啓動CDC,sys.sp_cdc_enable_table
/*
爲當前數據庫中指定的源表啓用變動數據捕獲。對錶啓用變動數據捕獲時,應用於此表的每一個數據操縱語言 (DML) 操做的記錄都將寫入事務日誌中。
變動數據捕獲進程將從日誌中檢索此信息,並將其寫入可經過使用一組函數訪問的更改表中。
*/
sys.sp_cdc_enable_table 
    [ @source_schema = ] 'source_schema', ---表所屬的架構名
    [ @source_name = ] 'source_name' ,----表名
    [ @role_name = ] 'role_name'---是用於控制更改數據訪問的數據庫角色的名稱。
    [,[ @capture_instance = ] 'capture_instance' ]--是用於命名特定於實例的變動數據捕獲對象的捕獲實例的名稱
    [,[ @supports_net_changes = ] supports_net_changes ]---指示是否對此捕獲實例啓用淨更改查詢支持
    [,[ @index_name = ] 'index_name' ]--用於惟一標識源表中的行的惟一索引的名稱。index_name 爲 sysname,而且能夠爲 NULL。若是指定,則 index_name 必須是源表的惟一有效索引。若是指定 index_name,則標識的索引列優先於任何定義的主鍵列,就像表的惟一行標識符同樣。
    [,[ @captured_column_list = ] 'captured_column_list' ]--須要對哪些列進行捕獲。captured_column_list 的數據類型爲 nvarchar(max),而且能夠爲 NULL。若是爲 NULL,則全部列都將包括在更改表中。
    [,[ @filegroup_name = ] 'filegroup_name' ]--是要用於爲捕獲實例建立的更改表的文件組。
  [,[ @partition_switch = ] 'partition_switch' ]--指示是否能夠對啓用了變動數據捕獲的表執行 ALTER TABLE 的 SWITCH PARTITION 命令。allow_partition_switch 爲 bit,默認值爲 1。
  
9.sp_cdc_generate_wrapper_function 
 生成用於爲 SQL Server 中可用的變動數據捕獲查詢函數建立包裝函數的腳本
     EXEC sys.sp_cdc_generate_wrapper_function 
 

10. sys.sp_cdc_help_change_data_capture 
返回當前數據庫中爲變動數據捕獲啓用的每一個表的變動數據捕獲配置。最多可爲每一個源表返回兩行,爲每一個捕獲實例返回一行。
---返回制定表的捕獲信息
    USE AdventureWorks2008R2;
    GO
    EXECUTE sys.sp_cdc_help_change_data_capture 
        @source_schema = N'HumanResources', --架構名
        @source_name = N'Department';--表名
    GO
    --返回全部表的捕獲信息
    USE AdventureWorks2008R2;
    GO
    EXECUTE sys.sp_cdc_help_change_data_capture 
     
11.sys.sp_cdc_get_captured_columns
返回指定捕獲實例所跟蹤的捕獲源列的變動數據捕獲元數據信息。
    USE AdventureWorks2008R2;
    GO
    EXECUTE sys.sp_cdc_get_captured_columns 
        @capture_instance = N'HR_Department';
    GO

12.sys.sp_cdc_get_ddl_history
返回自對指定的捕獲實例啓用變動數據捕獲後與該捕獲實例關聯的數據定義語言 (DDL) 更改歷史記錄。
與查詢表是同樣的結果
    SELECT * FROM cdc.ddl_history

    USE AdventureWorks2008R2;
    GO
    EXECUTE sys.sp_cdc_get_ddl_history
    @capture_instance = N'HR_Department';

13.sp_cdc_help_jobs
報告關於當前數據庫中全部變動數據捕獲清除或捕獲做業的信息。由於一個數據庫只會在第一個表建立捕獲的時候建立做業
因此這裏只須要在當前庫執行就能夠。
    sys.sp_cdc_help_jobs
    USE AdventureWorks2008R2;
    GO
    EXEC sys.sp_cdc_help_jobs;
    GO
14.sp_cdc_scan
執行變動數據捕獲日誌掃描操做,須要進行捕獲的時候使用,默認狀況下5會自動進行捕獲。
若是變動數據捕獲正在使用 SQL Server 代理捕獲做業,則 sys.sp_MScdc_capture_job 將內部調用 sys.sp_cdc_scan。若是變動數據捕獲日誌掃描操做已經處於活動狀態,或數據庫啓用了事務複製,則沒法顯式執行此過程。此存儲過程應當由須要自定義自動配置的捕獲做業的行爲的管理員使用。
    USE AdventureWorks2008R2;
    GO
    EXEC sp_cdc_scan

15.sys.sp_cdc_start_job,
啓動和中止當前數據庫的變動數據捕獲清除或捕獲做業。

    ---啓動清除做業
    USE AdventureWorks2008R2;
    GO
    EXEC sys.sp_cdc_start_job @job_type = N'cleanup';

    ---中止捕獲做業
    USE AdventureWorks2008R2;
    GO
    EXEC sys.sp_cdc_stop_job @job_type = N'capture';
    GO

    USE AdventureWorks2008R2;
    GO
    EXEC sys.sp_cdc_stop_job @job_type = N'cleanup';
    GO

分析函數

1.fn_cdc_get_all_changes_capture_instance
針對在指定日誌序列號 (LSN) 範圍內應用到源表的每項更改均返回一行
    USE AdventureWorks2008R2;
    GO

    DECLARE @from_lsn binary(10), @to_lsn binary(10)
    SET @from_lsn =
       sys.fn_cdc_get_min_lsn('HR_Department')
    SET @to_lsn   = sys.fn_cdc_get_max_lsn()
    SELECT * FROM cdc.fn_cdc_get_all_changes_HR_Department
      (@from_lsn, @to_lsn, N'all');
    GO
2.fn_cdc_get_net_changes_capture_instance
針對指定 LSN 範圍內每一個已更改的源行返回一個淨更改行。也就是說,若是在 LSN 範圍內源行具備多項更改,
則該函數將返回反映該行最終內容的單一行。例如,若是事務在源表中插入一行,而且 LSN 範圍內的後續事務更新了該行中的一個或多個列,
則該函數將只返回一行,其中包含多個更新的列值。
若是值最後是刪除操做,則不返回該LSN的值
    USE AdventureWorks2008R2;
    GO
    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;
    -- DML statements to produce changes in the HumanResources.Department table.
    INSERT INTO HumanResources.Department (Name, GroupName)
    VALUES (N'MyDept', N'MyNewGroup');

    UPDATE HumanResources.Department
    SET GroupName = N'Resource Control'
    WHERE GroupName = N'Inventory Management';

    DELETE FROM HumanResources.Department
    WHERE Name = N'MyDept';

    -- Obtain the end of the time interval.
    SET @end_time = GETDATE();
    -- Map the time interval to a change data capture query range.
    SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
    SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);

    -- Return the net changes occurring within the query window.
    SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');
    
3.sys.fn_cdc_decrement_lsn
根據指定的 LSN 返回序列中的上一個日誌序列號 (LSN)
    Use AdventureWorks2008R2;
    GO
    SELECT sys.fn_cdc_decrement_lsn(sys.fn_cdc_get_max_lsn())

下例在一個返回 LSN 值小於最大 LSN 值的更改數據行的查詢中,使用 sys.fn_cdc_decrement_lsn 來設置 LSN 上限。

    Use AdventureWorks2008R2;
    GO
    DECLARE @from_lsn binary(10), @to_lsn binary(10);
    SET @from_lsn = sys.fn_cdc_get_min_lsn('HR_Department');
    SET @to_lsn = sys.fn_cdc_decrement_lsn(sys.fn_cdc_get_max_lsn());
    SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department( @from_lsn, @to_lsn, 'all'); 
    GO

4.sys.fn_cdc_increment_lsn
根據指定的 LSN 返回序列中的下一個日誌序列號 (LSN)。
此函數返回的 LSN 值始終大於指定的值,而且不存在介於這兩個值之間的 LSN 值。
若要系統地查詢隨時間變化的更改數據流,能夠按期重複調用該查詢函數,每次調用時指定一個新的查詢間隔來限定查詢中返回的更改的範圍。爲幫助確保不丟失數據,一般使用前一個查詢的上限來生成後一個查詢的下限。因爲查詢間隔是一個閉區間,所以新的下限必須大於前一個上限,但要足夠小,以確保不存在 LSN 值介於此值與舊上限之間的更改。sys.fn_cdc_increment_lsn 函數就是用來獲取此值的。
    Use AdventureWorks2008R2;
    GO
    SELECT sys.fn_cdc_increment_lsn(sys.fn_cdc_get_max_lsn())


5.sys.fn_cdc_get_column_ordinal
返回實例制定列的列序號。

    Use AdventureWorks2008R2;
    GO
    SELECT sys.fn_cdc_get_column_ordinal ( 'HR_Department','NAME');


6.sys.fn_cdc_get_max_lsn
返回 cdc.lsn_time_mapping 系統表的 start_lsn 列中的最大日誌序列號 (LSN)。您可使用此函數爲任何捕獲實例返回變動數據捕獲時間線的高端點
    USE AdventureWorks2008R2;
    GO
    SELECT sys.fn_cdc_get_max_lsn()AS max_lsn;

    SELECT  sys.fn_cdc_get_min_lsn(N'HR_Department');


    USE AdventureWorks2008R2;
    GO
    DECLARE @from_lsn binary(10), @to_lsn binary(10);
    SET @from_lsn = sys.fn_cdc_get_min_lsn(N'HR_Department');
    SET @to_lsn = sys.fn_cdc_get_max_lsn();
    SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');
    GO

7.sys.fn_cdc_get_min_lsn
    USE AdventureWorks2008R2;
    GO
    SELECT sys.fn_cdc_get_min_lsn ('HR_Department')AS min_lsn;---查詢制定的實例名的最小LSN

8.sys.fn_cdc_has_column_changed ( 'capture_instance','column_name' , update_mask )
標識指定的更新掩碼是否指示已更新關聯的更改行中的指定列。
    USE AdventureWorks2008R2;
    GO
    SELECT sys.fn_cdc_has_column_changed ('HR_Department','name' , 2)


9.sys.fn_cdc_is_bit_set
指示捕獲的列是否已更新,採用的方法是檢查是否在提供的位掩碼內設置了其序號位置。

    USE AdventureWorks2008R2;
    GO
    DECLARE @from_lsn binary(10), @to_lsn binary(10), @GroupNm_ordinal int;
    SET @from_lsn = sys.fn_cdc_get_min_lsn('HR_Department');
    SET @to_lsn = sys.fn_cdc_get_max_lsn();
    SET @GroupNm_ordinal = sys.fn_cdc_get_column_ordinal('HR_Department','GroupName');
    SELECT sys.fn_cdc_is_bit_set(@GroupNm_ordinal,__$update_mask) as 'IsGroupNmUpdated', *
    FROM cdc.fn_cdc_get_all_changes_HR_Department( @from_lsn, @to_lsn, 'all')
    WHERE __$operation = 4;
    GO

10.sys.fn_cdc_map_lsn_to_time
爲指定的日誌序列號 (LSN) 返回 cdc.lsn_time_mapping 系統表的 tran_end_time 列中的日期和時間值。
您可使用此函數系統地將 LSN 範圍映射到更改表中的日期範圍
    SELECT sys.fn_cdc_map_lsn_to_time(sys.fn_cdc_get_max_lsn());

11.sys.fn_cdc_map_time_lsn
下面的示例使用 sys.fn_cdc_map_time_lsn 函數來肯定在 cdc.lsn_time_mapping 表中是否有 tran_end_time 
值大於或等於指定時間的行。例如,能夠用此查詢來肯定捕獲進程是否已處理完截至前指定時間提交的更改
    DECLARE @extraction_time datetime, @lsn binary(10);
    SET @extraction_time = GETDATE();
    SELECT @lsn = sys.fn_cdc_map_time_to_lsn ('smallest greater than or equal', @extraction_time);
    IF @lsn IS NOT NULL
    BEGIN
    print '...'
    END

    DECLARE @begin_time datetime, @end_time datetime, @begin_lsn binary(10), @end_lsn binary(10);
    SET @begin_time = '2015-04-07 18:00:00.000';
    SET @end_time = '2015-04-08 18:00:00.000';
    SELECT @begin_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than', @begin_time);
    SELECT @end_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
    SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@begin_lsn, @end_lsn, 'all ');

分析系統視圖

1.sys.dm_cdc_log_scan_sessions
針對當前數據庫中的每一個日誌掃描會話返回一行。返回的最後一行表示當前會話。您可使用此視圖返回有關當前日誌掃描會話的狀態信息,
或有關自 SQL Server 實例上次啓動以來全部會話的聚合信息。
    USE AdventureWorks2008R2;
    SELECT *
    FROM sys.dm_cdc_log_scan_sessions
--能夠觀察empty_scan_count字段的值能夠發現它的變化,5秒增長一次,和前面配置的日誌掃描做業的頻率是同樣的
    USE AdventureWorks2008R2;
    GO
    print getdate()
    SELECT empty_scan_count
    FROM sys.dm_cdc_log_scan_sessions
    WHERE session_id = (SELECT MAX(b.session_id) from sys.dm_cdc_log_scan_sessions AS b)

    waitfor DELAY '00:01' 

    print getdate()
    SELECT empty_scan_count
    FROM sys.dm_cdc_log_scan_sessions
    WHERE session_id = (SELECT MAX(b.session_id) from sys.dm_cdc_log_scan_sessions AS b)

2.sys.dm_cdc_errors
爲變動數據捕獲日誌掃描會話中遇到的每一個錯誤返回一行。
    USE AdventureWorks2008R2;
    GO
    SELECT *
    FROM sys.dm_cdc_errors

 

總結

 捕獲方法能夠跟蹤一個表對象的更改操做,可是開啓了變動捕獲對性能存在必定的影響,特別在日誌讀寫這一塊,首先它比正常的操做須要進行更多的日誌寫操做,並且日誌的讀操做也是很頻繁的,有時候可能會引發日誌等待類型,因此要慎重使用。

 

 若是文章對你們有幫助,但願你們能給個推薦,謝謝!!!

 

備註:

    做者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點全部隨筆都是原創,歡迎你們轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連接,不然保留追究責任的權利。

《歡迎交流討論》

相關文章
相關標籤/搜索