首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Server备份文件分组以进行还原

问将Server备份文件分组以进行还原
EN

Stack Overflow用户
提问于 2015-02-12 19:23:57
回答 1查看 334关注 0票数 0

我有一个SQL Server数据库,它每周创建一次完整备份,每天创建一次差异备份,每小时创建一次事务日志备份。这些正在被FTP转到另一个盒子,在那里我想要一个.NET应用程序(我正在编写)来把它们捡起来并恢复到一个工作的数据库中。

每当出现一个新的事务日志文件时,我都希望找到适当的完整备份文件、差异备份文件以及当天的其他日志txn文件,使用它们来恢复数据库。

我可以使用Server管理对象 .NET接口来完成所有这些工作。

问题是,这台机器上将有几个星期的备份文件,所以我需要一种方法将它们适当地组合在一起。做这件事最好的方法是什么?

文件本身的名称确实包含时间戳数据。

MyDatabase_FULL_20150208_000001.bak

但我宁愿不解析文件名来获取日期/时间信息。

SMO对象确实提供了一种读取文件和获取头信息的方法,其中之一就是创建备份的数据/时间。

我想这没关系,但我知道Server可以使用备份文件中的LSN元数据将它们组合在一起。我只是不知道它是如何工作的,也不知道SMO是否允许您访问它。

如果有人对将这些文件组合在一起的简单和/或可靠的方法有任何见解,那就太好了。

EN

回答 1

Stack Overflow用户

发布于 2015-02-12 19:51:54

可以通过SMO访问LSN。一个快速的google把我带到了这页面。它没有C#示例,但是有一个用于VB.NET或PowerShell。

代码语言:javascript
复制
$srv = new-object Microsoft.SqlServer.Management.Smo.Server("(local)")
$res = new-object Microsoft.SqlServer.Management.Smo.Restore
$backup = new-object Microsoft.SqlServer.Management.Smo.Backup
$backup.Devices.AddDevice("C:\AdventureWorks2012Backup.bak", [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$backup.Database = "AdventureWorks2012"
$backup.Action = [Microsoft.SqlServer.Management.Smo.BackupActionType]::Database
$backup.Initialize = $TRUE
$backup.SqlBackup($srv)

$res.Devices.AddDevice("C:\AdventureWorks2012Backup.bak", [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$dt = $res.ReadBackupHeader($srv)

foreach($r in $dt.Rows)
{
   foreach ($c in $dt.Columns)
   {
      Write-Host $c "=" $r[$c]
   }
}

要将LSNs链接到一起,您需要:

  1. 标识最新的完全备份:具有最高CheckpointLSN的备份
  2. 标识最新的差异备份:具有最高CheckpointLSN的备份,其中DatabaseBackupLSN等于完整备份的CheckpointLSN。
  3. 确定要还原的第一个事务日志备份: FirstLSN低于差异备份的备份和高于差异备份的LastLSN。
  4. 将所有其他缺失的事务日志备份链接在一起:下一个备份是备份,其中FirstLSN等于上一次备份的LastLSN。

编辑

这里和这里是关于LSN链的更多信息。

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

https://stackoverflow.com/questions/28486030

复制
相关文章

相似问题

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