TempDB 日志空间和 ACTIVE_TRANSACTION

Tom*_*Tom 8 sql-server tempdb transaction-log

我们的监控解决方案 (SCOM) 当前标记 tempdb 日志空间不足。但是,我们将日志的自动增长设置为 1GB 块,并且驱动器上还有 25GB 的空间。

我看了看那是什么log_reuse_wait_desc,发现它是ACTIVE_TRANSACTION

我开始怀疑是否出于某种原因日志文件被填满并且自动增长没有启动,经过一些研究我发现即使在ACTIVE_TRANSACTION.

我找到了一篇关于 tempdb 日志空间不足的类似问题的文章:

http://sqltimes.wordpress.com/2014/07/05/sql-server-error-messages-the-transaction-log-for-database-tempdb-is-full-due-to-active_transaction/

他们在这里发布了一个CHECKPOINT解决问题的关于tempdb. 我知道CHECKPOINT将脏页刷新到磁盘,但是我不明白这将如何解决ACTIVE_TRANSACTION问题?

此外,我也不知道为什么在有足够空间时我们会收到此警报。是否存在tempdb罐头填充和自动增长由于某种原因不起作用的情况?

Bob*_*mes 4

正如 Max 提到的,警报可能在日志增长/需要增长之前触发。SCOM 收集事务日志可用空间百分比,尽管我不确定警报将在什么阈值下触发。

这是一个简单的示例,向您展示当您收到这些警报但没有日志文件增长时 tempdb 可能处于什么状态。

首先创建数据库,设置recovery为full,并备份

    create database tlogspace
    on(name=tlogspace_dat,
        filename='c:\temp\tlogspace.mdf',
        size=4MB)
    log on (name=tlogspace_log,
        filename='c:\temp\tlogspace.ldf',
        size=1MB);
    go

    alter database tlogspace set recovery full;
    go
    backup database tlogspace to disk='nul';
    go
Run Code Online (Sandbox Code Playgroud)

现在切换到该数据库,创建一个表,然后运行​​DBCC sqlperf(logspace)以检查日志文件中的大小和可用空间。

use tlogspace
go

create table data(id int identity(1,1), col varchar(8000))
dbcc sqlperf(logspace)
Run Code Online (Sandbox Code Playgroud)

在我的系统上,我的日志文件大小为 0.9921875,使用的日志空间 (%) 为 48.4245。现在将一些数据插入表中并再次运行 DBCC sqlperf(logspace)。在我的系统上,插入的 45 行给出了所需的结果(插入的行数可能需要调整)。

insert into data(col)
select replicate('a',8000)
go 45 --may need to adjust number
dbcc sqlperf(logspace)
Run Code Online (Sandbox Code Playgroud)

这次,DBCC sqlperf 输出应显示日志大小相同,但使用的日志空间略低于 100%。在这种情况下,SCOM 可能会发出日志空间不足的警报。不再有任何活动导致日志文件增长,并且(在本示例中)没有 tlog 备份来释放已用空间。tempdb 处于简单恢复状态,因此您的活动事务可能耗尽了大部分可用空间并且没有释放它,但 tempdb 中没有足够的活动来触发日志文件增长,从而导致警报触发。

完成后清理数据库

use master
drop database tlogspace
Run Code Online (Sandbox Code Playgroud)