我们的数据库使用固定的事务日志大小,我想编写一个应用程序来监控日志大小,以便在空间不足时,我们可以增加固定的事务日志。
有没有TSQL命令可以告诉我当前事务日志的大小和固定的限制?
有没有TSQL命令可以告诉我当前事务日志的大小和固定的限制?
我使用了你的代码,但是在转换为整数时出现错误。 "Msg 8115,Level 16,State 2,Line 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
从系统视图中,您可以获得更多信息,例如增长增量、日志是否设置为自动增长以及是按特定数量还是按百分比增长。
希望对您有所帮助!
对于 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
如果您真的需要坚持使用固定大小的事务日志,我建议将其设置为合理的大小,留有一些余地,然后执行以下两个操作之一:
或者
此外,也许您会发现以下文章有用:如何防止 SQL Server 数据库的事务日志意外增长。