【问题标题】:SQL Server Missing BackupsSQL Server 缺少备份
【发布时间】:2017-02-14 02:25:54
【问题描述】:

我正在尝试获取丢失的完整备份的列表,但我需要此列表来显示哪个用户执行了最新备份。问题是,我不知道如何过滤它,因为我查询的是返回每个用户的所有最后备份。

例子:

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

返回:

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

当我只需要它返回最新日期的 id 和结果时。期望的结果如下所示:

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

【问题讨论】:

    标签: sql sql-server database tsql database-backups


    【解决方案1】:

    我们可以在这里使用行号为每个数据库选择最近的备份条目:

    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
    

    【讨论】:

    • 您的解决方案很有趣,但我在服务器上仍然遇到查询不应返回任何内容的问题
    • @carolcastelli 那么也许您应该使用反映您所面临的实际问题的数据来更新您的问题。我的查询满足您向我们展示的测试数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多