监控 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,包括 BACKUP
、SNAPSHOT
和 LOG SCANs
的创建,等等事情会阻止您的数据库创建这些检查点,并且在这些事务完成之前,您的数据库将不受保护。
您当前的系统依赖于 .bak
文件的正确版本,这取决于大小可能意味着数小时的潜在损失。
换句话说,它的大小如此荒谬,因为您的数据库无法创建检查点来足够频繁地截断这些事务....
a little note on log files
最重要的是,每次提交事务时不会自动截断日志文件(否则,您只能返回上次提交的事务)。经常进行日志备份将确保相关更改得以保留(时间点),并且 SHRINKFILE
会将日志文件压缩到指定的最小大小 available/size。
使用 DBCC SQLPERF(logspace) 查看您的日志文件有多少正在使用以及它有多大。执行完整备份后,日志文件将被截断为剩余的 uncommitted/active 个事务。 (不要将其与缩小大小混淆)
关于研究交易的一些建议:
- 您可以使用系统表查看最昂贵的缓存、频繁和活动计划。
- 您可以使用未记录的扩展存储过程搜索日志文件,
fn_dblog
。
- Pinal 提供了有关此主题的重要信息,您可以在此网页和 link 上阅读这些信息:
Beginning Reading Transaction Log
在客户端机器上部署项目后,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,包括BACKUP
、SNAPSHOT
和LOG SCANs
的创建,等等事情会阻止您的数据库创建这些检查点,并且在这些事务完成之前,您的数据库将不受保护。您当前的系统依赖于
.bak
文件的正确版本,这取决于大小可能意味着数小时的潜在损失。
换句话说,它的大小如此荒谬,因为您的数据库无法创建检查点来足够频繁地截断这些事务....
a little note on log files
最重要的是,每次提交事务时不会自动截断日志文件(否则,您只能返回上次提交的事务)。经常进行日志备份将确保相关更改得以保留(时间点),并且 SHRINKFILE
会将日志文件压缩到指定的最小大小 available/size。
使用 DBCC SQLPERF(logspace) 查看您的日志文件有多少正在使用以及它有多大。执行完整备份后,日志文件将被截断为剩余的 uncommitted/active 个事务。 (不要将其与缩小大小混淆)
关于研究交易的一些建议:
- 您可以使用系统表查看最昂贵的缓存、频繁和活动计划。
- 您可以使用未记录的扩展存储过程搜索日志文件,
fn_dblog
。 - Pinal 提供了有关此主题的重要信息,您可以在此网页和 link 上阅读这些信息: Beginning Reading Transaction Log