将SQL Server备份文件分组在一起以进行还原

时间:2015-02-12 19:23:57

标签: sql-server database backup smo

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

每当新的事务日志文件进入时,我想找到当天适当的完整备份文件,差异备份文件和其他日志txn文件,使用它们来恢复数据库。

我可以使用SQL Server Management Objects .NET接口完成所有这些。

问题是这台机器上有几周的备份文件,所以我需要一种方法将它们组合在一起。这样做的最佳方式是什么?

文件名称本身包含时间戳数据,例如

  

MyDatabase_FULL_20150208_000001.bak

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

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

我没想,但我知道SQL Server有办法在备份文件中使用LSN元数据将它们组合在一起。我只是不知道它是如何工作的,或者SMO API是否允许您访问它。

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

1 个答案:

答案 0 :(得分:1)

可以通过SMO访问LSN。快速谷歌将我带到this页面。它没有C#示例,但有一个用于VB.NET或PowerShell。

$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]
   }
}

要将LSN链接在一起,您需要:

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

    Herehere是关于LSN链的更多信息。