SQL Serverデータファイルの空き領域の監視


9

SQL Serverデータベースでの自動拡張操作を回避するために、mdf / ndfファイルを手動で大きなサイズに変更しました。ファイルの方が大きいので、ディスクパーティションの空き領域はほとんどなく、システム管理者は、領域が不足していることを警告し続けます。

サイズを変更したため、データファイルには多くの空き領域がありますが、ファイルサイズ/ディスクの空き領域を確認しても気付かないでしょう。

データファイルの実際の使用率を監視するにはどうすればよいですか?私は、perfmonカウンタを使用したいと思います。ファイルが実際にスペースを使い果たすと、SQL Serverは十分なスペースを割り当てることができず、クラッシュするだろうと私は確信しています。

回答:


11

単純なクエリから取得できるのに、パフォーマンスカウンターを使用する理由がわかりません。実際、パフォーマンスカウンター(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 Serverを使用せずにそれができることを望んでいました。確かに手動で照会して空き容量を確認することはできますが、自動化されたソリューションが必要です。システム管理者が監視ソフトウェアで使用できるので、perfmonカウンターは完璧です。私はあなたのクエリを使用して、SQLエージェントジョブ+電子メールアラートを設定する場合があります。また、Kinの解決策を試して、どれが最適かを確認します。
BuahahaXD 2015

1
同様のユースケースがあります。既製の監視ソリューションがSQL Server固有ではなく、ウィンドウについて知っている場合は、パフォーマンスカウンターの実装と監視が簡単になります。
Michael J Swart 2018

7

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
    

    ここに画像の説明を入力してください

    ここに画像の説明を入力してください

注:上記の私のアイデアで実行できる他の種類の拡張機能があります。

  • しきい値を入力値として受け入れるストアドプロシージャとしてエージェントジョブを作成します。
  • 値をDBAデータベースの物理テーブルに記録して、傾向分析と容量計画を実行できるようにします。
  • あなたが考えることができる他のすべて.... :-)

クエリに問題があります。どこかに無限ループがあると思います。アラートを設定し、アラートによるジョブのトリガーをオフにしたところ、データファイルに関する大量のメールが届きました。:)
BuahahaXD

1
応答設定間の遅延を使用する必要があります。
Kin Shah

5

AaronとKinの答えに基づいて構築するには、パフォーマンスカウンターを使用できますが、ユーザーが設定できるカウンターの 1つです。

私は...するだろう:

  • Aaronのクエリを使用して1つのファイルの空き領域を取得するか、すべてのファイルをループして目的の最小/最大値を取得するストアドプロシージャを作成する
  • ストアドプロシージャを定期的に実行するジョブを作成する

適切に通知したい場合:

  • オペレーターを作成する/有効なメールアドレスで既存のオペレーターを使用する
  • そのユーザーカウンターに基づいて、前のオペレーターに通知するアラートを作成します(自分でメールを殺到しないようにしてください-応答の間隔を設定してください)。

警告は次のとおりです。

  • 設定可能なカウンターは10個しかない
  • 彼らは意味のある名前を持っていません
  • 素敵な写真を撮るには、面倒なjob + proc + alertが必要です

ただし、Perfmonまたは他の同様のツールで使用できます。


3

また、データファイルのサイズを監視するための簡単なアラート設定もあります。

ここに画像の説明を入力してください

追加の「ログ領域不足アラート」は、トランザクションログファイルの空き領域を監視します(自動拡張はオフです)。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.