在负载测试期间,测试服务器在几个小时内将 tempdb 日志文件增加到 8 GB,而分配的 12 GB 已用完。tempdb 数据文件几乎没有文件空间使用。在 tempdb 中运行 DBCC OPENTRAN,几秒钟内没有打开任何事务。我正在运行 SQL Server 2005,并且读取快照隔离已关闭。
我如何确定什么正在消耗 tempdb 日志?
答案1
Tempdb 的日志与用户数据库中的日志在某些方面有所不同。
在 tempdb 中,只记录 UNDO 信息,而不是 REDO 和 UNDO,因为 tempdb 中的事务只会回滚,永远不会前滚。这是因为 tempdb 上从未运行过崩溃恢复,因此永远不会使用 REDO 信息。如果您不明白这些术语的含义,请参阅我的 TechNet 杂志文章了解 SQL Server 中的日志记录和恢复。但请注意,所有对 tempdb 进行更改的操作将要被记录- tempdb 不是“未记录的”。
Tempdb 的日志不会像其他数据库日志那样被清除/截断(再次参见文章)。在 tempdb 中,日志将在检查点处截断(与常规 SIMPLE 恢复模型一样),但检查点不会像在用户数据库中那样时常自动发生。在用户数据库中,检查点发生是为了尝试限制运行崩溃恢复所需的时间(通过强制将脏页写入磁盘,从而限制必须执行的 REDO 恢复量)并批量更新页面以减少执行的 I/O 总量。
因此,仅当 tempdb 日志使用量达到日志总大小的一定比例(大约 70%)时,才会出现 tempdb 中的检查点,因为恢复时间无关紧要。
总而言之,您的 tempdb 日志的行为完全符合预期。
希望这可以帮助。
答案2
tempdb 的日志会像其他事务日志一样增长。所有内容都会被记录到下一个检查点,此时日志条目会被标记为可以覆盖。默认情况下,检查点每分钟左右运行一次,因此如果 tempdb 中发生了很多事情(由于您正在进行负载测试,因此 tempdb 中可能有很多事情正在发生),那么日志就会像这样增长。
如果您的负载测试与生产负载相匹配,那么您可以预期生产 tempdb 日志也会增长到这个大小。
答案3
您可以使用 SQL Profiler 查看哪些用户/应用程序正在执行需要 tempdb 存储的操作。