变更数据捕获 - sys.dm_cdc_log_scan_sessions
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例
针对当前数据库中的每个日志扫描会话返回一行。 返回的最后一行表示当前会话。 可以使用此视图返回有关当前日志扫描会话的状态信息,或有关自 SQL Server 实例上次启动以来所有会话的聚合信息。
每当重新启动 SQL Server 实例或在发生故障转移后,将重置这些 sys.dm_cdc_log_scan_sessions
记录。 此外,如果查询的数据库处于 AlwaysOn 可用性组的辅助角色,则不会返回任何记录。
有关详细信息,请查看 什么是变更数据捕获(CDC)?
列名称 | 数据类型 | 描述 |
---|---|---|
session_id |
int | 会话的 ID。 0 = 此行中返回的数据是自 SQL Server 实例上次启动以来所有会话的聚合。 |
start_time | datetime | 会话的开始时间。 当 session_id = 0 时,为聚合数据收集的开始时间。 |
end_time | datetime | 会话结束的时间。 NULL = 会话处于活动状态。 当 session_id = 0 时,为最后一个会话的结束时间。 |
duration | int | 会话的持续时间(以秒为单位)。 0 = 会话不包含变更数据捕获事务。 当 session_id = 0 时,为包含变更数据捕获事务的所有会话的持续时间之和(以秒为单位)。 |
scan_phase | nvarchar(200) | 会话的当前阶段。 以下是可能的值及其说明: 1:正在读取配置 2:第一次扫描,生成哈希表 3:第二次扫描 4:第二次扫描 5:第二次扫描 6:架构版本控制 7:上一次扫描 8 = 完成 当 session_id = 0 时,此值始终为“Aggregate”。 |
error_count | int | 遇到的错误数。 当 session_id = 0 时,为所有会话中的错误总数。 |
start_lsn | nvarchar(23) | 会话的起始 LSN。 当 session_id = 0 时,为最后一个会话的起始 LSN。 |
current_lsn | nvarchar(23) | 当前正在扫描的 LSN。 当 session_id = 0 时,当前 LSN 为 0。 |
end_lsn | nvarchar(23) | 会话的结束 LSN。 NULL = 会话处于活动状态。 当 session_id = 0 时,为最后一个会话的结束 LSN。 |
tran_count | bigint | 已处理的变更数据捕获事务数。 此计数器在第 2 阶段填充。 当 session_id = 0 时,为所有会话中已处理的事务数。 |
last_commit_lsn | nvarchar(23) | 已处理的最后一个提交日志记录的 LSN。 当 session_id = 0 时,为任意会话的最后一个提交日志记录 LSN。 |
last_commit_time | datetime | 最后一个提交日志记录的处理时间。 当 session_id = 0 时,为任意会话的最后一个提交日志记录的处理时间。 |
log_record_count | bigint | 扫描的日志记录数。 当 session_id = 0 时,为所有会话的扫描记录数。 |
schema_change_count | int | 检测到的数据定义语言 (DDL) 操作数。 此计数器在第 6 阶段填充。 当 session_id = 0 时,为所有会话中已处理的 DDL 操作数。 |
command_count | bigint | 已处理的命令数。 当 session_id = 0 时,为所有会话中已处理的命令数。 |
first_begin_cdc_lsn | nvarchar(23) | 包含变更数据捕获事务的第一个 LSN。 当 session_id = 0 时,为包含变更数据捕获事务的第一个 LSN。 |
last_commit_cdc_lsn | nvarchar(23) | 包含变更数据捕获事务的最后一个提交日志记录的 LSN。 当 session_id = 0 时,为包含变更数据捕获事务的任意会话的最后一个提交日志记录的 LSN |
last_commit_cdc_time | datetime | 包含变更数据捕获事务的最后一个提交日志记录的处理时间。 当 session_id = 0 时,为包含变更数据捕获事务的任意会话的最后一个提交日志记录的处理时间。 |
latency | int | 会话中 end_time 与 last_commit_cdc_time 之间的差(以秒为单位)。 此计数器在第 7 阶段的最后填充。当 session_id = 0 时,为某个会话记录的最后一个非零延迟值。 |
empty_scan_count | int | 不包含变更数据捕获事务的连续会话数。 |
failed_sessions_count | int | 失败的会话数。 |
注解
sys.dm_cdc_log_scan_sessions
DMV 最多包含 32 个扫描会话,以及所有session_id= 0
扫描会话的聚合。 因此,在任何给定时间,此动态管理视图最多可以包含 33 行。
权限
需要 VIEW DATABASE STATE 权限才能查询 sys.dm_cdc_log_scan_sessions
动态管理视图。 有关动态管理视图权限的详细信息,请参阅动态管理视图和函数 (Transact-SQL)。
SQL Server 2022 及更高版本的权限
需要对数据库拥有 VIEW DATABASE PERFORMANCE STATE 权限。
示例
下例返回最新会话的信息。
USE AdventureWorks2022;
GO
SELECT session_id, start_time, end_time, duration, scan_phase,
error_count, start_lsn, current_lsn, end_lsn, tran_count,
last_commit_lsn, last_commit_time, log_record_count, schema_change_count,
command_count, first_begin_cdc_lsn, last_commit_cdc_lsn,
last_commit_cdc_time, latency, empty_scan_count, failed_sessions_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);
GO