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

Una stored procedure dedicata per ottenere lo stato dei backup del database più recenti

Qualsiasi DBA di SQL Server (ovviamente, questo vale per tutte le piattaforme) concorderà sul fatto che i backup del database sono le cose più essenziali per i professionisti dei dati. Il monitoraggio degli stati di tali backup è fondamentale. Per rendere questa attività più semplice, ho creato una stored procedure personalizzata. Ti consentirà di ottenere gli stati degli ultimi backup del database (se presenti) per tutti i database necessari sotto la tua cura.

Prima di iniziare, controlla l'account che esegue questa procedura archiviata. Deve disporre dei diritti necessari per eseguire SELECT sulle seguenti tabelle per creare la procedura memorizzata:

  • sys.databases (master)
  • backupmediafamily (msdb)
  • backupset (msdb)

Come utilizzare la procedura memorizzata

Il codice T-SQL di stored procedure viene fornito in questo articolo. La procedura prevede 2 parametri:

  • @database è il nome del database di destinazione. Se non ne viene specificato nessuno, verranno assunti tutti i database.
  • @backupType è il tipo di backup che vuoi controllare. A seconda della tua situazione, può essere:
    • F – Completo
    • D – Differenziale
    • L – Registro delle transazioni
    • A – Tutto quanto sopra

Ecco una matrice di possibili combinazioni di parametri che possono essere utilizzate e l'output che dovresti aspettarti. X è il nome del database a cui vuoi rivolgerti.

@database @backupType Uscita
Tutti A Visualizza i più recenti backup completi, differenziali e del registro delle transazioni di tutti i database all'interno dell'istanza.
Tutti F Visualizza i backup completi più recenti di tutti i database all'interno dell'istanza.
Tutti D Visualizza i backup differenziali più recenti di tutti i database all'interno dell'istanza.
Tutti L Visualizza i backup del registro delle transazioni più recenti di tutti i database all'interno dell'istanza.
X A Visualizza i più recenti backup completi, differenziali e del registro delle transazioni del database X all'interno dell'istanza.
X F Visualizza il backup completo più recente del database X all'interno dell'istanza.
X D Visualizza il backup differenziale più recente del database X all'interno dell'istanza.
X L Visualizza il backup del registro delle transazioni più recente del database X all'interno dell'istanza.

Nota :se il database di destinazione è nel modello di ripristino semplice, le informazioni sui backup del registro delle transazioni verranno visualizzate come NULL. Non è mai stato sottoposto al modello di ripristino completo e il backup del registro delle transazioni non è mai stato eseguito per questo.

Test di esecuzione

Dimostrerò alcune delle combinazioni di script per farti un'idea di cosa aspettarti da questa stored procedure:

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'

Gli screenshot non copriranno l'SP destinato a un singolo database perché l'output è lo stesso, l'unica differenza è che mostra un database.

Come puoi vedere, i dati per le colonne "Differenziale" sono NULL perché non ho mai eseguito un backup differenziale per nessuna di esse. Tuttavia, per dimostrare appieno quanto possa essere utile questa soluzione, abbiamo bisogno di un backup differenziale. Ne prenderò uno per il database DBA ed eseguirò la stored procedure per vedere cosa restituisce:

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

Dopo aver eseguito il backup differenziale, puoi vedere che la nostra stored procedure restituisce i dati anche per le colonne Differenziali, precisamente del backup che ho appena eseguito.

Il codice di procedura memorizzato completo

All'inizio dello script, vedrai i valori predefiniti:lo script li assume se non viene passato alcun valore per ciascun parametro.

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

Conclusione

Con questa stored procedure personalizzata, puoi creare un meccanismo per avvisarti quando un determinato tipo di backup per un determinato database non è stato eseguito entro un determinato periodo.

È possibile distribuire questa stored procedure in ogni istanza di SQL Server e controllare le informazioni di backup per ogni singolo database (database di sistema e utente).

È inoltre possibile utilizzare le informazioni restituite dalla procedura memorizzata per creare una mappa di backup per identificare la posizione dell'ultimo file di backup per ogni database. Nel mio attuale lavoro, l'ho usato per creare uno script per orchestrare i test di ripristino di tutti i backup sotto il mio supporto e confermare che sono affidabili al 100%. Per me è stato estremamente utile.