首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server从多个完整备份、diff备份和日志备份恢复序列

Server从多个完整备份、diff备份和日志备份恢复序列
EN

Database Administration用户
提问于 2012-02-06 01:41:19
回答 3查看 2.5K关注 0票数 2

假设我有大量的SQL Server数据库备份(可能包括完整备份、差异备份和日志备份)。我想要编写一个程序,它可以生成一个SQL脚本,使数据库进入其最近的状态。现在,我很难找到这些备份文件的正确恢复顺序。我在MSDN中阅读了一些页面,并得到了一些基本规则。它们是:

  • 完整备份不仅包括数据,还包括足够的日志记录。这使得完全备份可以由自身使用(还原后,使用备份中的日志记录将数据库前滚到一致状态)
  • 每个备份文件(包括full、diff和log)都有一些公共属性。
    • 第一个lsn:指定备份中包含的第一个日志记录
    • 最后一次lsn - 1:指定备份中包含的最后一条日志记录
    • 检查点lsn:指定与最近的检查点操作相对应的日志记录
    • 数据库lsn:指定与最近的完全备份相对应的日志记录

  • 需要连续还原的日志备份可能有重叠的日志记录,也就是说,如果需要在日志备份B之前还原日志备份A,则A.last_lsn可能大于或等于B.first_lsn
  • 您需要恢复最新的完全备份(我们肯定只有一个备份),然后是最近的diff备份(我们可能有也可能没有),最后,依次恢复在完整备份或diff备份之后进行的日志备份。

现在我的问题是,如何确定哪一个是最新的完全备份和差异备份?如何确定在完整还原或差异还原之后应该开始还原哪个日志文件?我想这些信息可以从这些lsn中找到,但是我不确定算法。有人能帮我写一段伪码来描述算法吗?谢谢。

EN

回答 3

Database Administration用户

回答已采纳

发布于 2012-02-06 09:04:23

通常,对文件的备份会附加时间戳(例如MyDatabase_FULL_201202060900.bak),因此您可以选择使用脚本生成给定文件目录的恢复序列。Google将给你提供几十个例子,SSC脚本库也是如此。目前我的图书馆里有这个剧本

如果您已经备份的服务器可用,您可以从msdbdbo.backupsetdbo.backupmediafamily这里的例子生成恢复脚本。注SSMS将为您生成正确的脚本,您可以使用Profiler来捕获用于此操作的查询。

票数 4
EN

Database Administration用户

发布于 2012-02-06 08:59:17

就我个人而言,我喜欢我的备份被时间戳,比如文件名中的MyDB-yyyymmddhhnn-Full.bakMyDB-yyyymmddhhnn-Log.bak。我从未实际从备份文件中读取LSN,也从未从系统表中读取LSN信息。

您可以对文件进行排序,并很容易地选择您需要的文件。

票数 4
EN

Database Administration用户

发布于 2012-02-06 16:04:19

如果备份文件名中没有时间戳,则可以使用单头恢复命令获取有关备份文件的信息。

代码语言:javascript
复制
RESTORE HEADERONLY
FROM DISK = N’e:\stemp\backup_file.bak’

这将提供像ChekpointLSN、DBLSN、LatLSN和备份时间这样的信息。还有关于Servername、DB名称和执行备份的用户的信息。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/12291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档