วิธีเขียนสคริปต์หรือแบบสอบถามที่จะแสดงการสำรองข้อมูลเต็มรูปแบบล่าสุดและสำรองข้อมูลบันทึกล่าสุดสำหรับแต่ละฐานข้อมูลในแต่ละเซิร์ฟเวอร์ที่ใช้งานจริงโดยใช้ตารางระบบ "backupset" และตารางสำรองข้อมูลที่เกี่ยวข้อง
วิธีเขียนสคริปต์หรือแบบสอบถามที่จะแสดงการสำรองข้อมูลเต็มรูปแบบล่าสุดและสำรองข้อมูลบันทึกล่าสุดสำหรับแต่ละฐานข้อมูลในแต่ละเซิร์ฟเวอร์ที่ใช้งานจริงโดยใช้ตารางระบบ "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;
สำหรับการแสดงเต็มรูปแบบ, การสำรองข้อมูล Diff, เข้าสู่ระบบครั้งสุดท้ายสำหรับแต่ละฐานข้อมูลพิจารณาการแสดง null ถ้าสำรองไม่เคยถ่าย ใช้ pivot (แก้ไขจากแหล่งที่มา )
โปรดทราบว่าโดยไม่ต้องเข้าร่วมกับmaster.sys.databaseและพึ่งพา msdb.dbo.backupset คุณจะไม่พบ dbs ที่ไม่มีการสำรองข้อมูล
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) หากคุณต้องการรับประวัติการสำรองข้อมูลสำหรับฐานข้อมูลทั้งหมดในช่วงเจ็ดวันที่ผ่านมา:
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
วันที่สำรองข้อมูลครั้งล่าสุดสำหรับฐานข้อมูลทั้งหมด ง่าย
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