【问题标题】:Best way to find free space in sql server databases?在 sql server 数据库中查找可用空间的最佳方法?
【发布时间】:2010-10-26 08:28:37
【问题描述】:

我希望能够找出我的数据库文件中还剩下多少空间,这样我就可以知道何时增加空间,这样当应用程序用尽时就不会这样做。

我希望能够编写脚本,这样我就可以定期跨多个数据库运行它。

我有 SQL Server 2000 和 SQL Server 2005 数据库,但我希望能够在这两个数据库上运行相同的脚本。

我可以使用 Management Studio 在 2005 数据库上手动执行此操作,但不能在 2000 数据库上。

【问题讨论】:

  • “硬”时让服务器这样做有什么问题?
  • 当文件扩展时,sql server 基本上会停止。这是因为没有地方可以写任何信息。
  • 那是 SQL 2000,也许新版本做得更好

标签: sql sql-server sql-server-2005


【解决方案1】:

我已编辑 Michael Petrotta 查询以添加可用空间百分比列。

SELECT DISTINCT
    SUBSTRING(volume_mount_point, 1, 1) AS volume_mount_point
    ,total_bytes/1024/1024 AS total_MB
    , available_bytes/1024/1024 AS available_MB
    ,((available_bytes/1024*1024) *100/(total_bytes/1024*1024)) as free_percent
FROM
    sys.master_files AS f
CROSS APPLY
    sys.dm_os_volume_stats(f.database_id, f.file_id);

【讨论】:

    【解决方案2】:

    运行以下命令以了解您的 SQL Server 2000 中当前有多少可用空间:

    DECLARE @command VARCHAR(5000)   
    DECLARE @DBInfo TABLE   
    ( ServerName VARCHAR(100),   
    DatabaseName VARCHAR(100),   
    PhysicalFileName NVARCHAR(520),   
    FileSizeMB DECIMAL(10,2),   
    SpaceUsedMB DECIMAL(10,2),   
    FreeSpaceMB DECIMAL(10,2), 
    FreeSpacePct varchar(8) 
    ) 
    
    SELECT @command = 'Use [' + '?' + '] SELECT   
    @@servername as ServerName,   
    ' + '''' + '?' + '''' + ' AS DatabaseName   , filename 
        , convert(decimal(12,2),round(a.size/128.000,2)) as FileSizeMB 
        , convert(decimal(12,2),round(fileproperty(a.name,'+''''+'SpaceUsed'+''''+')/128.000,2)) as SpaceUsedMB 
        , convert(decimal(12,2),round((a.size-fileproperty(a.name,'+''''+'SpaceUsed'+''''+'))/128.000,2)) as FreeSpaceMB, 
        CAST(100 * (CAST (((a.size/128.0 -CAST(FILEPROPERTY(a.name,' + '''' + 'SpaceUsed' + '''' + ' ) AS int)/128.0)/(a.size/128.0)) AS decimal(4,2))) AS varchar(8)) + ' + '''' + '%' + '''' + ' AS FreeSpacePct 
    from dbo.sysfiles a' 
    
    INSERT INTO @DBInfo 
    EXEC sp_MSForEachDB @command   
    
    SELECT * from @DBInfo
    

    【讨论】:

      【解决方案3】:

      可以运行 SQL 脚本来手动检查可用空间。但是最好创建工作并分配警报以在没有足够空间时自动通知管理员。

      我找到的最好的文章 - Managing Database Data Usage With Custom Space Alerts(需要 SQLServerCentral 登录)即使没有太多 DBA 经验的支持人员也可以阅读。

      你也可以使用类似的文章Monitor database file sizes with SQL Server Jobs

      对于手动检查,我更喜欢 sp_SOS(可以从 http://searchsqlserver.techtarget.com/tip/Find-size-of-SQL-Server-tables-and-other-objects-with-stored-procedure)

      EXEC dbo.sp_SOS @OrderBy='T' 
      

      【讨论】:

        【解决方案4】:

        试试sp_spaceused

        显示行数,磁盘 保留空间,以及使用的磁盘空间 表、索引视图或服务 当前数据库中的代理队列, 或显示保留的磁盘空间 并被整个数据库使用。

        我相信这在 SQL Server 2000 中存在,但我无法证明这一点。它适用于 2005 年和 2008 年。

        如果您想将其与某些服务器端逻辑联系起来,您可以使用 sp_helptext 查看它。

        编辑:在下面扩展我的评论,感谢http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=82359 的原始贡献者,这是一种按文件细分使用情况的方法:

        select
              name
            , filename
            , convert(decimal(12,2),round(a.size/128.000,2)) as FileSizeMB
            , convert(decimal(12,2),round(fileproperty(a.name,'SpaceUsed')/128.000,2)) as SpaceUsedMB
            , convert(decimal(12,2),round((a.size-fileproperty(a.name,'SpaceUsed'))/128.000,2)) as FreeSpaceMB
        from dbo.sysfiles a
        

        【讨论】:

        【解决方案5】:

        对我来说,sql server 总是自动分配更多空间,直到硬盘满了,所以只要查询硬盘上的空闲空间。

        您必须使用哪些设置来增加数据库的“空间”?

        【讨论】:

        • SQL Server 在其数据文件中维护未使用的空间。当可用空间用完时,SQL Server 将增大文件以适应。在此增长期间,数据库性能可能会受到影响。考虑到我的数据,我通常将自动增长大小设置为合理的值,然后让它继续。
        • 关于文件系统上的可用空间的查询会做出很多假设,尤其是当数据很容易从 SQL 服务器获得时。如果 dba 知道容量趋势,那么增长脚本可以完成不影响性能的工作(内置功能几乎肯定会影响性能)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 2015-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多