简体   繁体   中英

SQL Server Missing Backups

I'm trying to get a list of missing full backups, but I need this list to show me which user performed the latest backup. The problem is, I don't know how to filter that, since what I'm querying is returning all the last backups for each user.

Example:

SELECT 
    @@SERVERNAME AS ServerName,
    d.[name] AS DatabaseName,
    b.user_name as UserName,
    'Backups Not Performed Recently' AS Finding,
    'Last backed up: ' + COALESCE(CAST(MAX(b.backup_finish_date) AS VARCHAR(25)),'never') AS Details
FROM    
    master.sys.databases d
LEFT OUTER JOIN 
    msdb.dbo.backupset b ON d.name COLLATE SQL_Latin1_General_CP1_CI_AS = b.database_name COLLATE SQL_Latin1_General_CP1_CI_AS
                         AND b.type = 'D'
                         AND b.server_name = SERVERPROPERTY('ServerName') /*Backupset ran on current server */
WHERE   
    d.database_id <> 2  /* Bonus points if you know what that means */
    AND d.state NOT IN(1, 6, 10) /* Not currently offline or restoring, like log shipping databases */
    AND d.is_in_standby = 0 /* Not a log shipping target database */
    AND d.source_database_id IS NULL /* Excludes database snapshots */
GROUP BY 
    d.name, b.user_name
HAVING  
    MAX(b.backup_finish_date) <= DATEADD(dd, -7, GETDATE())
    OR MAX(b.backup_finish_date) IS NULL

Returns:

ServerName  DatabaseName    UserName    Finding Details
ServerA     DatabaseA       Userxyz     Backups Not Performed Recently  Last backed up: Nov 30 2016  2:45PM
ServerA     DatabaseA       Userabc     Backups Not Performed Recently  Last backed up: Nov 24 2016 12:36PM
ServerA     DatabaseA       Userdef     Backups Not Performed Recently  Last backed up: Feb  5 2017  1:26AM

When I just need it to return the id and results from the latest date. Desired result would look like this:

ServerName  DatabaseName    UserName    Finding Details
ServerA     DatabaseA       Userxyz     Backups Not Performed Recently  Last backed up: Feb  5 2017  1:26AM

We can use row number here to choose the most recent backup entry for each database:

WITH cte AS (
    SELECT @@SERVERNAME AS ServerName,
           d.[name] AS DatabaseName,
           b.user_name as UserName,
           'Backups Not Performed Recently' AS Finding,
           'Last backed up: ' + COALESCE(CAST(MAX(b.backup_finish_date) AS VARCHAR(25)),'never') AS Details,
           ROW_NUMBER() OVER (PARTITION BY d.[name] ORDER BY MAX(b.backup_finish_date) DESC) rn
    FROM master.sys.databases d
    LEFT OUTER JOIN msdb.dbo.backupset b
        ON d.name COLLATE SQL_Latin1_General_CP1_CI_AS = b.database_name COLLATE SQL_Latin1_General_CP1_CI_AS AND
           b.type = 'D' AND
           b.server_name = SERVERPROPERTY('ServerName')
    WHERE d.database_id <> 2 AND
          d.state NOT IN(1, 6, 10) AND
          d.is_in_standby = 0 AND
          d.source_database_id IS NULL
    GROUP BY d.name,
             b.user_name
    HAVING MAX(b.backup_finish_date) <= DATEADD(dd, -7, GETDATE()) OR
           MAX(b.backup_finish_date) IS NULL
)
SELECT *
FROM cte t
WHERE t.rn = 1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM