Ken*_*Kan 2 sql-server-2008 sql-server disk-space
我对 SQL Server 很陌生。我想收集整个 SQL Server 实例的数据库磁盘空间指标。
我找到了一个代码示例,可以收集每个数据库的磁盘空间信息。
IF OBJECT_ID('DISK.dbo.disk_activity') IS NOT NULL
DROP TABLE disk_activity
CREATE TABLE disk_activity (
servername NVARCHAR(100)
, database_id INT PRIMARY KEY
, name NVARCHAR(MAX)
, data_used_size DECIMAL(18,2)
, log_used_size DECIMAL(18,2)
)
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = STUFF((
SELECT '
USE [' + d.name + ']
INSERT INTO DISK.dbo.disk_activity (servername, database_id, name, data_used_size, log_used_size)
SELECT
(SELECT @@SERVERNAME AS "Server Name") AS SERVER_NAME
, DB_ID()
, DB_NAME()
, SUM(CASE WHEN [type] = 0 THEN space_used END)
, SUM(CASE WHEN [type] = 1 THEN space_used END)
FROM (
SELECT s.[type], space_used = SUM(FILEPROPERTY(s.name, ''SpaceUsed'') * 8. / 1024)
FROM sys.database_files s
GROUP BY s.[type]
) t;'
FROM sys.databases d
WHERE d.[state] = 0
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
EXEC sys.sp_executesql @SQL
Run Code Online (Sandbox Code Playgroud)
但是,我想收集整个服务器的指标,即为所有数据库分配的总磁盘空间、已使用的总磁盘空间、可用的总磁盘空间和已使用的磁盘空间百分比。
我应该如何修改上述脚本或是否有其他选项可用?
为了监控磁盘空间使用情况和数据库文件大小,我使用了这个脚本,你可以在我的博客上找到它:
-- create a temporary table to hold data from sys.master_files
IF OBJECT_ID('tempdb..#masterfiles') IS NOT NULL
DROP TABLE #masterfiles;
CREATE TABLE #masterfiles (
database_id int,
type_desc varchar(10),
name sysname,
physical_name varchar(255),
size_mb int,
max_size_mb int,
growth int,
is_percent_growth bit,
data_space_id int,
data_space_name nvarchar(128) NULL,
drive nvarchar(512),
mbfree int
);
-- extract file information from sys.master_files
-- and correlate each file to its logical volume
INSERT INTO #masterfiles
SELECT
mf.database_id
,type_desc
,name
,physical_name
,size_mb = size / 128
,max_size_mb =
CASE
WHEN max_size = 268435456 AND type_desc = 'LOG' THEN -1
ELSE
CASE
WHEN max_size = -1 THEN -1
ELSE max_size / 128
END
END
,mf.growth
,mf.is_percent_growth
,mf.data_space_id
,NULL
,d.volume_mount_point
,d.available_bytes / 1024 / 1024
FROM sys.master_files AS mf
CROSS APPLY sys.dm_os_volume_stats(database_id, file_id) AS d;
-- add an "emptyspace" column to hold empty space for each file
ALTER TABLE #masterfiles ADD emptyspace_mb int NULL;
-- iterate through all databases to calculate empty space for its files
DECLARE @name sysname;
DECLARE c CURSOR FORWARD_ONLY READ_ONLY STATIC LOCAL
FOR
SELECT name
FROM sys.databases
WHERE state_desc = 'ONLINE'
OPEN c
FETCH NEXT FROM c INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql nvarchar(max)
DECLARE @statement nvarchar(max)
SET @sql = '
UPDATE mf
SET emptyspace_mb = size_mb - FILEPROPERTY(name,''SpaceUsed'') / 128,
data_space_name =
ISNULL(
(SELECT name FROM sys.data_spaces WHERE data_space_id = mf.data_space_id),
''LOG''
)
FROM #masterfiles AS mf
WHERE database_id = DB_ID();
'
SET @statement = 'EXEC ' + QUOTENAME(@name) + '.sys.sp_executesql @sql'
EXEC sp_executesql @statement, N'@sql nvarchar(max)', @sql
FETCH NEXT FROM c INTO @name
END
CLOSE c
DEALLOCATE c
-- create a scalar function to simulate the growth of the database in the drive's available space
IF OBJECT_ID('tempdb..calculateAvailableSpace') IS NOT NULL
EXEC tempdb.sys.sp_executesql N'DROP FUNCTION calculateAvailableSpace'
EXEC tempdb.sys.sp_executesql N'
CREATE FUNCTION calculateAvailableSpace(
@diskFreeSpaceMB float,
@currentSizeMB float,
@growth float,
@is_percent_growth bit
)
RETURNS int
AS
BEGIN
IF @currentSizeMB = 0
SET @currentSizeMB = 1
DECLARE @returnValue int = 0
IF @is_percent_growth = 0
BEGIN
SET @returnValue = (@growth /128) * CAST((@diskFreeSpaceMB / (@growth / 128)) AS int)
END
ELSE
BEGIN
DECLARE @prevsize AS float = 0
DECLARE @calcsize AS float = @currentSizeMB
WHILE @calcsize < @diskFreeSpaceMB
BEGIN
SET @prevsize = @calcsize
SET @calcsize = @calcsize + @calcsize * @growth / 100.0
END
SET @returnValue = @prevsize - @currentSizeMB
IF @returnValue < 0
SET @returnValue = 0
END
RETURN @returnValue
END
'
-- report database filegroups with less than 20% available space
;WITH masterfiles AS (
SELECT *
,available_space =
CASE mf.max_size_mb
WHEN -1 THEN tempdb.dbo.calculateAvailableSpace(mbfree, size_mb, growth, is_percent_growth)
ELSE max_size_mb - size_mb
END
+ emptyspace_mb
FROM #masterfiles AS mf
),
spaces AS (
SELECT
DB_NAME(database_id) AS database_name
,data_space_name
,type_desc
,SUM(size_mb) AS size_mb
,SUM(available_space) AS available_space_mb
,SUM(available_space) * 100 /
CASE SUM(size_mb)
WHEN 0 THEN 1
ELSE SUM(size_mb)
END AS available_space_percent
FROM masterfiles
GROUP BY DB_NAME(database_id)
,data_space_name
,type_desc
)
SELECT *
FROM spaces
WHERE available_space_percent < 20
ORDER BY available_space_percent ASC
IF OBJECT_ID('tempdb..#masterfiles') IS NOT NULL
DROP TABLE #masterfiles;
IF OBJECT_ID('tempdb..calculateAvailableSpace') IS NOT NULL
EXEC tempdb.sys.sp_executesql N'DROP FUNCTION calculateAvailableSpace'
Run Code Online (Sandbox Code Playgroud)
基本上,它用于sys.master_files查询所有数据库文件的大小并sys.dm_os_volume_stats查询驱动器信息。FILEPROPERTY返回有关文件内可用空间的信息。
那里的脚本用于在可用可用空间低于阈值(例如 20%)时发出警报,但可以对其进行修改以执行定期监控并将信息记录在中央表中。
不要忽视数据收集器功能可以在管理数据仓库数据库中记录的内容。该功能在所有版本的 SQL Server 中都可用(由于缺少调度收集的代理而被排除在外)。如果你的报表不够用,你可以直接查询表(你只需要[snapshots].[disk_usage]在MDW数据库中查询)。
尤其是,如果您使用的是企业版,实用程序控制点功能将通过“整体”方法关注资源利用率。同样,它提供了一些报告和仪表板,以查看整个服务器基础架构或单个服务器的资源利用率。
根据我的经验,Data Collector 和 Utility Control Point 是 SQL Server 中使用最少的功能。
| 归档时间: |
|
| 查看次数: |
2346 次 |
| 最近记录: |