Holen Sie sich die letzte vollständige Sicherung und die Transaktionsprotokollsicherung für jede Datenbank

15

Erstellen eines Skripts oder einer Abfrage, mit der die letzte vollständige Sicherung und die letzte Protokollsicherung für jede Datenbank auf jedem Produktionsserver mithilfe der Systemtabelle "backupset" und der zugehörigen Sicherungstabellen angezeigt werden.

Janice
quelle

Antworten:

16

So etwas sollte Ihnen die Ausgabe bringen, nach der Sie suchen. Mit der folgenden Abfrage wird die letzte Sicherung des Typs "Vollständige Sicherung", "Differenzielle Sicherung" oder "Protokollsicherung" für jede Datenbank abgerufen.

;with backup_cte as
(
    select
        database_name,
        backup_type =
            case type
                when 'D' then 'database'
                when 'L' then 'log'
                when 'I' then 'differential'
                else 'other'
            end,
        backup_finish_date,
        rownum = 
            row_number() over
            (
                partition by database_name, type 
                order by backup_finish_date desc
            )
    from msdb.dbo.backupset
)
select
    database_name,
    backup_type,
    backup_finish_date
from backup_cte
where rownum = 1
order by database_name;
Thomas Stringer
quelle
9

Ich habe hier einen Beitrag über die Verwendung von Backupset geschrieben wenn Sie mehr über die Tabelle . Einfach obwohl hier eine Abfrage ist, um zu ziehen, was Sie wollen.

use msdb
go

-- D = Full, I = Differential and L = Log.
-- There are other types of backups too but those are the primary ones.
SELECT backupset.database_name, 
    MAX(CASE WHEN backupset.type = 'D' THEN backupset.backup_finish_date ELSE NULL END) AS LastFullBackup,
    MAX(CASE WHEN backupset.type = 'I' THEN backupset.backup_finish_date ELSE NULL END) AS LastDifferential,
    MAX(CASE WHEN backupset.type = 'L' THEN backupset.backup_finish_date ELSE NULL END) AS LastLog
FROM backupset
GROUP BY backupset.database_name
ORDER BY backupset.database_name DESC

Hinweis: Es wurde erwähnt, dass ich zu backmediaset beigetreten war und es nicht benötigt wurde. Dies ist wahr und ich kann nur vermuten, dass ich vergessen habe, es aus der ursprünglichen Abfrage im Link zu entfernen. Ich habe es von hier entfernt.

Kenneth Fisher
quelle
4

Sie möchten sich wahrscheinlich das anschauen msdb Datenbank nach diesen Details durchsuchen.

Zum Beispiel:

DECLARE @DBName SYSNAME;
SET @DBName = DB_NAME(); -- modify these as you desire.
SET @DBName = NULL; -- comment this line if you want to limit the displayed history

SELECT DatabaseName = bs.database_name
    , BackupStartDate = bs.backup_start_date
    , CompressedBackupSize = bs.compressed_backup_size
    , ExpirationDate = bs.expiration_date
    , BackupSetName = bs.name
    , RecoveryModel = bs.recovery_model
    , ServerName = bs.server_name
    , BackupType = CASE bs.type 
        WHEN 'D' THEN 'Database' 
        WHEN 'L' THEN 'Log' 
        ELSE '[unknown]' END
    , LogicalDeviceName = bmf.logical_device_name
    , PhysicalDeviceName = bmf.physical_device_name
FROM msdb.dbo.backupset bs
    INNER JOIN msdb.dbo.backupmediafamily bmf 
        ON [bs].[media_set_id] = [bmf].[media_set_id]
WHERE (bs.database_name = @DBName
    OR @DBName IS NULL)
    AND bs.type = 'D'
ORDER BY bs.backup_start_date DESC;
Max Vernon
quelle
1

Zum Anzeigen der letzten vollständigen, Diff- und Protokollsicherungen für jede Datenbank, wobei Null angezeigt wird, wenn nie eine Sicherung durchgeführt wird . using pivot (geändert von der Quelle )

Beachten Sie, dass Sie ohne Beitritt zu master.sys.databases und ohne Verwendung von msdb.dbo.backupset keine Datenbanken finden, für die keine Sicherungen vorhanden sind

  SELECT  name ,
            recovery_model_desc ,
            state_desc ,
            d AS 'Last Full Backup' ,
            i AS 'Last Differential Backup' ,
            l AS 'Last log Backup'
    FROM    ( SELECT    db.name ,
                        db.state_desc ,
                        db.recovery_model_desc ,
                        type ,
                        backup_finish_date
              FROM      master.sys.databases db
                        LEFT OUTER JOIN msdb.dbo.backupset a ON a.database_name = db.name
            ) AS Sourcetable 
        PIVOT 
            ( MAX(backup_finish_date) FOR type IN ( D, I, L ) ) AS MostRecentBackup

Bildbeschreibung hier eingeben

‌Basiert auf @SQLBoy-Anfrage können wir die folgende Abfrage schreiben, um BackupSize und BackupSet.Name in diese Abfrage aufzunehmen. Ich habe die Pivot-Daten weggelassen und sie einfacher gemacht

WITH    backupsetSummary
          AS ( SELECT   bs.database_name ,
                        bs.type bstype ,
                        MAX(backup_finish_date) MAXbackup_finish_date
               FROM     msdb.dbo.backupset bs
               GROUP BY bs.database_name ,
                        bs.type
             ),
        MainBigSet
          AS ( SELECT   db.name ,
                        db.state_desc ,
                        db.recovery_model_desc ,
                        bs.type ,
                        bs.name AS BackupSetName ,
                        bs.backup_size ,
                        bs.backup_finish_date
               FROM     master.sys.databases db
                        LEFT OUTER JOIN backupsetSummary bss ON bss.database_name = db.name
                        LEFT OUTER JOIN msdb.dbo.backupset bs ON bs.database_name = db.name
                                                              AND bss.bstype = bs.type
                                                              AND bss.MAXbackup_finish_date = bs.backup_finish_date
             )
    SELECT  *
    FROM    MainBigSet
