代码之家  ›  专栏  ›  技术社区  ›  Adam Ness

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

  •  20
  • Adam Ness  · 技术社区  · 16 年前

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

    6 回复  |  直到 16 年前
        1
  •  31
  •   Luke Girvin Nathan Bedford    9 年前

    我使用了您的代码,但转换为int时出错。

    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
  •  21
  •   Eric Z Beard    16 年前

    DBCC SQLPERF ( LOGSPACE )
    

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

        3
  •  13
  •   Martin Brown    8 年前

    使用sys.database_files只提供日志文件的大小,而不提供其中日志的大小。如果你的文件是固定大小的,这就没有多大用处了。dbccsqlperf(LOGSPACE)有点老派,但如果需要支持较旧版本的SQLServer,它可以很好地工作。

    相反,您可以使用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
  •  7
  •   Tom H zenazn    16 年前

    这是我脑子里想不出来的,所以你可能想仔细检查一下数学。。。

    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
    

    您可以从该系统视图中获得更多信息,例如增长增量、日志是否设置为自动增长,以及日志是否设置为按特定数量或百分比增长。

    嗯!

        5
  •  1
  •   Diego    16 年前

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

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

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

        6
  •  1
  •   James    8 年前

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