SQL Server DBA(もちろん、これはすべてのプラットフォームに適用されます)は、データベースのバックアップがデータの専門家にとって最も重要なことであることに同意します。これらのバックアップのステータスを監視することは非常に重要です。このタスクをより簡単にするために、カスタムのストアドプロシージャを作成しました。これにより、必要なすべてのデータベースの最新のデータベースバックアップ(存在する場合)のステータスを取得できます。
開始する前に、このストアドプロシージャを実行しているアカウントを確認してください。ストアドプロシージャを作成するには、次のテーブルでSELECTを実行するために必要な権限が必要です。
- sys.databases(マスター)
- backupmediafamily(msdb)
- バックアップセット(msdb)
ストアドプロシージャの使用方法
この記事では、ストアドプロシージャのT-SQLコードについて説明します。この手順では、次の2つのパラメータが必要です。
- @database ターゲットデータベースの名前です。何も指定されていない場合は、すべてのデータベースが想定されます。
- @backupType 確認するバックアップの種類です。状況に応じて、次のようになります。
- F –フル
- D –ディファレンシャル
- L –トランザクションログ
- A –上記のすべて
使用できるパラメータの組み合わせのマトリックスと、期待する出力を次に示します。 X ターゲットにするデータベースの名前です。
@database | @backupType | 出力 |
すべて | A | インスタンス内のすべてのデータベースの最新の完全、差分、およびトランザクションログのバックアップを表示します。 |
すべて | F | インスタンス内のすべてのデータベースの最新の完全バックアップを表示します。 |
すべて | D | インスタンス内のすべてのデータベースの最新の差分バックアップを表示します。 |
すべて | L | インスタンス内のすべてのデータベースの最新のトランザクションログバックアップを表示します。 |
X | A | インスタンス内のXデータベースの最新の完全、差分、およびトランザクションログのバックアップを表示します。 |
X | F | インスタンス内のXデータベースの最新の完全バックアップを表示します。 |
X | D | インスタンス内のXデータベースの最新の差分バックアップを表示します。 |
X | L | インスタンス内のXデータベースの最新のトランザクションログバックアップを表示します。 |
注 :ターゲットデータベースがSimple Recovery Modelにある場合、トランザクションログのバックアップ情報はNULLとして表示されます。完全復旧モデルではなく、トランザクションログのバックアップも実行されていません。
実行テスト
このストアドプロシージャから何が期待できるかを理解するために、スクリプトの組み合わせのいくつかをデモンストレーションします。
EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'A'
EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'F'
EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'D'
EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'L'
スクリーンショットは、出力が同じであるため、単一のデータベースを対象とするSPをカバーしていません。唯一の違いは、1つのデータベースが表示されることです。
ご覧のとおり、「Differential」列のデータはNULLです。これは、これらの列のいずれにも差分バックアップを作成したことがないためです。ただし、このソリューションがどれほど役立つかを完全に示すには、差分バックアップが必要です。 DBAデータベース用に1つ取得し、ストアドプロシージャを実行して、何が返されるかを確認します。
EXEC DBA_DatabaseBackups @database = 'DBA', @backupType = 'D'
差分バックアップを作成した後、ストアドプロシージャが差分列のデータも返すことがわかります。これは、今作成したバックアップのデータとまったく同じです。
完全なストアドプロシージャコード
スクリプトの最初にデフォルト値が表示されます。各パラメーターに値が渡されない場合、スクリプトはデフォルト値を想定します。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Alejandro Cobar
-- Create date: 2021-05-10
-- Description: SP to retrieve the latest backups information
-- =============================================
CREATE PROCEDURE DBA_DatabaseBackups
@database VARCHAR(256) = 'all',
@backupType CHAR(1) = 'A'
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sqlCommand VARCHAR(MAX);
SET @sqlCommand = '
WITH MostRecentBackups
AS(
SELECT
database_name AS [Database],
MAX(bus.backup_finish_date) AS LastBackupTime,
CASE bus.type
WHEN ''D'' THEN ''Full''
WHEN ''I'' THEN ''Differential''
WHEN ''L'' THEN ''Transaction Log''
END AS Type
FROM msdb.dbo.backupset bus
WHERE bus.type <> ''F''
GROUP BY bus.database_name,bus.type
),
BackupsWithSize
AS(
SELECT
mrb.*,
(SELECT TOP 1 CONVERT(DECIMAL(10,4), b.compressed_backup_size/1024/1024/1024) AS backup_size FROM msdb.dbo.backupset b WHERE [Database] = b.database_name AND LastBackupTime = b.backup_finish_date) AS [Backup Size],
(SELECT TOP 1 DATEDIFF(s, b.backup_start_date, b.backup_finish_date) FROM msdb.dbo.backupset b WHERE [Database] = b.database_name AND LastBackupTime = b.backup_finish_date) AS [Seconds],
(SELECT TOP 1 b.media_set_id FROM msdb.dbo.backupset b WHERE [Database] = b.database_name AND LastBackupTime = b.backup_finish_date) AS media_set_id
FROM MostRecentBackups mrb
)
SELECT
d.name AS [Database],
d.state_desc AS State,
d.recovery_model_desc AS [Recovery Model],'
IF @backupType = 'F' OR @backupType = 'A'
SET @sqlCommand += '
bf.LastBackupTime AS [Last Full],
DATEDIFF(DAY,bf.LastBackupTime,GETDATE()) AS [Time Since Last Full (in Days)],
bf.[Backup Size] AS [Full Backup Size],
bf.Seconds AS [Full Backup Seconds to Complete],
(SELECT TOP 1 bmf.physical_device_name FROM msdb.dbo.backupmediafamily bmf WHERE bmf.media_set_id = bf.media_set_id AND bmf.device_type = 2) AS [Full Backup Path]
'
IF @backupType = 'A'
SET @sqlCommand += ','
IF @backupType = 'D' OR @backupType = 'A'
SET @sqlCommand += '
bd.LastBackupTime AS [Last Differential],
DATEDIFF(DAY,bd.LastBackupTime,GETDATE()) AS [Time Since Last Differential (in Days)],
bd.[Backup Size] AS [Differential Backup Size],
bd.Seconds AS [Diff Backup Seconds to Complete],
(SELECT TOP 1 bmf.physical_device_name FROM msdb.dbo.backupmediafamily bmf WHERE bmf.media_set_id = bd.media_set_id AND bmf.device_type = 2) AS [Diff Backup Path]
'
IF @backupType = 'A'
SET @sqlCommand += ','
IF @backupType = 'L' OR @backupType = 'A'
SET @sqlCommand += '
bt.LastBackupTime AS [Last Transaction Log],
DATEDIFF(MINUTE,bt.LastBackupTime,GETDATE()) AS [Time Since Last Transaction Log (in Minutes)],
bt.[Backup Size] AS [Transaction Log Backup Size],
bt.Seconds AS [TLog Backup Seconds to Complete],
(SELECT TOP 1 bmf.physical_device_name FROM msdb.dbo.backupmediafamily bmf WHERE bmf.media_set_id = bt.media_set_id AND bmf.device_type = 2) AS [Transaction Log Backup Path]
'
SET @sqlCommand += '
FROM sys.databases d
LEFT JOIN BackupsWithSize bf ON (d.name = bf.[Database] AND (bf.Type = ''Full'' OR bf.Type IS NULL))
LEFT JOIN BackupsWithSize bd ON (d.name = bd.[Database] AND (bd.Type = ''Differential'' OR bd.Type IS NULL))
LEFT JOIN BackupsWithSize bt ON (d.name = bt.[Database] AND (bt.Type = ''Transaction Log'' OR bt.Type IS NULL))
WHERE d.name <> ''tempdb'' AND d.source_database_id IS NULL'
IF LOWER(@database) <> 'all'
SET @sqlCommand += ' AND d.name ='+CHAR(39)[email protected]+CHAR(39)
EXEC (@sqlCommand)
END
GO
結論
このカスタムストアドプロシージャを使用すると、特定のデータベースの特定のバックアップタイプが特定の期間内に作成されなかった場合に警告するメカニズムを構築できます。
このストアドプロシージャをすべてのSQLServerインスタンスに展開し、すべての単一データベース(システムデータベースとユーザーデータベース)のバックアップ情報を確認できます。
また、ストアドプロシージャから返された情報を使用して、バックアップマップを作成することもできます。 各データベースの最新のバックアップファイルの場所を特定します。現在の仕事では、これを使用してスクリプトを作成し、サポートの下ですべてのバックアップの復元テストを調整し、それらが100%信頼できることを確認しました。私にとって、それは非常に役に立ちました。