Database
 sql >> Datenbank >  >> RDS >> Database

Eine dedizierte gespeicherte Prozedur, um den Status der neuesten Datenbanksicherungen abzurufen

Jeder SQL Server-DBA (dies gilt natürlich für alle Plattformen) wird zustimmen, dass Datenbank-Backups das Wichtigste für Datenexperten sind. Die Überwachung des Status dieser Backups ist von entscheidender Bedeutung. Um diese Aufgabe einfacher zu machen, habe ich eine benutzerdefinierte gespeicherte Prozedur erstellt. Es ermöglicht Ihnen, den Status der neuesten Datenbanksicherungen (falls vorhanden) für alle erforderlichen Datenbanken in Ihrer Obhut zu erhalten.

Bevor wir beginnen, überprüfen Sie das Konto, das diese gespeicherte Prozedur ausführt. Es muss über die erforderlichen Rechte verfügen, um SELECT für die folgenden Tabellen auszuführen, um die gespeicherte Prozedur zu erstellen:

  • sys.databases (Master)
  • backupmediafamily (msdb)
  • Backupset (msdb)

Verwendung der gespeicherten Prozedur

Der T-SQL-Code für gespeicherte Prozeduren wird in diesem Artikel bereitgestellt. Die Prozedur erwartet 2 Parameter:

  • @database ist der Name der Zieldatenbank. Wenn keine angegeben ist, werden alle Datenbanken angenommen.
  • @backupType ist die Art der Sicherung, die Sie überprüfen möchten. Abhängig von Ihrer Situation kann dies sein:
    • F – Voll
    • D – Differential
    • L – Transaktionsprotokoll
    • A – Alle oben genannten

Hier ist eine Matrix möglicher Parameterkombinationen, die verwendet werden können, und die Ausgabe, die Sie erwarten sollten. X ist der Name der Datenbank, auf die Sie abzielen möchten.

@database @backupType Ausgabe
Alle A Zeigt die neuesten vollständigen, differenziellen und Transaktionsprotokollsicherungen aller Datenbanken innerhalb der Instanz an.
Alle F Zeigt die neuesten vollständigen Sicherungen aller Datenbanken innerhalb der Instanz an.
Alle D Zeigt die neuesten differenziellen Sicherungen aller Datenbanken innerhalb der Instanz an.
Alle L Zeigt die neuesten Transaktionsprotokollsicherungen aller Datenbanken innerhalb der Instanz an.
X A Zeigt die neuesten vollständigen, differenziellen und Transaktionsprotokollsicherungen der X-Datenbank innerhalb der Instanz an.
X F Zeigt die letzte vollständige Sicherung der X-Datenbank innerhalb der Instanz an.
X D Zeigt die neueste differenzielle Sicherung der X-Datenbank innerhalb der Instanz an.
X L Zeigt die letzte Transaktionsprotokollsicherung der X-Datenbank innerhalb der Instanz an.

Hinweis :Wenn sich die Zieldatenbank im einfachen Wiederherstellungsmodell befindet, werden die Sicherungsinformationen des Transaktionsprotokolls als NULL angezeigt. Es war nie unter dem vollständigen Wiederherstellungsmodell und die Sicherung des Transaktionsprotokolls hat nie dafür stattgefunden.

Ausführungstests

Ich werde einige der Skriptkombinationen demonstrieren, damit Sie eine Vorstellung davon bekommen, was Sie von dieser gespeicherten Prozedur erwarten können:

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'

Die Screenshots decken den SP nicht ab, der auf eine einzelne Datenbank abzielt, da die Ausgabe dieselbe ist, der einzige Unterschied besteht darin, dass sie eine Datenbank anzeigt.

Wie Sie sehen können, sind die Daten für die „Differential“-Spalten NULL, da ich für keine von ihnen eine differentielle Sicherung erstellt habe. Um jedoch vollständig zu demonstrieren, wie nützlich diese Lösung sein kann, benötigen wir eine differenzielle Sicherung. Ich nehme eine für die DBA-Datenbank und führe die gespeicherte Prozedur aus, um zu sehen, was sie zurückgibt:

EXEC DBA_DatabaseBackups @database = 'DBA', @backupType = 'D'

Nachdem Sie die differenzielle Sicherung durchgeführt haben, können Sie sehen, dass unsere gespeicherte Prozedur auch die Daten für die differenziellen Spalten zurückgibt, genau von der Sicherung, die ich gerade erstellt habe.

Der vollständige Code für gespeicherte Prozeduren

Ganz am Anfang des Skripts sehen Sie Standardwerte – das Skript nimmt sie an, wenn für jeden Parameter kein Wert übergeben wird.

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

Schlussfolgerung

Mit dieser benutzerdefinierten gespeicherten Prozedur können Sie einen Mechanismus erstellen, der Sie benachrichtigt, wenn ein bestimmter Sicherungstyp für eine bestimmte Datenbank nicht innerhalb eines bestimmten Zeitraums erstellt wurde.

Sie können diese gespeicherte Prozedur in jeder SQL Server-Instanz bereitstellen und die Sicherungsinformationen für jede einzelne Datenbank (System- und Benutzerdatenbanken) überprüfen.

Außerdem können Sie die von der gespeicherten Prozedur zurückgegebenen Informationen verwenden, um eine Sicherungszuordnung zu erstellen um den Speicherort für die neueste Sicherungsdatei für jede Datenbank zu identifizieren. In meinem derzeitigen Job habe ich dies verwendet, um ein Skript zu erstellen, um die Wiederherstellungstests aller Backups unter meiner Unterstützung zu orchestrieren und zu bestätigen, dass sie 100 % zuverlässig sind. Für mich war es äußerst nützlich.