SQL Serverデータベースでの自動拡張操作を回避するために、mdf/ndfファイルを手動で大きなサイズに変更しました。ファイルの方が大きいので、ディスクパーティションの空き領域はほとんどなく、システム管理者は、領域が不足していることを警告し続けます。
サイズを変更したため、データファイルには多くの空き領域がありますが、ファイルサイズ/ディスクの空き領域を確認しても気付かないでしょう。
データファイルの実際の使用率を監視するにはどうすればよいですか?私は、perfmonカウンタを使用したいと思います。ファイルが実際にスペースを使い果たすと、SQL Serverは十分なスペースを割り当てることができず、クラッシュするだろうと私は確信しています。
単純なクエリから取得できるのに、パフォーマンスカウンターを使用する理由がわかりません。実際、パフォーマンスカウンター(Log File(s) Size (KB)
/Log File(s) Used Size (KB)
)からログファイルに関するこの情報を取得できますが、データファイルで使用されている領域の量に関するカウンターはありません。
;WITH f AS
(
SELECT name, size = size/128.0 FROM sys.database_files
),
s AS
(
SELECT name, size, free = size-CONVERT(INT,FILEPROPERTY(name,'SpaceUsed'))/128.0
FROM f
)
SELECT name, size, free, percent_free = free * 100.0 / size
FROM s;
SQL Alertを使用して、データファイルスペースをプロアクティブに監視し、空きスペースが特定の割合を下回った場合に警告する別の方法があります。
基本は
Sys.messagesにユーザー定義のエラーメッセージを作成します。これは、SQLエージェントアラートで使用されます。
-- User-defined error messages can be an integer between 50001 and 2147483647.
EXEC sp_addmessage
@msgnum=911421, -- 911DBA
@severity=1, -- Informational message not generated by DB Engine
@msgtext=N'Data files are %d percent full in database %s.'
次に、SQLエージェントジョブを作成します。以下のスクリプトのset @threshold = 20 --->>>>>>>>>>>>>>>>> CHANGE HERE <<<<<<<<<<<<<<<<<<<<<---
を必ず変更してください。私は彼を非常に低いしきい値として、アラートをシミュレートするためにのみ使用しました。ジョブを30分ごとに実行するようにスケジュールします(必要に応じてこれを変更します)。
if object_id('tempdb..#dbserversize') is not null
DROP TABLE #dbserversize;
create table dbo.#dbserversize (
[id] int identity (1,1)
,[databaseName] sysname
,[Drive] varchar(3)
,[Logical Name] sysname
,[Physical Name] varchar(max)
,[File Size MB] decimal(38, 2)
,[Space Used MB] decimal(38, 2)
,[Free Space] decimal(38, 2)
,[%Free Space] decimal(38, 2)
,[Max Size] varchar(max)
,[Growth Rate] varchar(max)
)
declare @id int
declare @threshold int
declare @dbname sysname
declare @sqltext nvarchar(max)
declare @freespacePct int
set @threshold = 20 --->>>>>>>>>>>>>>>>> CHANGE HERE <<<<<<<<<<<<<<<<<<<<<---
select @dbname = min(name) from sys.databases where database_id > 4 and [state] = 0
while @dbname is not NULL
begin
select @dbname = name from sys.databases where name = @dbname and database_id > 4 and [state] = 0
--- Modified from Erin's blog : Proactive SQL Server Health Checks, Part 1 : Disk Space
--- source http://sqlperformance.com/2014/12/io-subsystem/proactive-sql-server-health-checks-1
set @sqltext = ' use '+@dbname+';'+'
insert into dbo.#dbserversize
select '''+@dbname+''' as [databaseName]
,substring([physical_name], 1, 3) as [Drive]
,[name] as [Logical Name]
,[physical_name] as [Physical Name]
,cast(CAST([size] as decimal(38, 2)) / 128.0 as decimal(38, 2)) as [File Size MB]
,cast(CAST(FILEPROPERTY([name], ''SpaceUsed'') as decimal(38, 2)) / 128.0 as decimal(38, 2)) as [Space Used MB]
,cast((CAST([size] as decimal(38, 0)) / 128) - (CAST(FILEPROPERTY([name], ''SpaceUsed'') as decimal(38, 0)) / 128.) as decimal(38, 2)) as [Free Space]
,cast(((CAST([size] as decimal(38, 2)) / 128) - (CAST(FILEPROPERTY([name], ''SpaceUsed'') as decimal(38, 2)) / 128.0)) * 100.0 / (CAST([size] as decimal(38, 2)) / 128) as decimal(38, 2)) as [%Free Space]
,case
when cast([max_size] as varchar(max)) = - 1
then ''UNLIMITED''
else cast([max_size] as varchar(max))
end as [Max Size]
,case
when is_percent_growth = 1
then cast([growth] as varchar(20)) + ''%''
else cast([growth] as varchar(20)) + ''MB''
end as [Growth Rate]
from sys.database_files
where type = 0 -- for Rows , 1 = LOG'
--print @sqltext
exec (@sqltext)
select @dbname = min(name) from sys.databases where name > @dbname and database_id > 4 and [state] = 0
end
--- delete the entries that do not meet the threshold
delete from dbo.#dbserversize
where [%Free Space] < @threshold;
--select * from dbo.#dbserversize
--- NOW Raise errors for the databases that we got flagged up
while exists (select null from dbo.#dbserversize)
begin
select top 1 @id = id,
@dbname = databaseName,
@freespacePct = [%Free Space]
from dbo.#dbserversize;
RAISERROR(911421, 10,1,@freespacePct, @dbname) with LOG;
delete from dbo.#dbserversize where id = @id;
end
次に、911421
エラー番号に応答するアラートを作成します。
USE [msdb]
GO
EXEC msdb.dbo.sp_add_alert @name=N'MDF file alert',
@message_id=911421,
@severity=0,
@enabled=1,
@delay_between_responses=1800,
@include_event_description_in=0,
@job_id=N'019c4770-865b-406b-894e-72a1ff34f732'
GO
EXEC msdb.dbo.sp_add_notification @alert_name=N'MDF file alert', @operator_name=N'Notify 911 DBA for MDF files getting full', @notification_method = 1
GO
注:上記の私のアイデアで実行できる他の種類の拡張機能があります。
アーロンとキンの答えに基づいて構築するために、パフォーマンスカウンターを使用してそれを行うことができますが、 ユーザー設定可能なカウンター の1つです。
私は...するだろう:
適切に通知したい場合:
警告は次のとおりです。
ただし、Perfmonまたは他の同様のツールで使用できます。