Elke SQL Server DBA (dit geldt natuurlijk voor alle platforms) zal het erover eens zijn dat databaseback-ups de meest essentiële dingen zijn voor dataprofessionals. Het bewaken van de status van die back-ups is cruciaal. Om deze taak eenvoudiger te maken, heb ik een aangepaste opgeslagen procedure gemaakt. Hiermee kunt u de laatste statussen van databaseback-ups (indien aanwezig) krijgen voor alle noodzakelijke databases die onder uw hoede zijn.
Controleer voordat we beginnen het account dat deze opgeslagen procedure uitvoert. Het moet de nodige rechten hebben om SELECT op de volgende tabellen uit te voeren om de opgeslagen procedure te creëren:
- sys.databases (master)
- backupmediafamily (msdb)
- backupset (msdb)
Hoe de opgeslagen procedure te gebruiken
De opgeslagen procedure T-SQL-code wordt in dit artikel gegeven. De procedure verwacht 2 parameters:
- @database is de naam van de doeldatabase. Als er geen is opgegeven, worden alle databases aangenomen.
- @backupType is het type back-up dat u wilt controleren. Afhankelijk van uw situatie kan het zijn:
- F – Volledig
- D – Differentieel
- L – Transactielogboek
- A – Al het bovenstaande
Hier is een matrix van mogelijke parametercombinaties die kunnen worden gebruikt, en de output die u mag verwachten. X is de naam van de database die u wilt targeten.
@database | @backupType | Uitvoer |
Alle | Een | Toont de meest recente back-ups van Full, Differential en Transaction Log van alle databases binnen de instance. |
Alle | F | Toont de meest recente volledige back-ups van alle databases binnen de instantie. |
Alle | D | Toont de meest recente differentiële back-ups van alle databases binnen de instantie. |
Alle | L | Toont de meest recente transactielogboek-back-ups van alle databases binnen de instantie. |
X | Een | Toont de meest recente back-ups van Full, Differential en Transaction Log van de X-database binnen de instance. |
X | F | Toont de meest recente volledige back-up van de X-database binnen de instantie. |
X | D | Toont de meest recente differentiële back-up van de X-database binnen de instantie. |
X | L | Geeft de meest recente transactielogboek-back-up van de X-database binnen de instantie weer. |
Opmerking :als de doeldatabase zich in het Simple Recovery Model bevindt, wordt de back-upinformatie van het transactielogboek weergegeven als NULL. Het is nooit onder het Full Recovery Model geweest en de transactielogboekback-up heeft er nooit voor plaatsgevonden.
Uitvoeringstests
Ik ga enkele van de scriptcombinaties voor u demonstreren om een idee te krijgen van wat u kunt verwachten van deze Opgeslagen 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'
De schermafbeeldingen dekken niet de SP die zich op een enkele database richt, omdat de uitvoer hetzelfde is, het enige verschil is dat er één database wordt weergegeven.
Zoals u kunt zien, zijn de gegevens voor de "Differentiële" kolommen NULL omdat ik voor geen van hen een differentiële back-up heb gemaakt. Om echter volledig aan te tonen hoe nuttig deze oplossing kan zijn, hebben we een differentiële back-up nodig. Ik neem er een voor de DBA-database en voer de opgeslagen procedure uit om te zien wat het oplevert:
EXEC DBA_DatabaseBackups @database = 'DBA', @backupType = 'D'
Nadat je de differentiële back-up hebt gemaakt, kun je zien dat onze opgeslagen procedure ook de gegevens voor differentiële kolommen retourneert, precies van de back-up die ik zojuist heb gemaakt.
De volledige opgeslagen procedurecode
Helemaal aan het begin van het script ziet u standaardwaarden - het script neemt ze aan als er geen waarde wordt doorgegeven voor elke parameter.
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
Conclusie
Met deze aangepaste Stored Procedure kun je een mechanisme bouwen om je te waarschuwen wanneer een bepaald back-uptype voor een bepaalde database niet binnen een bepaalde periode is gemaakt.
U kunt deze opgeslagen procedure in elke SQL Server-instantie implementeren en de back-upgegevens voor elke afzonderlijke database (systeem- en gebruikersdatabases) controleren.
U kunt ook de informatie gebruiken die door de opgeslagen procedure wordt geretourneerd om een back-upkaart te maken om de locatie voor het laatste back-upbestand voor elke database te identificeren. In mijn huidige baan heb ik dit gebruikt om een script te bouwen om de hersteltests van alle back-ups onder mijn steun te orkestreren en te bevestigen dat ze 100% betrouwbaar zijn. Voor mij is het buitengewoon nuttig geweest.