sql >> データベース >  >> RDS >> Database

サーバーでサーバーストレージ情報を取得するためのストアドプロシージャ

    現在のクラウドサービスと同じくらい人気がありますが、SQL Serverのオンプレミス展開のかなりの部分がまだあり、それらをサポートするためにサービスが必要です。オンプレミスのセットアップで注意しなければならない領域の1つは、データが保存される場所であるストレージです。

    SQLServerインスタンス内の主要なストレージスペース情報を視覚化するためのストアドプロシージャを紹介します。

    最初の考慮事項

    • このストアドプロシージャを実行するアカウントに十分な権限があることを確認してください。
    • データベースオブジェクト(データベーステーブルとストアドプロシージャ)は、スクリプトの実行時に選択されたデータベース内に作成されるため、慎重に選択してください。
    • スクリプトは、エラーが発生することなく複数回実行できるように作成されています。ストアドプロシージャには、SQL Server2016SP1以降で使用可能なCREATEORALTERPROCEDUREステートメントを使用しました。
    • 作成したデータベースオブジェクトの名前は自由に変更してください。
    • ストアドプロシージャによって返されたデータを永続化することを選択すると、ターゲットテーブルが最初に切り捨てられるため、最新の結果セットのみが保存されます。
    • このソリューションは、クラウドプロバイダーが管理し、ファイルシステムにアクセスできないクラウド展開では意味がないことに注意してください。

    ストアドプロシージャの使用方法

    1. TSQLコードをコピーして貼り付けます(この記事内で入手可能)。
    2. SPは2つのパラメーターを想定しています。
      1. @ persistData:DBAが出力をターゲットテーブルに保存する場合は「Y」、DBAが出力を直接表示する場合は「N」。
      2. @driveDetail:オプションですが、ドライブ文字を渡すと、@persistDataパラメーターはまったく効果がありません。

    提示されたフィールドとその意味

    • ドライブ: 現在のインスタンスのデータファイルを含むドライブ文字。
    • total_space: ドライブのサイズ(GB単位)。
    • free_space: ドライブに残っているGBの量。
    • used_space: インスタンス内のすべてのデータベースが占めるGBの量。
    • data_collection_timestamp: 「Y」が@persistDataパラメータに渡された場合にのみ表示され、SPがいつ実行され、情報がDBA_Storageテーブルに正常に保存されたかを知るために使用されます。

    実行テスト

    ストアドプロシージャのいくつかの実行を示して、そこから何が期待できるかを理解できるようにします。

    EXEC GetStorageData @persistData = 'N'

    これをC:\ドライブにすべてを詰め込んだテストインスタンスで実行したので(これまでで最悪の方法です)、1行だけが返されました。ここで、Windowsによって報告された、C:\ドライブの使用状況のスクリーンショットを表示して、SPがブラフしていないかどうかを確認します。

    ほとんどの場合、見栄えがします。ただし、よく見ると、図の「使用済みスペース」には25 GB、SPには「0.170GB」と表示されていますが、これは奇妙なことです。その理由は、SPの意味が少し異なるためです。ここでは、データベースファイルのみが占めるGBの量を報告するため、この点に注意してください。

    さて、その出力は少し乾燥しているようですよね?つまり、報告された使用済みスペースを正確に何が取っているのかわかりません。そこで他のパラメータが関係するので、チェックしてみましょう:

    EXEC GetStorageData @persistData = 'N', @driveDetail = 'C'

    このように実行すると、ドライブに少なくとも1つのデータベースファイルがパラメータとして渡されている特定のデータベースのリストが表示されます。 「合計スペース」列を合計すると、前に要約した出力とまったく同じ値が得られます。

    SPが何を返すかを確認するために、もう1つ試してみましょう。新しいデータベースを作成しますが、データベースファイルを配置している別のドライブに配置します。データベースを「テスト」と呼び、ドライブS:\に配置します。

    そのため、SPはそのドライブも結果セットに出力します。ただし、ここでも、値として「S」を指定して@driveDetailパラメーターをスローするとどうなるかを見てみましょう。

    ビンゴ、選択したサイズ(データファイル用に1GB、トランザクションログファイル用に8MB)で作成した「テスト」データベースを報告します。

    サイドクエリ

    ここで、DBAにより多くの価値を提供するために、テーブルに保持されているデータから有用な情報を取得するのに役立つクエリをいくつか用意しました。

    * C:\ドライブでホストされているデータファイルが少なくとも1つあるデータベースを検索するためのクエリ。

    SELECT * FROM DBA_Storage WHERE drive = 'C:\';

    *free_spaceでソートされたドライブのリストを最低から最高まで視覚化するためのクエリ。これにより、どのドライブに注意が必要かをできるだけ早く知ることができます。

    SELECT * FROM DBA_Storage ORDER BY free_space;

    * used_spaceでソートされたドライブのリストを、最高から最低まで視覚化するためのクエリ。これにより、どのデータが他のデータよりも多いかを知ることができます。

    SELECT * FROM DBA_Storage ORDER BY used_space DESC;

    ストアドプロシージャの完全なコードは次のとおりです。

    *スクリプトの最初に、各パラメーターに値が渡されない場合にストアドプロシージャが想定するデフォルト値が表示されます。

    CREATE OR ALTER PROCEDURE [dbo].[GetStorageData] 
    	@persistData   CHAR(1) = 'Y',
    	@driveDetail   CHAR(1) = NULL
    AS
    BEGIN
    	SET NOCOUNT ON
    
    	DECLARE @command NVARCHAR(MAX)    
    	
    	DECLARE @Tmp_StorageInformation TABLE(       
    	[drive]                     [CHAR](3) NOT NULL,
    	[total_space]               [DECIMAL](10,3) NOT NULL,
    	[free_space]                [DECIMAL](10,3) NOT NULL,
    	[used_space]                [DECIMAL](10,3) NOT NULL
    	)
    	
    	IF NOT EXISTS (SELECT * FROM dbo.sysobjects where id = object_id(N'DBA_Storage') and OBJECTPROPERTY(id, N'IsTable') = 1)
    	BEGIN
    		CREATE TABLE DBA_Storage(
    		[drive]                     [CHAR](3) NOT NULL,
    		[total_space]               [DECIMAL](10,3) NOT NULL,
    		[free_space]                [DECIMAL](10,3) NOT NULL,
    		[used_space]                [DECIMAL](10,3) NOT NULL,
    		[data_collection_timestamp] [DATETIME] NOT NULL
    		)
    	END
    
    	
    	IF(@driveDetail IS NOT NULL)
    	BEGIN
    		SELECT DB_NAME(mf.database_id) AS 'database',CONVERT(DECIMAL(10,3),SUM(size*8)/1024.0/1024.0) AS 'total space'
    		FROM sys.master_files mf
    		WHERE SUBSTRING(mf.physical_name,0,4) = CONCAT(@driveDetail,':\')
    		GROUP BY mf.database_id
    		
    		RETURN 
    	END
    	
    	INSERT INTO @Tmp_StorageInformation   
    	SELECT 
    		   drives.drive,
    		   drives.total_space,
    		   drives.free_space,
    		   (SELECT CONVERT(DECIMAL(10,3),SUM(size*8)/1024.0/1024) FROM sys.master_files WHERE SUBSTRING(physical_name,0,4) = drives.drive) AS 'used_space'
    	FROM(
    		 SELECT DISTINCT vs.volume_mount_point AS 'drive',CONVERT(DECIMAL(10,3),(vs.available_bytes/1048576)/1024.0) AS 'free_space',CONVERT(DECIMAL(10,3),(vs.total_bytes/1048576)/1024.0) AS 'total_space'
    		 FROM sys.master_files mf
    		 CROSS APPLY sys.dm_os_volume_stats(mf.database_id,mf.file_id) vs
    		) AS drives      
    	  
    	IF @persistData = 'N'
    		SELECT * FROM @Tmp_StorageInformation 
    	ELSE 
    	BEGIN
    		TRUNCATE TABLE DBA_Storage
    		
    		INSERT INTO DBA_Storage
    		SELECT *,GETDATE() FROM @Tmp_StorageInformation ORDER BY [drive] 
    	END
    END

    結論

    • このSPは、サポート下のすべてのSQL Serverインスタンスに展開し、サポートされているインスタンスのスタック全体にアラートメカニズムを実装できます。
    • この情報を比較的頻繁に照会するエージェントジョブを実装する場合、サポートされている環境内で、特定のしきい値に達したときにストレージを処理する手順を実行するという点で、ゲームのトップに立つことができます。 。
    • ここCodingSightで公開されているその他のツールを確認してください。

    1. MySQLで単語全体の一致を検索

    2. 別のテーブルの外部キーとして使用される自動生成された主キーを判別する方法

    3. 文字列を連結する方法は?

    4. Round()がPostgreSQLでどのように機能するか