监控 SQL 日志文件

Monitoring SQL Log File

在客户端机器上部署项目后,sqldb日志文件已经增长到450G,虽然db大小不到100MB,日志模式设置为简单模式,并且事务是从 windows 服务发送的,该服务每 30 秒发送一次插入和更新事务。 我的问题是,如何知道数据库日志文件增长的原因? 我想知道如何监视日志文件以了解导致问题的确切事务是什么。 我应该调试前端吗?或者暴露导致数据库日志文件增长的事务。 谢谢。

日志文件是文本文件,根据您的日志级别以及您收到的错误和消息的数量,这些文件会增长得非常快。

您需要使用 logrotate 之类的内容轮换日志,尽管从您的问题看来您正在使用 Windows,因此不确定解决方案是什么。

日志轮换的基础是获取 daily/weekly 版本的日志,并使用 gzip 或类似工具压缩它们并丢弃未压缩的版本。

由于它是有很多重复的文本,相比之下,这会使文件非常非常小,应该可以解决您的存储问题。

日志文件 space 将不会被重复使用,如果有未完成的事务。您可以使用下面的 DMV 验证日志 space 重复使用的原因..

select log_reuse_wait_desc,database_id from sys.databases

在你的情况下,你的数据库设置为简单,数据库为 100 MB..但是日志已经增长到 450 GB..这是非常大的..

我的理论是,可能有一些未完成的事务,这阻止了日志 space 重用。日志文件一旦增长就不会缩小..

据了解,您可以 运行 在 DMV 上方查看,此时阻止日志 space 重用的原因是什么,您无法及时返回了解是什么阻止了日志 space重用

请注意,简单恢复模型不允许日志备份,因为它保留的信息量最少并且依赖于 CHECKPOINT,因此如果这是一个关键数据库,请考虑使用FULL RECOVERY 计划。是的,您必须使用更多 space,但磁盘 space 很便宜,您可以更好地控制时间点恢复和管理日志文件。尽量简洁:

  • A) 简单模式下的数据库将只截断事务日志中的事务,就像创建 CHECKPOINT 时一样。

  • B) 不幸的是,uncommitted transactions 的 large/lots,包括 BACKUPSNAPSHOTLOG SCANs 的创建,等等事情会阻止您的数据库创建这些检查点,并且在这些事务完成之前,您的数据库将不受保护。

  • 您当前的系统依赖于 .bak 文件的正确版本,这取决于大小可能意味着数小时的潜在损失。

换句话说,它的大小如此荒谬,因为您的数据库无法创建检查点来足够频繁地截断这些事务....

a little note on log files

最重要的是,每次提交事务时不会自动截断日志文件(否则,您只能返回上次提交的事务)。经常进行日志备份将确保相关更改得以保留(时间点),并且 SHRINKFILE 会将日志文件压缩到指定的最小大小 available/size。

使用 DBCC SQLPERF(logspace) 查看您的日志文件有多少正在使用以及它有多大。执行完整备份后,日志文件将被截断为剩余的 uncommitted/active 个事务。 (不要将其与缩小大小混淆)

关于研究交易的一些建议:

  • 您可以使用系统表查看最昂贵的缓存、频繁和活动计划。
  • 您可以使用未记录的扩展存储过程搜索日志文件,fn_dblog
  • Pinal 提供了有关此主题的重要信息,您可以在此网页和 link 上阅读这些信息: Beginning Reading Transaction Log