SQL Server 變更資料捕獲(CDC)

Hehuyi_In發表於2020-10-24

標籤:SQL SERVER/MSSQL SERVER/資料庫/DBA/欄位/物件更改

概述  

變更資料捕獲用於捕獲應用到 SQL Server 表中的插入、更新和刪除活動,並以易於使用的關係格式提供這些變更的詳細資訊。變更資料捕獲所使用的更改表中包含映象所跟蹤源表列結構的列,同時還包含了解所發生的變更所需的後設資料。

對錶開啟了變更捕獲之後,對該表的所有DML和DDL操作都會被記錄,有助於跟蹤表的變化。

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

 

目錄

配置變更資料捕獲

啟動資料庫捕獲

--開啟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 >

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

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結,否則保留追究責任的權利。

《歡迎交流討論》

 

相關文章