SQL Server 變更數據捕獲(CDC)


標簽: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

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

《歡迎交流討論》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM