Nhận sao lưu đầy đủ cuối cùng và sao lưu nhật ký giao dịch cho mỗi cơ sở dữ liệu


15

Cách viết tập lệnh hoặc truy vấn sẽ hiển thị bản sao lưu đầy đủ cuối cùng và bản sao lưu nhật ký cuối cùng cho mỗi cơ sở dữ liệu trên mỗi máy chủ sản xuất bằng cách sử dụng "bản sao lưu" của bảng hệ thống và các bảng sao lưu có liên quan.

Câu trả lời:


16

Một cái gì đó như thế này sẽ giúp bạn có được đầu ra mà bạn đang tìm kiếm. Truy vấn dưới đây lấy bản sao lưu gần nhất của loại đầy đủ, vi sai hoặc sao lưu nhật ký cho mỗi cơ sở dữ liệu.

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

9

Tôi đã viết một bài về việc sử dụng backupset ở đây nếu bạn quan tâm đến chi tiết hơn về bảng. Đơn giản mặc dù đây là một truy vấn để kéo những gì bạn muốn.

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

Lưu ý: Nó đã được đề cập rằng tôi đã tham gia backmediaset và nó không cần thiết. Điều này là đúng và tôi chỉ có thể giả sử rằng tôi đã quên xóa nó khỏi truy vấn ban đầu trong liên kết. Tôi đã xóa nó khỏi đây.


4

Bạn có thể muốn xem xét msdbcơ sở dữ liệu, cho những chi tiết.

Ví dụ:

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;

1

để hiển thị các bản sao lưu đầy đủ, Diff, Log cuối cùng cho mỗi cơ sở dữ liệu xem xét hiển thị null nếu không có bản sao lưu nào được thực hiện . sử dụng trục (sửa đổi từ nguồn )

lưu ý rằng không tham gia vào master.sys.database và chỉ dựa vào msdb.dbo.backupset, bạn sẽ không tìm thấy các dbs không có bản sao lưu

  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

nhập mô tả hình ảnh ở đây

AsedĐược yêu cầu @QueryBoy, chúng tôi có thể viết truy vấn bên dưới để bao gồm BackupSize và BackupSet.Name trong truy vấn này. Tôi đã bỏ qua dữ liệu xoay vòng và làm cho nó đơn giản hơn

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

Xin chào @ imanabidi, bạn có thể vui lòng giúp tôi thêm hai cột nữa vào mã bạn đã đăng không. Tôi muốn backup_size và đặt tên từ bảng msdb.dbo.backupset trong đó msdb.dbo.backupset.name = 'XXXXXXX'. Tôi cần điều này bởi vì chúng tôi đang sử dụng một công cụ của bên thứ ba. Tên đó được phản ánh trong msdb.dbo.backupset.name. Xin vui lòng cho tôi biết.
SQLBoy

0

bạn có thể sử dụng đoạn script sau:

1) nếu bạn muốn nhận bản sao lưu mới nhất, chỉ sử dụng lệnh sau:

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

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

2) nếu bạn muốn lấy lịch sử sao lưu cho tất cả các cơ sở dữ liệu trong bảy ngày qua:

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

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


0

Ngày sao lưu cuối cùng cho tất cả các cơ sở dữ liệu. Đơn giản.

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

0

Tôi nghĩ dưới đây là truy vấn mà tất cả chúng ta đã và đang tìm kiếm:

Tập lệnh hoặc truy vấn sẽ hiển thị bản sao lưu đầy đủ cuối cùng và bản sao lưu nhật ký cuối cùng cho mỗi cơ sở dữ liệu trên mỗi máy chủ sản xuất bằng cách sử dụng bảng "sao lưu" và bảng sao lưu có liên quan.

-- 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.