如何以编程方式获取SQL 2005中的事务日志的大小?

时间:2008-10-13 17:29:16

标签: sql-server tsql

我们在数据库上使用固定的事务日志大小,并且我想组建一个应用程序来监视日志大小,这样我们就可以看到事情变得太紧,我们需要增加固定的trn登录。

我是否可以运行任何TSQL命令,它会告诉我当前事务日志的大小以及事务日志的固定限制?

6 个答案:

答案 0 :(得分:30)

我使用了你的代码,但转换为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           

答案 1 :(得分:20)

快速谷歌搜索显示:

DBCC SQLPERF ( LOGSPACE )

为什么不在事务日志中使用自动增长?这似乎是一个更可靠的解决方案。

答案 2 :(得分:13)

使用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'

答案 3 :(得分:7)

这是我的头脑,所以你可能想要仔细检查数学......

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!

答案 4 :(得分:1)

如果您确实需要坚持使用固定大小的事务日志,我建议将其设置为合理的大小,允许一些余量,然后执行以下两种操作之一:

  • 如果您不需要时间点恢复,请将数据库恢复模式设置为SIMPLE。简单来说,它将允许事务日志“自我回收”空间。

OR

  • 如果必须将恢复模式保持为FULL,请安排执行事务日志备份的作业。这将释放事务日志中的空间,并允许您根据需要进行时间点恢复。

此外,您可以找到以下文章:How to stop the transaction log of a SQL Server database from growing unexpectedly

答案 5 :(得分:1)

对于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