【发布时间】:2010-09-16 22:25:57
【问题描述】:
我们在我们的数据库上使用固定的事务日志大小,我想组合一个应用程序来监控日志大小,以便我们可以看到什么时候事情变得过于紧张,我们需要增加固定的 trn日志。
是否有任何可以运行的 TSQL 命令告诉我事务日志的当前大小以及事务日志的固定限制?
【问题讨论】:
标签: sql-server tsql
我们在我们的数据库上使用固定的事务日志大小,我想组合一个应用程序来监控日志大小,以便我们可以看到什么时候事情变得过于紧张,我们需要增加固定的 trn日志。
是否有任何可以运行的 TSQL 命令告诉我事务日志的当前大小以及事务日志的固定限制?
【问题讨论】:
标签: sql-server tsql
我使用了您的代码,但是转换为 int 时出错。 “消息 8115,级别 16,状态 2,第 1 行算术溢出错误,将表达式转换为数据类型 int。”所以无论哪里有“*8”,我都把它改成了*8.0,代码就可以完美运行了。
SELECT (size * 8.0)/1024.0 AS size_in_mb
, CASE
WHEN max_size = -1
THEN 9999999 -- Unlimited growth, so handle this how you want
ELSE (max_size * 8.0)/1024.0 END AS max_size_in_mb
FROM YOURDBNAMEHERE.sys.database_files
WHERE data_space_id = 0
【讨论】:
谷歌快速搜索发现:
DBCC SQLPERF ( LOGSPACE )
您为什么不在事务日志上使用自动增长?看起来这将是一个更可靠的解决方案。
【讨论】:
使用 sys.database_files 只会为您提供日志文件的大小,而不是其中的日志大小。如果您的文件是固定大小的,这没什么用处。 DBCC SQLPERF ( LOGSPACE ) 有点老派,但如果您需要支持旧版本的 SQL Server,则效果很好。
相反,您可以像这样使用 dm_os_performance_counters 表:
SELECT
RTRIM(instance_name) [database],
cntr_value log_size_kb
FROM
sys.dm_os_performance_counters
WHERE
object_name = 'SQLServer:Databases'
AND counter_name = 'Log File(s) Used Size (KB)'
AND instance_name <> '_Total'
【讨论】:
这不是我的想法,所以你可能想仔细检查数学......
SELECT
(size * 8)/1024.0 AS size_in_mb,
CASE
WHEN max_size = -1 THEN 9999999 -- Unlimited growth, so handle this how you want
ELSE (max_size * 8)/1024.0
END AS max_size_in_mb
FROM
MyDB.sys.database_files
WHERE
data_space_id = 0 -- Log file
您可以从该系统视图中获得更多信息,例如增长增量、日志是否设置为自动增长以及是否设置为按特定数量或百分比增长。
HTH!
【讨论】:
对于 SQL 2008 及更高版本,FILEPROPERTY 还公开了文件中使用的空间量,并且比所有其他答案都简单得多:
select [Name], physical_name [Path], CAST(size AS BIGINT)*8192 [TotalBytes], CAST(FILEPROPERTY(name,'SpaceUsed') AS BIGINT)*8192 [UsedBytes], (case when max_size<0 then -1 else CAST(max_size AS BIGINT)*8192 end) [MaxBytes]
from sys.database_files
【讨论】:
如果您确实需要坚持固定大小的事务日志,我建议将其设置为合理的大小,允许一些余量,然后执行以下两项之一:
或
另外,也许您会发现以下文章很有用:How to stop the transaction log of a SQL Server database from growing unexpectedly。
【讨论】: