Sql server 2005 以编程方式确定数据库上的可用空间?
好的,我试着四处寻找这个答案,但是没有运气。我在工作的SQL Server上有大约50个数据库,我几乎每天都要检查这些数据库,看看是否可以通过收缩来释放空间。我们的驱动器往往会充满很多,这就是为什么它几乎是一项日常任务 有没有一种快速的方法来检查哪些数据库实际上有可用空间?是否有人知道可以生成每个数据库列表的系统/自定义存储过程或系统视图,以及该数据库上有多少可用空间可以收缩Sql server 2005 以编程方式确定数据库上的可用空间?,sql-server-2005,shrink,Sql Server 2005,Shrink,好的,我试着四处寻找这个答案,但是没有运气。我在工作的SQL Server上有大约50个数据库,我几乎每天都要检查这些数据库,看看是否可以通过收缩来释放空间。我们的驱动器往往会充满很多,这就是为什么它几乎是一项日常任务 有没有一种快速的方法来检查哪些数据库实际上有可用空间?是否有人知道可以生成每个数据库列表的系统/自定义存储过程或系统视图,以及该数据库上有多少可用空间可以收缩 顺便说一下,使用sql server 2005。可能是WMI或sql视图中的某些内容。但是我得问一下-与购买一些磁盘驱动
顺便说一下,使用sql server 2005。可能是WMI或sql视图中的某些内容。但是我得问一下-与购买一些磁盘驱动器相比,您每天花在这方面的时间成本是多少?答案是不必担心数据库中有多少可用空间,而是每晚或每周运行一次压缩维护任务。很可能您没有压缩日志文件(这是我通常增长最多的地方) 运行完整备份,然后仅使用TRUNCATE_运行事务日志备份,完成后,在日志文件和数据库上运行DBCC SHRINKFILE() 然后,您只需监视总可用磁盘空间,而不必监视单个数据库的增长 。您必须先执行完整备份和事务日志备份,然后才能正常工作 您可以通过运行“select*from master.dbo.sysdatabases”和运行“select*from[dbname]…sysfiles”来获取有关加载的各个文件的信息。我不是100%,我已经有将近一年没有接触过SQL Server实例了,系统文件可能在“主”数据库中
为每个数据库运行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)
结果:
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)
收缩:
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)
再次检查空格:
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)
结果:
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)
您可以使用sp_spaceused并使用其结果,也可以在sys.allocations_units表中查找自己并计算总使用页面数。您不应该看“数据库”级别,而应该看文件级别,因为有些可能有多个NDF。从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
这就是我所要求的,但显然它比买空间便宜:)。此外,如果我们购买更多的空间,我们的用户很可能会很快再次使用它,即使我们告诉他们删除旧表等等。这是一种恶性循环。我同意Ryanulit的观点。虽然有些问题可以用更多的空间来解决,但您只是隐藏了原始问题,即可用空间的管理。即使在日志文件上,计划的收缩作业也不是一个好主意。代码并没有完全起作用,但它让我朝着正确的方向前进。谢谢抱歉,选择最佳答案时出现延迟。