Из-за недосмотра мои резервные копии базы данных не имеют журнала транзакций, но у меня есть полные резервные копии с пятидневными интервалами. Чтобы внести некоторые изменения в текущую версию базы данных, я восстановил каждую из этих резервных копий в отдельные базы данных, каждая из которых названа в формате <dbname><backupdate>
, где <dbname>
- это имя моей базы данных.
Мне нужно найти дату резервного копирования, связанную с каждой базой данных программно, где я не могу предположить формат имен баз данных. Поскольку <dbname><backupdate>
(имя моих баз данных) не соответствует <dbname>
(имя базы данных в файлах резервных копий), я не могу использовать запрос, который нашел на нескольких других страницах:
SELECT d.name, b.backup_start_date
FROM sys.databases d
LEFT OUTER JOIN msdb..backupset b ON d.name = b.database_name
Я обнаружил, что решение лежит в таблице msdb..restorehistory
.
SELECT d.name, MAX(b.backup_start_date) backup_date
FROM sys.databases d
JOIN msdb..restorehistory r ON r.destination_database_name = d.name
JOIN msdb..backupset b ON r.backup_set_id = b.backup_set_id
WHERE d.database_id > 4 -- for excluding system databases
GROUP BY d.name
ORDER BY backup_date, d.name
Это вернет только базы данных, которые были восстановлены из резервной копии. Если вы хотите включить все несистемные базы данных, измените операторы JOIN
на LEFT OUTER JOIN
.