Sayangnya, backupset
tidak mengandung cadangan yang gagal, dan saya tidak tahu di mana pun di dalamnya msdb
dapat disimpan, kecuali jika Anda dapat mengandalkan sysjobhistory
, yang tidak mengandung semua waktu (tergantung pada pengaturan penyimpanan Anda), dan yang akan mengabaikan upaya cadangan yang dilakukan di luar konteks pekerjaan, dan yang - dalam kasus pekerjaan yang membuat cadangan banyak basis data - tidak akan memberikan diferensiasi tentang basis data yang sebenarnya gagal, kecuali jika itu terjadi pada awal pekerjaan - ini adalah karena pesannya cukup bertele-tele tetapi akan terpotong.
Jika Anda benar-benar tahu bahwa Job n
hanya membuat cadangan satu database, dan bahwa setiap kegagalan pekerjaan itu berarti bahwa database tidak didukung (karena pekerjaan itu juga bisa gagal setelah cadangan berhasil, misalnya mencoba mengecilkan atau melakukan pemeliharaan lainnya), maka Anda dapat menggunakan kueri seperti ini:
DECLARE @job sysname, @db sysname;
SELECT @job = N'Job 1', @db = N'db_name';
SELECT
bs.database_name,
bs.backup_start_date,
bs.backup_finish_date,
[Total Time] = CAST((DATEDIFF(SECOND, bs.backup_start_date,bs.backup_finish_date))
AS varchar(30))+ ' secs',
CAST(bs.backup_size/1024/1024 AS decimal(10,2)) AS 'Backup Size(MB)',
h.[message]
FROM msdb.dbo.sysjobhistory AS h
INNER JOIN msdb.dbo.sysjobs AS j
ON h.job_id = j.job_id
AND h.step_id = 0
LEFT OUTER JOIN msdb.dbo.backupset AS bs
ON bs.database_name = @db
AND
ABS(DATEDIFF(SECOND, bs.backup_start_date, CONVERT(DATETIME,convert(char(8),h.run_date)
+ ' ' + STUFF(STUFF(RIGHT('0'+CONVERT(char(6),h.run_time),6),3,0,':'),6,0,':')))) < 5
WHERE j.name = @job
ORDER BY bs.backup_start_date;
Ya, ini benar-benar jelek, karena sysjobhistory
masih, bahkan di SQL Server 2014, menyimpan run_date
dan run_time
sebagai bilangan bulat terpisah. Saya bertaruh siapa pun yang membuat keputusan itu masih berlatar belakang papan dart di seluruh gedung 35. Ini juga mengasumsikan bahwa cadangan adalah langkah pertama dalam pekerjaan, maka perbandingan tanggal / waktu yang kurang ilmiah untuk memastikan kami sudah benar mengkorelasikan instance pekerjaan yang tepat dengan instance cadangan yang tepat. Oh, betapa aku berharap bisa mendesain ulang skema untuk cadangan dan pekerjaan.
Jika Anda ingin cakupan yang lebih luas di luar pekerjaan, Anda dapat mencari cadangan yang gagal di log galat SQL Server (jika belum didaur ulang):
EXEC sp_readerrorlog 0, 1, 'BACKUP failed'; -- current
EXEC sp_readerrorlog 1, 1, 'BACKUP failed'; -- .1 (previous)
EXEC sp_readerrorlog 2, 1, 'BACKUP failed'; -- .2 (the one before that)
....
(Tapi saya tidak tahu cara yang bagus dan mudah untuk memasukkan output itu ke dalam permintaan Anda yang sudah ada.)
Anda juga dapat mengkorelasikan cadangan yang "hilang" yang berhasil dari jejak default, misalnya
DECLARE @path nvarchar(260);
SELECT
@path = REVERSE(SUBSTRING(REVERSE([path]),
CHARINDEX(CHAR(92), REVERSE([path])), 260)) + N'log.trc'
FROM sys.traces
WHERE is_default = 1;
SELECT dt.DatabaseName, dt.StartTime, bs.backup_start_date, bs.backup_finish_date,
[Status] = CASE WHEN bs.backup_start_date IS NULL
THEN 'Probably failed'
ELSE 'Seems like success'
END
FROM sys.fn_trace_gettable(@path, DEFAULT) AS dt
LEFT OUTER JOIN msdb.dbo.backupset AS bs
ON dt.DatabaseName = bs.database_name
AND ABS(DATEDIFF(SECOND, dt.StartTime, bs.backup_start_date)) < 5
WHERE dt.EventClass = 115 -- backup/restore events
AND UPPER(CONVERT(nvarchar(max),dt.TextData)) LIKE N'BACKUP%DATABASE%'
--AND dt.DatabaseName = N'db_name' -- to filter to a single database
--AND bs.database_name = N'db_name'
ORDER BY dt.StartTime;
Tentu saja ini juga bergantung pada data dari jejak default yang hilang, nama basis data tidak berubah, dll. Dan sayangnya, jejak default tidak membedakan antara cadangan yang berhasil dan yang gagal, dan waktu mulai tidak akan sama persis dengan MSDB data, tetapi selama Anda tidak menjalankan cadangan dalam satu lingkaran, ini seharusnya baik-baik saja untuk eyeballing. Saya sudah mencoba memasukkan masalah ini ke dalam kueri.
Akhirnya, Anda mungkin ingin menggunakan FULL OUTER JOIN
sana, jika backupset memiliki riwayat yang lebih lama daripada jejak default. Ini mengubah semantik [Status]
sedikit.
Anda juga mungkin ingin mencoba hal jahat ini , meskipun saya tidak beruntung dengan itu. Saya hanya dapat melihat status saat ini atau terbaru, sehingga hanya membantu ketika pekerjaan gagal saat terakhir kali dijalankan, dan - seperti sysjobhistory
- tidak dapat memperoleh informasi tentang cadangan yang dicoba tetapi tidak melalui pekerjaan.