각 데이터베이스에 대한 마지막 전체 백업 및 트랜잭션 로그 백업 받기 데이터베이스에 대한 마지막 전체 백업 및

시스템 테이블 “backupset”및 관련 백업 테이블을 사용하여 각 프로덕션 서버의 각 데이터베이스에 대한 마지막 전체 백업 및 마지막 로그 백업을 표시하는 스크립트 또는 쿼리를 작성하는 방법.



답변

이런 식으로 원하는 결과를 얻을 수 있습니다. 아래 쿼리는 각 데이터베이스에 대한 전체, 차등 또는 로그 백업 유형의 최신 백업을 가져옵니다.

;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;


답변

테이블에 대한 자세한 내용은 여기서 backupset 사용에 대한 게시물을 작성했습니다 . 단순히 여기에 원하는 것을 가져 오는 쿼리가 있습니다.

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

참고 : 내가 backmediaset에 가입했다고 말했지만 필요하지 않았습니다. 이것은 사실이며 링크의 원래 쿼리에서 제거하는 것을 잊었다 고 가정 할 수 있습니다. 여기서 제거했습니다.


답변

msdb자세한 내용 은 데이터베이스를 참조하십시오.

예를 들어 :

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;


답변

백업을 수행하지 않은 경우 null 표시를 고려하여 각 데이터베이스에 대한 마지막 전체, 차이, 로그 백업을 표시합니다 . 피벗 사용 ( 소스 에서 수정) )

master.sys.databases에 가입하지 않고 msdb.dbo.backupset에만 의존하지 않으면 백업이없는 DB를 찾을 수 없습니다.

  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

여기에 이미지 설명을 입력하십시오

‌ @ SQLBoy 요청을 기반으로 아래 쿼리를 작성하여이 쿼리에 BackupSize 및 BackupSet.Name을 포함시킬 수 있습니다. 피벗 된 데이터를 생략하고 더 간단하게 만듭니다.

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


답변

다음 스크립트를 사용할 수 있습니다.

1) 최신 백업을 받으려면 다음 명령 사용하십시오.

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

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

2) 지난 7 일 동안 모든 데이터베이스의 백업 히스토리를 가져 오려면 다음을 수행하십시오.

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

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


답변

모든 데이터베이스의 마지막 백업 날짜입니다. 단순한.

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


답변

아래는 우리 모두가 바라는 쿼리입니다.

시스템 테이블 “backupset”및 관련 백업 테이블을 사용하여 각 프로덕션 서버의 각 데이터베이스에 대한 마지막 전체 백업 및 마지막 로그 백업을 표시하는 스크립트 또는 쿼리입니다.

-- 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