Iman Abidi
quelle
Hallo @ imanabidi, kannst du mir bitte helfen, zwei weitere Spalten zu dem Code hinzuzufügen, den du oben gepostet hast? Wir verwenden ein Drittanbieter-Tool. Dieser Name spiegelt sich in msdb.dbo.backupset.name wider. Bitte lassen Sie es mich wissen.
SQLBoy
0

Sie können das folgende Skript verwenden:

1) Wenn Sie die neueste Sicherung erhalten möchten, verwenden Sie nur den folgenden Befehl:

SELECT sdb.Name AS DatabaseName,
COALESCE(CONVERT(VARCHAR(12), MAX(bus.backup_finish_date), 101),'-') AS LastBackUpTime
FROM sys.sysdatabases sdb
LEFT OUTER JOIN msdb.dbo.backupset bus ON bus.database_name = sdb.name
GROUP BY sdb.Name

Referenz: http://blog.sqlauthority.com/2010/11/04/sql-server-finding-last-backup-time-for-all-database/

2) Wenn Sie den Sicherungsverlauf für alle Datenbanken der letzten sieben Tage abrufen möchten:

SELECT 
   CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server,
   msdb.dbo.backupset.database_name, 
   msdb.dbo.backupset.backup_start_date, 
   msdb.dbo.backupset.backup_finish_date,
   msdb.dbo.backupset.expiration_date,
   CASE msdb..backupset.type 
       WHEN 'D' THEN 'Database' 
       WHEN 'L' THEN 'Log' 
   END AS backup_type, 
   msdb.dbo.backupset.backup_size, 
   msdb.dbo.backupmediafamily.logical_device_name, 
   msdb.dbo.backupmediafamily.physical_device_name,  
   msdb.dbo.backupset.name AS backupset_name,
   msdb.dbo.backupset.description
FROM   msdb.dbo.backupmediafamily 
   INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id 
WHERE  (CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) >= GETDATE() - 7) 
ORDER BY 
   msdb.dbo.backupset.database_name,
   msdb.dbo.backupset.backup_finish_date

Referenz: http://www.mssqltips.com/sqlservertip/1601/script-to-retrieve-sql-server-database-backup-history-and-no-backups/

Ahmad Abuhasna
quelle
0

Letztes Sicherungsdatum für alle Datenbanken. Einfach.

SELECT sdb.Name AS DatabaseName,
COALESCE(CONVERT(VARCHAR(12), MAX(bus.backup_finish_date), 101),'-') AS LastBackUpTime
FROM sys.sysdatabases sdb
LEFT OUTER JOIN msdb.dbo.backupset bus ON bus.database_name = sdb.name
GROUP BY sdb.Name
Almounkez
quelle
0

Ich denke, unten ist die Abfrage, nach der wir alle gesucht haben:

Skript oder Abfrage, mit der die letzte vollständige Sicherung und die letzte Protokollsicherung für jede Datenbank auf jedem Produktionsserver unter Verwendung der Systemtabelle "backupset" und der zugehörigen Sicherungstabellen angezeigt werden.

-- Query to find latest "Full" as well as "T-Log" backup of all specified Databases 
USE MSDB
GO

SELECT msdb.dbo.backupset.server_name
    ,msdb.dbo.backupset.database_name
    ,CASE msdb.dbo.backupset.[type] -- Let's decode the main types of backup here
        WHEN 'D'
            THEN 'Full'
        WHEN 'I'
            THEN 'Differential'
        WHEN 'L'
            THEN 'Transaction Log'
        WHEN 'F'
            THEN 'File or filegroup'
        WHEN 'G'
            THEN 'Differential file'
        WHEN 'P'
            THEN 'Partial'
        WHEN 'Q'
            THEN 'Differential partial'
        ELSE msdb.dbo.backupset.[type]
        END AS BackupType
    ,msdb.dbo.backupset.backup_start_date
    ,msdb.dbo.backupset.backup_finish_date
    ,CAST((CAST(DATEDIFF(s, msdb.dbo.backupset.backup_start_date, msdb.dbo.backupset.backup_finish_date) AS INT)) / 3600 AS VARCHAR) + ' hours, ' + CAST((CAST(DATEDIFF(s, msdb.dbo.backupset.backup_start_date, msdb.dbo.backupset.backup_finish_date) AS INT)) / 60 AS VARCHAR) + ' minutes, ' + CAST((CAST(DATEDIFF(s, msdb.dbo.backupset.backup_start_date, msdb.dbo.backupset.backup_finish_date) AS INT)) % 60 AS VARCHAR) + ' seconds' AS [Total_Time_Taken_For_Backup]
    ,msdb.dbo.backupmediafamily.physical_device_name AS Backup_File_Location
FROM msdb.dbo.backupmediafamily
INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id
WHERE (
        backup_set_ID IN (
            SELECT MAX(backup_set_id)
            FROM msdb.dbo.backupset
            WHERE msdb.dbo.backupset.[type] = 'D'
            GROUP BY database_name
            )
        OR backup_set_ID IN (
            SELECT MAX(backup_set_id)
            FROM msdb.dbo.backupset
            WHERE msdb.dbo.backupset.[type] = 'L'
            GROUP BY database_name
            )
        )
ORDER BY msdb.dbo.backupset.database_name
    ,BackupType
GO
Kundan Dasange
quelle