监视变更数据捕获进程

通过监视变更数据捕获进程,可以确定更改是否正以合理的滞后时间正确写入更改表中。监视还可以帮助您识别可能发生的任何错误。SQL Server 包括两个动态管理视图,用于帮助您监视变更数据捕获:

  • sys.dm_cdc_log_scan_sessions

    对于当前数据库中每一个日志扫描会话,sys.dm_cdc_log_scan_sessions 管理视图都有对应的一行。最后一行表示当前会话。此视图还包含一个会话 ID 为 0 的行,该行包含自从 SQL Server 实例上次启动以来的所有会话的相关聚合信息。

  • sys.dm_cdc_errors

    对于在变更数据捕获日志扫描会话期间遇到的每个错误,sys.dm_cdc_errors 管理视图都包含对应的一行。

识别包含空结果集的会话

sys.dm_cdc_log_scan_sessions 中的每一行表示一个日志扫描会话(ID 为 0 的行除外)。一个日志扫描会话等同于执行一次 sp_cdc_scan。在会话期间,扫描可以返回更改,也可以返回空结果。如果结果集为空,则 sys.dm_cdc_log_scan_sessions 中的 empty_scan_count 列将设置为 1。如果有连续的空结果集(例如,当捕获作业正在连续运行时),则最后一个现有行中的 empty_scan_count 将递增。例如,如果 sys.dm_cdc_log_scan_sessions 已经包含与返回了更改的扫描相对应的 10 行,并且存在五个连续的空结果,则该视图包含 11 行。最后一行在 empty_scan_count 列的值是 5。若要确定有空扫描的会话,请运行以下查询:

SELECT * from sys.dm_cdc_log_scan_sessions where empty_scan_count <> 0

确定滞后时间

sys.dm_cdc_log_scan_sessions 管理视图包括一个用于记录每个捕获会话滞后时间的列。滞后时间是指在源表上提交的事务与在更改表上提交的最后一个捕获的事务之间所经过的时间。只为活动会话填充滞后时间列。对于其 empty_scan_count 列的值大于 0 的会话,滞后时间列将设置为 0。以下查询返回最近进行的会话的平均滞后时间:

SELECT latency FROM sys.dm_cdc_log_scan_sessions WHERE session_id = 0

可以使用滞后时间数据确定捕获进程正在以多快或多慢的速度处理事务。当捕获进程连续运行时,该数据最有用。如果捕获进程正在按计划运行,那么,由于在源表上提交的事务与按计划时间运行的捕获进程之间存在滞后,因此滞后时间可能会很长。

捕获进程效率的另一个重要度量值是吞吐量。它是在每个会话期间每秒处理的平均命令数。若要确定会话的吞吐量,请将 command_count 列中的值除以持续时间列中的值。以下查询返回最近会话的平均吞吐量:

SELECT command_count/duration AS [Throughput] FROM sys.dm_cdc_log_scan_sessions WHERE session_id = 0

使用数据收集器收集抽样数据

SQL Server 数据收集器用于从任何表或动态管理视图中收集数据的快照,并生成性能数据仓库。对数据库启用变更数据捕获时,最好按固定时间间隔取得 sys.dm_cdc_log_scan_sessions 视图和 sys.dm_cdc_errors 视图的快照,以便随后进行分析。以下过程设置一个数据收集器,用于从 sys.dm_cdc_log_scan_sessions 管理视图收集示例数据。

配置数据集合

  1. 启用数据收集器,并配置管理数据仓库。有关详细信息,请参阅使用 SQL Server Management Studio 管理数据收集

  2. 执行以下代码,为变更数据捕获创建自定义收集器。

    USE msdb;
    
    DECLARE @schedule_uid uniqueidentifier;
    
    -- Collect and upload data every 5 minutes
    SELECT @schedule_uid = (
    SELECT schedule_uid from sysschedules_localserver_view 
    WHERE name = N'CollectorSchedule_Every_5min')
    
    DECLARE @collection_set_id int;
    
    EXEC dbo.sp_syscollector_create_collection_set
    @name = N' CDC Performance Data Collector',
    @schedule_uid = @schedule_uid,        
    @collection_mode = 0,                 
    @days_until_expiration = 30,              
    @description = N'This collection set collects CDC metadata',
    @collection_set_id = @collection_set_id output;
    
    
    -- Create a collection item using statistics from 
    -- the change data capture dynamic management view.
    DECLARE @paramters xml;
    DECLARE @collection_item_id int;
    
    SELECT @paramters = CONVERT(xml, 
        N'<TSQLQueryCollector>
            <Query>
              <Value>SELECT * FROM sys.dm_cdc_log_scan_sessions</Value>
              <OutputTable>cdc_log_scan_data</OutputTable>
            </Query>
          </TSQLQueryCollector>');
    
    EXEC dbo.sp_syscollector_create_collection_item
    @collection_set_id = @collection_set_id,
    @collector_type_uid = N'302E93D1-3424-4BE7-AA8E-84813ECF2419',
    @name = ' CDC Performance Data Collector',
    @frequency = 5, 
    @parameters = @paramters,
    @collection_item_id = @collection_item_id output;
    
    GO
    
  3. 在 SQL Server Management Studio 中,展开**“管理”,然后展开“数据收集”。右键单击“CDC 性能数据收集器”,然后单击“启动数据收集组”**。

  4. 在步骤 1 配置的数据仓库中,找到表 custom_snapshots.cdc_log_scan_data。该表提供日志扫描会话中的数据的历史快照。此数据可以用于分析与时间有关的滞后时间、吞吐量和其他性能度量值。

请参阅

其他资源