如何在 VLF 中找到活动交易?

got*_*tqn 4 sql-server sql-server-2012 transaction-log

有没有办法找到作为阻止重用事务日志文件 VLF 的活动事务的一部分的 T-SQL 语句?

我每 15 分钟执行一次 tlog 备份,但有时会返回以下查询ACTIVE_TRANSACTIONLOG_BACKUP(甚至这样):

SELECT [name]
      ,[recovery_model_desc] 
      ,[log_reuse_wait_desc]
FROM [sys].[databases]
Run Code Online (Sandbox Code Playgroud)

如果我运行,DBCC Loginfo我可以看到 firsts 和 lasts 行都有 status 0

Han*_*non 5

LOG_REUSE_WAIT_DESCLOG_BACKUP随时显示至少有一个事务尚未备份(当数据库处于完全恢复模式时)。

通过查看此查询的结果,您可以查看每个会话的活动会话、请求和事务计数:

SELECT SessionID = s.session_id
    , HostName = s.host_name
    , ProgramName = s.program_name
    , SessionElapsedTime = s.total_elapsed_time
    , RequestCommand = r.command
    , DatabaseName = d.name
    , StatementExecuting = case when r.statement_end_offset > 0 THEN 
            SUBSTRING(t.text, r.statement_start_offset, r.statement_end_offset - 
            r.statement_start_offset) 
            ELSE t.text END
    , tst.open_transaction_count
FROM sys.dm_exec_sessions s
    LEFT JOIN sys.dm_exec_connections c ON s.session_id = c.session_id
    LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
    LEFT JOIN sys.databases d ON r.database_id = d.database_id
    LEFT JOIN sys.dm_tran_session_transactions tst ON s.session_id = tst.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果我将该查询包装在一个事务中,您可以看到该open_transaction_count字段显示1,这是预期的,因为我的平板电脑上没有其他正在进行的活动。

在此处输入图片说明