SQL Serverのディスク容量とデータベースFileInfo収集

SQL Serverのディスク使用状況やデータベースFileInfoを収集するための以下の方法を紹介します。 1. ディスクパーティションの空き容量確認
EXEC xp_fixeddrives
2. データベースファイルの詳細情報を取得
SELECT * 
FROM sys.database_files

SELECT name, CAST(size AS FLOAT) * (8192.0 / 1024.0 / 1024.0) AS size_mb 
FROM sys.database_files
3. 現在のデータベースのディスク使用状況確認
EXEC sp_spaceused
4. 各データベースのログファイル容量と使用率確認
DBCC SQLPERF(LOGSPACE)
5. サーバーインスタンス情報収集
SELECT 
    SERVERPROPERTY('machinename') AS machine_name,
    @@SERVERNAME AS server_name,
    SERVERPROPERTY('edition') AS edition,
    @@version AS version
方法一:sp_spaceusedを用いた収集
DECLARE @サーバー名 VARCHAR(100)
DECLARE データベースカーソル CURSOR FOR
SELECT name 
FROM sys.databases 
WHERE database_id > 4 AND name != 'distribution'

OPEN データベースカーソル
FETCH NEXT FROM データベースカーソル INTO @サーバー名

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT 'USE ' + QUOTENAME(@サーバー名)
    PRINT 'GO'
    PRINT 'EXEC sp_spaceused'
    FETCH NEXT FROM データベースカーソル INTO @サーバー名
END

CLOSE データベースカーソル
DEALLOCATE データベースカーソル
方法二:sys.database_filesとsp_MSforeachdbを用いた収集
USE master
GO

CREATE TABLE データベースサイズ (
    データベース名 VARCHAR(100),
    サイズ INT)

EXEC sp_MSforeachdb '
    INSERT INTO master.dbo.データベースサイズ (dbname, size)
    SELECT ''?'' AS dbname, SUM(size) AS size
    FROM ?.sys.database_files'

SELECT * FROM データベースサイズ

SELECT SUM(サイズ * 8) / 1024 AS 総サイズMB 
FROM データベースサイズ 
WHERE データベース名 NOT IN ('master', 'tempdb', 'model', 'msdb', 'distribution')
方法三:sys.sysaltfilesとsys.databasesを用いた収集
SELECT db.name AS データベース名,
       sf.name AS ファイル名,
       sf.filename AS ファイルパス,
       sf.size AS サイズ
FROM sys.sysaltfiles sf
INNER JOIN sys.databases db ON sf.dbid = db.database_id
WHERE db.database_id > 4 AND db.name != 'distribution'

SELECT SUM(sf.size * 8) / 1024 AS 総サイズMB
FROM sys.sysaltfiles sf
INNER JOIN sys.databases db ON sf.dbid = db.database_id
WHERE db.database_id > 4 AND db.name != 'distribution'
収集方法の違い
方法二は現在稼働中のデータベースのみを収集しますが、方法三は稼働中データベースだけでなく、オフライン状態のデータベースも収集可能です。

タグ: SQL Server ディスク容量 データベースFileInfo 空き容量収集 データ管理

6月23日 17:39 投稿