現在のクラウドサービスと同じくらい人気がありますが、SQL Serverのオンプレミス展開のかなりの部分がまだあり、それらをサポートするためにサービスが必要です。オンプレミスのセットアップで注意しなければならない領域の1つは、データが保存される場所であるストレージです。
SQLServerインスタンス内の主要なストレージスペース情報を視覚化するためのストアドプロシージャを紹介します。
最初の考慮事項
- このストアドプロシージャを実行するアカウントに十分な権限があることを確認してください。
- データベースオブジェクト(データベーステーブルとストアドプロシージャ)は、スクリプトの実行時に選択されたデータベース内に作成されるため、慎重に選択してください。
- スクリプトは、エラーが発生することなく複数回実行できるように作成されています。ストアドプロシージャには、SQL Server2016SP1以降で使用可能なCREATEORALTERPROCEDUREステートメントを使用しました。
- 作成したデータベースオブジェクトの名前は自由に変更してください。
- ストアドプロシージャによって返されたデータを永続化することを選択すると、ターゲットテーブルが最初に切り捨てられるため、最新の結果セットのみが保存されます。
- このソリューションは、クラウドプロバイダーが管理し、ファイルシステムにアクセスできないクラウド展開では意味がないことに注意してください。
ストアドプロシージャの使用方法
- TSQLコードをコピーして貼り付けます(この記事内で入手可能)。
- SPは2つのパラメーターを想定しています。
- @ persistData:DBAが出力をターゲットテーブルに保存する場合は「Y」、DBAが出力を直接表示する場合は「N」。
- @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で公開されているその他のツールを確認してください。