【问题标题】:How can I get the size of the Transaction Log in SQL 2005 programmatically?如何以编程方式获取 SQL 2005 中事务日志的大小?
【发布时间】:2010-09-16 22:25:57
【问题描述】:

我们在我们的数据库上使用固定的事务日志大小,我想组合一个应用程序来监控日志大小,以便我们可以看到什么时候事情变得过于紧张,我们需要增加固定的 trn日志。

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

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      谷歌快速搜索发现:

      DBCC SQLPERF ( LOGSPACE )
      

      您为什么不在事务日志上使用自动增长?看起来这将是一个更可靠的解决方案。

      【讨论】:

      • 不是我的选择。 DBA 说静态大小的事务日志更有效。
      • 我更像是一个 SQL 开发人员,而不是一个严格的 DBA,但只有当日志文件的大小不正确并且必须经常自行增长时,性能才会受到影响。增长的实际行为会消耗一些性能,但无论如何,自动增长应该主要用于不可预见的紧急情况。
      • DBCC SQLPERF 需要额外的服务器权限,这就是我选择 sys.database 文件答案的原因。 DBCC SQLPerf 确实具有同时为您提供所有数据库的优势......
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这不是我的想法,所以你可能想仔细检查数学......

        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!

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

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

            另外,也许您会发现以下文章很有用:How to stop the transaction log of a SQL Server database from growing unexpectedly

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-12-27
              • 1970-01-01
              • 1970-01-01
              • 2015-09-26
              • 2010-11-28
              • 1970-01-01
              • 1970-01-01
              • 2011-11-27
              相关资源
              最近更新 更多