PowerShell应用之-批量还原数据库(支持完整,差异,事务日志)
2011-11-09 22:24
323 查看
开始
直接切入主题,今天我们继续来描述PowerShell的一个应用,实现批量还原SQL Server数据库,可以支持SQL Server 2005\2008数据库。在本章中,我们将涉及到几个要点:
Microsoft.SqlServer.Management.Smo.Restore类
System.Data.DataTable类
PowerShell中的函数(Function)
PowerShell命令Get-Unique
Microsoft.SqlServer.Management.Smo.Restore类
在PowerShell要实现还原SQL Server数据库,我们需要应用到Microsoft.SqlServer.Management.Smo.Restore类。它为我们提供了丰富的还原数据库过程需要的各种属性和方法。首先,提供一份数据库备份文件,我们要还原它,我们需要知道备份文件的标头信息(backup header information),和备份文件里组成(数据文件&日志文件)(the database and log files contained in the backup set)
要是在SQL Server Management Studio(SSMS)里,直接可以调用Transact-SQL:
View Code <#===========================================#>
##还原数据库
$serverInstance="WINSERVER01\SQL2008DE01"
$userName="sa"
$password="sql20081"
$Path="E:\DBBackup\"
$DBList=""
$RestorePath="E:\DATA\SQL2008DE01\"
$StopAt="2011-11-8 18:28:00" #还原到至时间点 [DateTime]
<#===========================================#>
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Data") | Out-Null
$ServerConnection =new-object "Microsoft.SqlServer.Management.Common.ServerConnection" $serverInstance,$userName, $password
$ReadBackupHeader=New-Object "System.Data.DataTable"
$ReadBackupHeader.Columns.Add("DatabaseName","String") |Out-Null
$ReadBackupHeader.Columns.Add("BackupType","Int16") |Out-Null
$ReadBackupHeader.Columns.Add("BackupStartDate","DateTime") |Out-Null
$ReadBackupHeader.Columns.Add("BakFile","String") |Out-Null
$ReadBackupHeader.Columns.Add("NoRecovery","Boolean") |Out-Null
$ReadBackupHeader.Columns.Add("Position","Int16") |Out-Null
$ReadFileList=New-Object "System.Data.DataTable"
$ReadFileList.Columns.Add("DatabaseName","String") |Out-Null
$ReadFileList.Columns.Add("LogicalName","String") |Out-Null
$ReadFileList.Columns.Add("PhysicalName","String") |Out-Null
$ReadFileList.Columns.Add("Type","String") |Out-Null
$ReadFileList.Columns.Add("FileId","Int16") |Out-Null
$ReadFileList.Columns.Add("BakFile","String") |Out-Null
$ReadFileList.Columns.Add("FileNumber","Int16") |Out-Null
#--------------------------------------
#检查备份数据库清单
#--------------------------------------
Function CheckDB
{
Param([String]$DBvar)
Begin
{
[Boolean]$CheckResult=$false
}
Process
{
If($DBList -eq "")
{
$CheckResult=$true
}
Else
{
Foreach($x In $DBList.Split(","))
{
If($x -eq $DBvar)
{
$CheckResult=$true
Break
}
}
}
}
End
{
Return $CheckResult
}
}
#--------------------------------------
#还原数据库函数
#--------------------------------------
Function RestoreDB
{
begin
{
[Boolean]$ExecResult=$False
}
Process
{
$rowsBackupHeader=$ReadBackupHeader.Select("DatabaseName='"+$db+"'","BackupStartDate Asc")
If ($rowsBackupHeader)
{
Foreach($rowBackupHeader In $rowsBackupHeader)
{
$File=$rowBackupHeader["BakFile"]
$BackupType=$rowBackupHeader["BackupType"]
$rowsFileList=$ReadFileList.Select("BakFile='"+$File+"' And FileNumber="+$rowBackupHeader["Position"])
$Restore.Devices.Clear()
$Restore.RelocateFiles.Clear()
$Restore.Database=$db
$Restore.Devices.AddDevice($File, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$Restore.ReplaceDatabase=$true
$Restore.KeepReplication=$False #不保留同步设置
$Restore.NoRecovery=$rowBackupHeader["NoRecovery"]
$Restore.FileNumber=$rowBackupHeader["Position"]
If ($BackupType -eq 2 ) #事务日志
{
$Restore.Action="Log"
$Restore.ToPointInTime=$(if($StopAt -gt $rowBackupHeader["BackupStartDate"]){$null} Else {$StopAt})
}
Else
{
$Restore.Action="Database"
$Restore.ToPointInTime=$null
}
foreach($rowFileList In $rowsFileList)
{
$logicalFileName=$rowFileList["LogicalName"]
If ($rowFileList.Type -eq "D")
{
$physicalFileName=$RestorePath+$logicalFileName+".mdf"
}
ElseIf ($rowFileList.Type -eq "L")
{
$physicalFileName=$RestorePath+$logicalFileName+".ldf"
}
$Restore.RelocateFiles.Add((New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile" $logicalFileName,$physicalFileName)) |Out-Null
}
#清除正在当前数据库的进程
$Server.KillAllProcesses($db)
#执行还原动作
$Restore.SqlRestore($Server)
$Restore.Wait()
Write-Host "已还原数据库. DataBase:" $DB "`t`.FileNumber=" $Restore.FileNumber "`tBakFile: " $File
$ExecResult=$True
}
}
Else
{
Write-Warning "在数据库 $DB .没有可还原的备份文件。"
}
}
End
{
Return $ExecResult
}
}
#--------------------------------------
#过滤备份文件
#--------------------------------------
Function FilterDB
{
#完整
$tmpRows1=$ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=1 And BackupStartDate<='"+$StopAt+"'","BackupStartDate Desc")
[DateTime]$tmpDate="1900-01-01"
if ($tmpRows1)
{
$tmpRow=$tmpRows1[0]
$tmpDate=$tmpRow["BackupStartDate"]
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=1 And BakFile<>'"+$tmpRow["BakFile"]+"'"))
{
$row.Delete()
}
}
Else
{
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=1"))
{
$row.Delete()
}
}
#差异
$tmpRows5=$ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=5 And BackupStartDate<='"+$StopAt+"' And BackupStartDate>'"+$tmpDate+"' ","BackupStartDate Desc")
if ($tmpRows1 -and $tmpRows5)
{
$tmpRow=$tmpRows5[0]
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=5 And BakFile<>'"+$tmpRow["BakFile"]+"'"))
{
$row.Delete()
}
}
Else
{
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=5"))
{
$row.Delete()
}
}
#事务日志
$tmpRows2=$ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=2 And BackupStartDate>='"+$StopAt+"'","BackupStartDate Asc")
if ($tmpRows1 -and $tmpRows2)
{
$tmpRow=$tmpRows2[0]
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=2 And BackupStartDate>='"+$StopAt+"' And BakFile<>'"+$tmpRow["BakFile"]+"'"))
{
$row.Delete()
}
}ElseIf($tmpRows1)
{
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=2 And BackupStartDate<='"+$tmpDate+"'"))
{
$row.Delete()
#$ReadBackupHeader | Format-Table -AutoSize -Wrap
}
}
Else
{
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=2"))
{
$row.Delete()
}
}
#结束对DataTable的编辑
$ReadBackupHeader.AcceptChanges()
#设置NoRecovery
$tmpRows=$ReadBackupHeader.Select("DatabaseName='"+$db+"'","BackupStartDate Desc")
If($tmpRows)
{$tmpRows[0]["NoRecovery"]=$false}
}
#--------------------------------------
Try
{
$ServerConnection.Connect()
}
Catch
{
Write-Error $_
}
if($ServerConnection.IsOpen)
{
Try
{
$Server=new-object "Microsoft.SqlServer.Management.Smo.Server" $ServerConnection
$Restore=new-object "Microsoft.SqlServer.Management.Smo.Restore"
$StopAt=$(If($StopAt -eq ""){"3000-12-31"}Else{[DateTime]$StopAt})
$Path=$Path+$(If($($Path.Split("\"))[-1] -eq "" ){""} Else {"\"})
$RestorePath=$(If($RestorePath -eq ""){$Server.Settings.DefaultFile}Else{$RestorePath}) #数据库文件默认路径(数据&日志文件同一路径)
$RestorePath=$RestorePath+$(If($($RestorePath.Split("\"))[-1] -eq "" ){""} Else {"\"})
Foreach($Bak In Get-ChildItem -Path $Path | Where-Object -FilterScript {$_.Mode -eq "-a---"}) #遍历备份文件夹
{
$File=$Path+$Bak.Name
$Restore.Devices.Clear()
$Restore.Devices.AddDevice($File, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$Restore.FileNumber=0
$Read=$Restore.ReadBackupHeader($Server)
Foreach ($row In $Read)
{
$newRow =$ReadBackupHeader.NewRow();
$newRow["DatabaseName"]=$row["DatabaseName"]
$newRow["BackupType"]=$row["BackupType"]
$newRow["BackupStartDate"]=$row["BackupStartDate"]
$newRow["BakFile"]=$File
$newRow["NoRecovery"]=$true
$newRow["Position"]=$row["Position"]
$ReadBackupHeader.Rows.Add($newRow)
$DBName=$row["DatabaseName"]
$Restore.FileNumber=$row["Position"]
$FileRead=$Restore.ReadFileList($Server)
Foreach ($Filerow In $FileRead)
{
$FileNewRow =$ReadFileList.NewRow();
$FileNewRow["DatabaseName"]=$DBName
$FileNewRow["LogicalName"]=$Filerow["LogicalName"]
$FileNewRow["PhysicalName"]=$Filerow["PhysicalName"]
$FileNewRow["Type"]=$Filerow["Type"]
$FileNewRow["FileId"]=$Filerow["FileId"]
$FileNewRow["BakFile"]=$File
$FileNewRow["FileNumber"]=$Restore.FileNumber
$ReadFileList.Rows.Add($FileNewRow)
}
}
}
#结束对DataTable的编辑
$ReadBackupHeader.AcceptChanges()
$ReadFileList.AcceptChanges()
#遍历数据库
Foreach( $db In $(Foreach($Row In $ReadBackupHeader.rows){$Row["DatabaseName"]}) | Sort-Object | Get-Unique )
{
If(CheckDB($db) -eq $true) #检查备份数据库清单
{
#过滤备份
FilterDB
#还原数据库
$Result=RestoreDB
}
}
}
Catch
{
Write-Error $_
}
}
![](http://images.cnblogs.com/cnblogs_com/wghao/201111/201111090129394423.png)
上面脚本能实现的是,在一个目录下存在着各个数据库的完整、差异、事务日志备份文件,可以根据设置“还原至时间点”还原某一个时间点的数据库。支持一个备份文件包含多个备份,支持自定义还原数据库清单。以上的脚本在PowerShell 2.0 + SQL Server2005+WinXP 和PowerShell 2.0 + SQL Server2008 R2+Windows Server 2008 R2 測試通過。
小結
本章我们描述了PowerShell2.0的一个应用,批量还原数据库,支持完整、差异、事务日志备份文件,并对其中的一些知识要点提取出来说明,让我们对PowerShell 2.0 有进一步的了解。在真实中,一些时候,特别是要在数据库后台批量处理一些任务,我们发觉PowerShell能为我们带来许多的方便。当然了,这里只是取1个批量的还原的例子,在实际的应用中,我们也许会碰到比当前例子更为复杂的情况,如页面还原、段落还原、联机还原等。可根据特定的场景,修改或编写更为复杂的脚本。
直接切入主题,今天我们继续来描述PowerShell的一个应用,实现批量还原SQL Server数据库,可以支持SQL Server 2005\2008数据库。在本章中,我们将涉及到几个要点:
Microsoft.SqlServer.Management.Smo.Restore类
System.Data.DataTable类
PowerShell中的函数(Function)
PowerShell命令Get-Unique
Microsoft.SqlServer.Management.Smo.Restore类
在PowerShell要实现还原SQL Server数据库,我们需要应用到Microsoft.SqlServer.Management.Smo.Restore类。它为我们提供了丰富的还原数据库过程需要的各种属性和方法。首先,提供一份数据库备份文件,我们要还原它,我们需要知道备份文件的标头信息(backup header information),和备份文件里组成(数据文件&日志文件)(the database and log files contained in the backup set)
要是在SQL Server Management Studio(SSMS)里,直接可以调用Transact-SQL:
[code]use master go Restore Headeronly From Disk='E:\DBBackup\myDB2008_20111107_01.trn' Restore filelistonly From Disk='E:\DBBackup\myDB2008_20111107_01.trn'
View Code <#===========================================#>
##还原数据库
$serverInstance="WINSERVER01\SQL2008DE01"
$userName="sa"
$password="sql20081"
$Path="E:\DBBackup\"
$DBList=""
$RestorePath="E:\DATA\SQL2008DE01\"
$StopAt="2011-11-8 18:28:00" #还原到至时间点 [DateTime]
<#===========================================#>
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Data") | Out-Null
$ServerConnection =new-object "Microsoft.SqlServer.Management.Common.ServerConnection" $serverInstance,$userName, $password
$ReadBackupHeader=New-Object "System.Data.DataTable"
$ReadBackupHeader.Columns.Add("DatabaseName","String") |Out-Null
$ReadBackupHeader.Columns.Add("BackupType","Int16") |Out-Null
$ReadBackupHeader.Columns.Add("BackupStartDate","DateTime") |Out-Null
$ReadBackupHeader.Columns.Add("BakFile","String") |Out-Null
$ReadBackupHeader.Columns.Add("NoRecovery","Boolean") |Out-Null
$ReadBackupHeader.Columns.Add("Position","Int16") |Out-Null
$ReadFileList=New-Object "System.Data.DataTable"
$ReadFileList.Columns.Add("DatabaseName","String") |Out-Null
$ReadFileList.Columns.Add("LogicalName","String") |Out-Null
$ReadFileList.Columns.Add("PhysicalName","String") |Out-Null
$ReadFileList.Columns.Add("Type","String") |Out-Null
$ReadFileList.Columns.Add("FileId","Int16") |Out-Null
$ReadFileList.Columns.Add("BakFile","String") |Out-Null
$ReadFileList.Columns.Add("FileNumber","Int16") |Out-Null
#--------------------------------------
#检查备份数据库清单
#--------------------------------------
Function CheckDB
{
Param([String]$DBvar)
Begin
{
[Boolean]$CheckResult=$false
}
Process
{
If($DBList -eq "")
{
$CheckResult=$true
}
Else
{
Foreach($x In $DBList.Split(","))
{
If($x -eq $DBvar)
{
$CheckResult=$true
Break
}
}
}
}
End
{
Return $CheckResult
}
}
#--------------------------------------
#还原数据库函数
#--------------------------------------
Function RestoreDB
{
begin
{
[Boolean]$ExecResult=$False
}
Process
{
$rowsBackupHeader=$ReadBackupHeader.Select("DatabaseName='"+$db+"'","BackupStartDate Asc")
If ($rowsBackupHeader)
{
Foreach($rowBackupHeader In $rowsBackupHeader)
{
$File=$rowBackupHeader["BakFile"]
$BackupType=$rowBackupHeader["BackupType"]
$rowsFileList=$ReadFileList.Select("BakFile='"+$File+"' And FileNumber="+$rowBackupHeader["Position"])
$Restore.Devices.Clear()
$Restore.RelocateFiles.Clear()
$Restore.Database=$db
$Restore.Devices.AddDevice($File, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$Restore.ReplaceDatabase=$true
$Restore.KeepReplication=$False #不保留同步设置
$Restore.NoRecovery=$rowBackupHeader["NoRecovery"]
$Restore.FileNumber=$rowBackupHeader["Position"]
If ($BackupType -eq 2 ) #事务日志
{
$Restore.Action="Log"
$Restore.ToPointInTime=$(if($StopAt -gt $rowBackupHeader["BackupStartDate"]){$null} Else {$StopAt})
}
Else
{
$Restore.Action="Database"
$Restore.ToPointInTime=$null
}
foreach($rowFileList In $rowsFileList)
{
$logicalFileName=$rowFileList["LogicalName"]
If ($rowFileList.Type -eq "D")
{
$physicalFileName=$RestorePath+$logicalFileName+".mdf"
}
ElseIf ($rowFileList.Type -eq "L")
{
$physicalFileName=$RestorePath+$logicalFileName+".ldf"
}
$Restore.RelocateFiles.Add((New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile" $logicalFileName,$physicalFileName)) |Out-Null
}
#清除正在当前数据库的进程
$Server.KillAllProcesses($db)
#执行还原动作
$Restore.SqlRestore($Server)
$Restore.Wait()
Write-Host "已还原数据库. DataBase:" $DB "`t`.FileNumber=" $Restore.FileNumber "`tBakFile: " $File
$ExecResult=$True
}
}
Else
{
Write-Warning "在数据库 $DB .没有可还原的备份文件。"
}
}
End
{
Return $ExecResult
}
}
#--------------------------------------
#过滤备份文件
#--------------------------------------
Function FilterDB
{
#完整
$tmpRows1=$ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=1 And BackupStartDate<='"+$StopAt+"'","BackupStartDate Desc")
[DateTime]$tmpDate="1900-01-01"
if ($tmpRows1)
{
$tmpRow=$tmpRows1[0]
$tmpDate=$tmpRow["BackupStartDate"]
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=1 And BakFile<>'"+$tmpRow["BakFile"]+"'"))
{
$row.Delete()
}
}
Else
{
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=1"))
{
$row.Delete()
}
}
#差异
$tmpRows5=$ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=5 And BackupStartDate<='"+$StopAt+"' And BackupStartDate>'"+$tmpDate+"' ","BackupStartDate Desc")
if ($tmpRows1 -and $tmpRows5)
{
$tmpRow=$tmpRows5[0]
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=5 And BakFile<>'"+$tmpRow["BakFile"]+"'"))
{
$row.Delete()
}
}
Else
{
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=5"))
{
$row.Delete()
}
}
#事务日志
$tmpRows2=$ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=2 And BackupStartDate>='"+$StopAt+"'","BackupStartDate Asc")
if ($tmpRows1 -and $tmpRows2)
{
$tmpRow=$tmpRows2[0]
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=2 And BackupStartDate>='"+$StopAt+"' And BakFile<>'"+$tmpRow["BakFile"]+"'"))
{
$row.Delete()
}
}ElseIf($tmpRows1)
{
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=2 And BackupStartDate<='"+$tmpDate+"'"))
{
$row.Delete()
#$ReadBackupHeader | Format-Table -AutoSize -Wrap
}
}
Else
{
Foreach($row In $ReadBackupHeader.Select("DatabaseName='"+$db+"' And BackupType=2"))
{
$row.Delete()
}
}
#结束对DataTable的编辑
$ReadBackupHeader.AcceptChanges()
#设置NoRecovery
$tmpRows=$ReadBackupHeader.Select("DatabaseName='"+$db+"'","BackupStartDate Desc")
If($tmpRows)
{$tmpRows[0]["NoRecovery"]=$false}
}
#--------------------------------------
Try
{
$ServerConnection.Connect()
}
Catch
{
Write-Error $_
}
if($ServerConnection.IsOpen)
{
Try
{
$Server=new-object "Microsoft.SqlServer.Management.Smo.Server" $ServerConnection
$Restore=new-object "Microsoft.SqlServer.Management.Smo.Restore"
$StopAt=$(If($StopAt -eq ""){"3000-12-31"}Else{[DateTime]$StopAt})
$Path=$Path+$(If($($Path.Split("\"))[-1] -eq "" ){""} Else {"\"})
$RestorePath=$(If($RestorePath -eq ""){$Server.Settings.DefaultFile}Else{$RestorePath}) #数据库文件默认路径(数据&日志文件同一路径)
$RestorePath=$RestorePath+$(If($($RestorePath.Split("\"))[-1] -eq "" ){""} Else {"\"})
Foreach($Bak In Get-ChildItem -Path $Path | Where-Object -FilterScript {$_.Mode -eq "-a---"}) #遍历备份文件夹
{
$File=$Path+$Bak.Name
$Restore.Devices.Clear()
$Restore.Devices.AddDevice($File, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$Restore.FileNumber=0
$Read=$Restore.ReadBackupHeader($Server)
Foreach ($row In $Read)
{
$newRow =$ReadBackupHeader.NewRow();
$newRow["DatabaseName"]=$row["DatabaseName"]
$newRow["BackupType"]=$row["BackupType"]
$newRow["BackupStartDate"]=$row["BackupStartDate"]
$newRow["BakFile"]=$File
$newRow["NoRecovery"]=$true
$newRow["Position"]=$row["Position"]
$ReadBackupHeader.Rows.Add($newRow)
$DBName=$row["DatabaseName"]
$Restore.FileNumber=$row["Position"]
$FileRead=$Restore.ReadFileList($Server)
Foreach ($Filerow In $FileRead)
{
$FileNewRow =$ReadFileList.NewRow();
$FileNewRow["DatabaseName"]=$DBName
$FileNewRow["LogicalName"]=$Filerow["LogicalName"]
$FileNewRow["PhysicalName"]=$Filerow["PhysicalName"]
$FileNewRow["Type"]=$Filerow["Type"]
$FileNewRow["FileId"]=$Filerow["FileId"]
$FileNewRow["BakFile"]=$File
$FileNewRow["FileNumber"]=$Restore.FileNumber
$ReadFileList.Rows.Add($FileNewRow)
}
}
}
#结束对DataTable的编辑
$ReadBackupHeader.AcceptChanges()
$ReadFileList.AcceptChanges()
#遍历数据库
Foreach( $db In $(Foreach($Row In $ReadBackupHeader.rows){$Row["DatabaseName"]}) | Sort-Object | Get-Unique )
{
If(CheckDB($db) -eq $true) #检查备份数据库清单
{
#过滤备份
FilterDB
#还原数据库
$Result=RestoreDB
}
}
}
Catch
{
Write-Error $_
}
}
![](http://images.cnblogs.com/cnblogs_com/wghao/201111/201111090129394423.png)
上面脚本能实现的是,在一个目录下存在着各个数据库的完整、差异、事务日志备份文件,可以根据设置“还原至时间点”还原某一个时间点的数据库。支持一个备份文件包含多个备份,支持自定义还原数据库清单。以上的脚本在PowerShell 2.0 + SQL Server2005+WinXP 和PowerShell 2.0 + SQL Server2008 R2+Windows Server 2008 R2 測試通過。
小結
本章我们描述了PowerShell2.0的一个应用,批量还原数据库,支持完整、差异、事务日志备份文件,并对其中的一些知识要点提取出来说明,让我们对PowerShell 2.0 有进一步的了解。在真实中,一些时候,特别是要在数据库后台批量处理一些任务,我们发觉PowerShell能为我们带来许多的方便。当然了,这里只是取1个批量的还原的例子,在实际的应用中,我们也许会碰到比当前例子更为复杂的情况,如页面还原、段落还原、联机还原等。可根据特定的场景,修改或编写更为复杂的脚本。
相关文章推荐
- SQL SERVER完整、差异和事务日志备份及还原(脚本和GUI实现)
- SQL SERVER完整、差异和事务日志备份及还原(脚本和GUI实现) [原创]
- [置顶]SQL SERVER完整、差异和事务日志备份及还原(脚本和GUI实现) [原创]
- SQL Server 2012完全备份、差异备份、事务日志备份和还原操作
- 维护计划实现备份:每周数据库完整备份、每天差异备份、每小时日志备份
- Struts2+Ibatis+Spring.30(完整例子,含3.0事务配置,OSCache缓存配置,JreeChart配置,log4j日志输出Sql,对一个表实现完整的查询,批量删除,添加,更新)
- SQL Server 2012完全备份、差异备份、事务日志备份和还原操作;
- 请问数据库的完全备份包括对事务日志的备份吗?还是只包含数据文件的备份??差异备份包括对事务日志的备份吗?
- 数据库恢复过程 ,完整/差异/日志.
- sql server 完整备份、差异备份、事务日志备份
- 如何从数据库的完整日志模式还原误删除的数据
- 数据库镜像——事务日志传输方式间的性能差异
- 数据库备份过程 完整/差异/日志 过程.
- sqlserver2008根据事务日志还原数据库
- 【SQL Server备份恢复】维护计划实现备份:每周数据库完整备份、每天差异备份、每小时日志备份
- 【SQL Server备份恢复】维护计划实现备份:每周数据库完整备份、每天差异备份、每小时日志备份
- c#批量插入数据到数据库【支持事务操作】
- 【SQL Server备份恢复】维护计划实现备份:每周数据库完整备份、每天差异备份、每小时日志备份
- SQL Server [备份恢复]:完整备份,差异备份或事务日志备份,尾部日志备份
- SQL Server 备份和还原全攻略, 完全备份,差异备份,增量备份,事务日志备份