【发布时间】:2022-11-29 01:51:39
【问题描述】:
我试图在 SQL Server 中组织日志链。链坏了,我想按正确的顺序恢复数据库。
我执行这个查询:
SELECT BS.backup_set_id,
BS.backup_finish_date,
BS.type,
BM.physical_device_name,
first_lsn,
last_lsn,
database_backup_lsn,
BS.has_incomplete_metadata,
BS.begins_log_chain
FROM msdb.dbo.backupmediafamily BM
INNER JOIN msdb.dbo.backupset BS ON BM.media_set_id = BS.media_set_id
WHERE BS.database_name = 'MyDb';
所以如果我想恢复到 17:45:00,我不能,因为链坏了。
我试图编写一个查询来检查第一个和最后一个 lsn。
这是我试过的:
WITH T AS
(SELECT BS.backup_set_id,
BS.backup_finish_date,
BS.type,
BM.physical_device_name,
first_lsn,
last_lsn,
database_backup_lsn,
BS.has_incomplete_metadata,
BS.begins_log_chain
FROM msdb.dbo.backupmediafamily BM
INNER JOIN msdb.dbo.backupset BS ON BM.media_set_id = BS.media_set_id
WHERE BS.database_name = 'MyDb')
SELECT T1.*
FROM T T1,
T T2
WHERE T1.first_lsn = T2.last_lsn;
但这并没有给我我想要的东西,我想得到一条可以用来恢复的链条。
【问题讨论】:
-
这是智力练习还是实践练习?如果是后者,你肯定是在重新发明轮子。查看 dbatools powershell 模块。特别是
Get-DbaDbBackupHistory和Restore-DbaDatabasecmdlet。后者有一个-OutputScriptOnly标志,让您有机会检查它将运行的脚本,而无需实际这样做。
标签: sql sql-server