题
好吧,我已经尝试了这个答案搜索周围,但没有运气。我在工作中有我们的SQL Server上约50个数据库,我几乎每天都在检查,看是否有空间,可以通过缩小被释放。我们的驱动器往往填补了很多,所以这就是为什么它是一个几乎每日任务。
是否有一个快速的方法来检查哪些数据库实际可用空间?有谁知道一个系统/自定义存储过程或系统视图,可以生成每个数据库的列表以及有多少可用空间是可用的数据库上进行缩水?
顺便提及,使用SQL Server 2005。
解决方案
运行的 sp_spacedused 作为每个数据库:
--temporary table to hold database names
CREATE TABLE #Databases (name varchar(255))
INSERT INTO #Databases
SELECT name FROM master..sysdatabases
DECLARE abc CURSOR FOR
SELECT name FROM #Databases
DECLARE @name varchar(255)
DECLARE @sql nvarchar(1024)
OPEN abc
FETCH NEXT FROM abc INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
--build sql to switch to that database...
SET @sql = 'USE '+@name
PRINT @sql
EXECUTE (@sql)
--and run spaceused on it
SET @sql = 'EXECUTE sp_spaceused @UpdateUsage=True'
PRINT @sql
EXECUTE (@sql)
FETCH NEXT FROM ABC INTO @name
END
CLOSE abc
DEALLOCATE abc
DROP TABLE #Databases
样品奇异结果
<强>执行T-SQL:强>
USE Contoso
EXECUTE sp_spaceused @UpdateUsage=True
<强>结果:强>
database_name: Contoso
database_size: 85.13 MB
unallocated_space: 15.41 MB
reserved: 70,368 KB (68.7 MB)
data: 42,944 KB (41.9 MB)
index_size: 24,200 KB (23.6 MB)
unused: 3,224 KB ( 3.1 MB)
<强>收缩:强>
DBCC SHRINKDATABASE (Contoso)
检查空间再次:强>
EXECUTE sp_spaceused @UpdateUsage=True
<强>结果:强>
database_name: Contoso
database_size: 69.81 MB
unallocated_space: 0.20 MB
reserved: 70,256 KB (68.6 MB)
data: 43,024 KB (42.0 MB)
index_size: 24,200 KB (23.6 MB)
unused: 3,032 KB ( 3.0 MB)
其他提示
答案是:不要担心多少可用空间存在于数据库中,而是运行在运行压实每晚或每周的维护任务。赔率是你不压缩你的日志文件(这是我平时有最具成长性)。
运行完整的备份,然后运行与TRUNCATE_ONLY事务日志备份和一旦完成,你的日志文件和数据库上运行DBCC SHRINKFILE()。
然后,你只需要监视总的可用磁盘空间,而不是单独的数据库增长。
SQL Server的收缩数据库。你绝对要执行完全备份和事务日志备份之前,这会工作。
您可以获取有关通过运行加载的单个文件信息 'SELECT * FROM master.dbo.sysdatabases中',并运行 '从[DBNAME]选择* .. sysfiles'。我不是100%,我还没有在将近一年的触摸SQL Server实例,sysfiles可能是“主”数据库。
可能是一些在WMI或SQL视图。但我要问 - 如何你的时间每天都围绕这个戳的成本比较购买一些磁盘驱动器
您可以使用注释sp_spaceused和消耗及其结果,或者你可以看看自己在sys.allocations_units表,计算总使用的页面。你不应该看“数据库”的水平,但在文件级,因为有些人可能有多个无本金交割远期。与sys.database_files中开始看到在数据库文件中的所有文件。尺寸列将包含在数据库中的总页数。总和向上从sys.allocation_units的总页数,以获得所用的网页:
with sum_au as (
select data_space_id
, sum(total_pages) as total_pages
from sys.allocation_units au
group by data_space_id)
select ds.name
, df.size
, total_pages as in_use
from sys.database_files df
join sys.data_spaces ds on df.data_space_id = ds.data_space_id
join sum_au au on au.data_space_id = ds.data_space_id