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á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:
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;
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.
Bạn có thể muốn xem xét msdb
cơ 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;
để 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
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
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
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
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