PowerShell应用mssql批量还原数据库(援助完全,差别,事务日志卡塔尔

PowerShell应用mssql批量还原数据库(援助完全,差别,事务日志卡塔尔

分享风流倜傥篇有关PowerShell应用mssql批量还原数据库(支持完整,差别,事务日志卡塔尔国的数据备份教程
间接切入主旨,后天大家继续来汇报PowerShell的三个使用,达成批量上涨SQL
Server数据库,能够辅助SQL Server
20072008数据库。在本章中,大家将涉嫌到多少个主题:
Microsoft.SqlServer.Management.Smo.Restore类 System.Data.DataTable类
PowerShell中的函数(Function)PowerShell命令Get-UniqueMicrosoft.SqlServer.Management.Smo.Restore类

开始

在行使前先加载库文件

概述



$assemblylist =
“Microsoft.SqlServer.Management.Common”,
“Microsoft.SqlServer.Smo”,
“Microsoft.SqlServer.Dmf “,
“Microsoft.SqlServer.Instapi “,
“Microsoft.SqlServer.SqlWmiManagement “,
“Microsoft.SqlServer.ConnectionInfo “,
“Microsoft.SqlServer.SmoExtended “,
“Microsoft.SqlServer.SqlTDiagM “,
“Microsoft.SqlServer.SString “,
“Microsoft.SqlServer.Management.RegisteredServers “,
“Microsoft.SqlServer.Management.Sdk.Sfc “,
“Microsoft.SqlServer.SqlEnum “,
“Microsoft.SqlServer.RegSvrEnum “,
“Microsoft.SqlServer.WmiEnum “,
“Microsoft.SqlServer.ServiceBrokerEnum “,
“Microsoft.SqlServer.ConnectionInfoExtended “,
“Microsoft.SqlServer.Management.Collector “,
“Microsoft.SqlServer.Management.CollectorEnum”,
“Microsoft.SqlServer.Management.Dac”,
“Microsoft.SqlServer.Management.DacEnum”,
“Microsoft.SqlServer.Management.Utility”


在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:

 

foreach ($asm in $assemblylist)
{
$asm = [Reflection.Assembly]::LoadWithPartialName($asm)
}

 

 代码如下复制代码 use mastergoRestore Headeronly From Disk='E:DBBackupmyDB2008_20111107_01.trn'Restore filelistonly From Disk='E:DBBackupmyDB2008_20111107_01.trn' 

直白切入大旨,今天我们继续来汇报PowerShell的二个应用,完成批量苏醒SQL
Server数据库,能够接济SQL Server
二〇〇七\二零一零数据库。在本章中,大家将涉嫌到多少个要点:

#
Set SQL Server instance name

在头里的几篇描述了PowerShell在SQL Server对SMO(SQL Server Management
Objects)的保管,今后启幕描述在SQL Server
Replication中什么运用PowerShell脚本达成同步复制功效。在本篇中汇报的是贯彻同台复制中的事务复制,涉及什么创立Publishing,Distribution,
Publication, Subscription等。这里将让我们驾驭到RMO(Replication
Management Objects卡塔尔国一些类的应用:

在实行结果的首先个记录集中,大家能够找到对眼下还原有用的新闻,如DatabaseName,DackupType,Position,BackupStartDate。第四个记录集,能够搜索数据库myDB2009由八个数据文件myDB二〇一〇myDB20092和贰个日志文件myDB二零零六_log组成。还呈报有各文件的物理存储地点,文件类型,文件ID等音讯。借使我们想在PowerShell中通过Restore类得到贴近新闻,必要经过Restore类提供的几个办法ReadBackupHeader
和 ReadFileList .那七个办法都以会回到叁个DataTable对象。
存在着备份文件的标头音信和文件组成音信。e.g.

  • Microsoft.SqlServer.Management.Smo.Restore类
  • System.Data.DataTable类
  • PowerShell中的函数(FunctionState of Qatar
  • PowerShell命令Get-Unique

$sqlName= “localhost”

  • Microsoft.SqlServer.Replication.ReplicationServer
  • Microsoft.SqlServer.Replication.DistributionDatabase
  • Microsoft.SqlServer.Replication.DistributionPublisher
  • Microsoft.SqlServer.Replication.ReplicationDatabase
  • Microsoft.SqlServer.Replication.TransPublication
  • Microsoft.SqlServer.Replication.TransArticle
  • Microsoft.SqlServer.Replication.TransSubscription
 代码如下复制代码 $serverInstance=WINSERVER01SQL2008DE01 $userName=sa$password=sql20081[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 $Server=new-object Microsoft.SqlServer.Management.Smo.Server $ServerConnection$Restore=new-object Microsoft.SqlServer.Management.Smo.Restore $Restore.Devices.AddDevice(E:DBBackupmyDB2008_20111107_01.trn, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)$Read=$Restore.ReadBackupHeader($Server)$FileRead=$Restore.ReadFileList($Server)$Read | Format-Table -AutoSize -Wrap -Property DatabaseName,BackupType,BackupStartDate,Position$FileRead | Format-Table -AutoSize -Wrap -Property LogicalName,PhysicalName,Type,FileId 

 

 

 

笔者们在代码中看看有后生可畏行:$Restore.Devices.AddDevice(E:DBBackupmyDB二零一零_20111107_01.trn,
[Microsoft.SqlServer.Management.Smo.DeviceType]::File卡塔尔(قطر‎描述增多备份文件到当下的东山再起对象$Restore中,那样大家才干够使用方式ReadBackupHeader

ReadFileList读取对应的音信。若是三个文书之中含有多个备份,当大家只要求读取某八个备份文件的标头音讯、文件组成音信,将要先安装$Restore的性质FileNumber。系统预设属性FileNumber为0,方法ReadBackupHeader会读取全数文件,方法ReadFileList会私下认可读取第3个备份的公文组成内容。e.g.基本明白方法Restore类中的方法ReadBackupHeader

ReadFileList,大家接下去的将要实现如何苏醒数据库,在Restore类提供有贰个回复数据库的诀要SqlRestore。e.g.

 

$backupPath= “e:\zach\”

怎么着布置宣布和散发(Publishing & Distribution卡塔尔国

 代码如下复制代码 $serverInstance=WINSERVER01SQL2008DE01 $userName=sa$password=sql20081[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 $Server=new-object Microsoft.SqlServer.Management.Smo.Server $ServerConnection$Restore=new-object Microsoft.SqlServer.Management.Smo.Restore $Restore.Devices.AddDevice(E:DBBackuptest.bak, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)$Restore.Database=test$Restore.FileNumber=1$Restore.ReplaceDatabase=$true$Restore.Script($Server)$Restore.SqlRestore($Server) 

Microsoft.SqlServer.Management.Smo.Restore类

$destPath = ‘c:\SQL
Data’


调用方法SqlRestore的时候,咱们须要先安装对象$Restore的朝气蓬勃对质量,如,$Restore.Database=test
#数据库名 $Restore.FileNumber=1
#备份文件编号,当二个备份文件包括七个备份的时候,要求安装哪四个文本编号,不然系统会私下认可还最先的著作件编号为1的备份。
$Restore.ReplaceDatabase=$true
#是或不是覆盖现存数据库代码$Restore.Script($Server),只是显示出还原的Transact-SQL语句。当然还也可以有其余的天性,如$Restore.Action
描述还原的是数据库依然日志,暗许是数据库.$Restore.KeepReplication
描述是还是不是保留复制设置。暗中认可保留。$Restore.NoRecovery
描述内定不发出回滚。进而使前滚按顺序在下一条语句中三番五次拓展。如,当还原(完整+差距State of Qatar或还原(完整+事务日志卡塔尔,须要设置。某个时候我们回复数据库,境遇一些应用程序正在选取要还原的数据库。那么大家需求先甘休相应的经过,否则还原会报错。在Restore类未有提供终止进度的点子,必要依靠Server类的点子KillAllProcesses来删除某生龙活虎数据库的享有进度。e.g.


 

 

$Server.KillAllProcesses($Restore.Database)

 

$sqlServer = New-Object (‘Microsoft.SqlServer.Management.Smo.Server’) $sqlName

在具有域管理的条件中,配置Publishing &
Distribution早先,我们先要思索好有的干活:

System.Data.DataTable类

在PowerShell要促成还原SQL
Server数据库,大家要求使用到Microsoft.SqlServer.Management.Smo.Restore类。它为大家提供了丰硕的东山复起数据库进度须求的种种质量和议程。首先,提供后生可畏份数据库备份文件,大家要还原它,大家须求精通备份文件的标头新闻(backup
header informationState of Qatar,和备份文件里组成(数据文件&日志文件卡塔尔(the database and
log files contained in the backup set卡塔尔(قطر‎

$sqlServer.ConnectionContext .LoginSecure=$false ;

  • 希图一个域账号,特意使用于一块复制利用
  • 开创快速照相文件夹,设成分享,并安装该域账户全体育高校正快速照相文件夹的权位。

假如在SQL Server Management Studio(SSMS卡塔尔国里,直接可以调用Transact-SQL:

$sqlServer.ConnectionContext .set_Login(“sa”);

澳门新萄京 1

在前方笔者???到Restore类的不二等秘书籍ReadBackupHeader 和
ReadFileList能回去一??DataTable对象,大家在后边的例子中会使用到DataTable对象,来存款和储蓄备份的标头音信和文件组成音讯。e.g.

use master
go
Restore Headeronly From Disk='E:\DBBackup\myDB2008_20111107_01.trn'
Restore filelistonly From Disk='E:\DBBackup\myDB2008_20111107_01.trn'

$sqlServer.ConnectionContext .set_Password(“jj”) 

如上航海用体育场合,设置域账户“TN\SQLAccount”具备快速照相文件夹ReplicationSnapshot的纠正权限。

 代码如下复制代码 [System.Reflection.Assembly]::LoadWithPartialName(System.Data) | Out-Null$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

澳门新萄京 2

 

若未有特殊的内需,平常配备Publishing & Distribution是在同二个SQL
Server实例上扩充。在经过SQL Server配置Publishing &
Distribution向导,大家能够看到其经过主要涉嫌到布署快照集文件夹和散发数据库几个职位。当大家应用PowerShell脚本实现的时候,首先要考虑这四个岗位。

定义$ReadBackupHeaderd对象?泶娲?font
color=”#000000″>Restore类的法子ReadBackupHeader重回的结果集。定义$ReadFileList对象?泶娲?font
color=”#000000″>Restore类的章程ReadFileList再次回到的结果集。前面包车型大巴其实例子咱们还将使用到增加和删除行的方法.

在实践结果的第3个记录集中,大家能够找到对近来还原有用的消息,如DatabaseName,DackupType,Position,BackupStartDate。

[System.Reflection.Assembly]:: LoadWithPartialName(“Microsoft.SqlServer.SMO” ) | Out-Null

澳门新萄京 3澳门新萄京 4View Code

#增加行$newRow=$ReadBackupHeader.NewRow()$newRow[DatabaseName]=myDB$newRow[BackupType]=2$newRow[BackupStartDate]=2011-11-8$newRow[BakFile]=$newRow[NoRecovery]=$true$newRow[Position]=1$ReadBackupHeader.Rows.Add($newRow)$ReadBackupHeader.AcceptChanges()#显示行$ReadBackupHeader | Format-Table -AutoSize -Wrap#?h除行$ReadBackupHeader.Rows[0].Delete()$ReadBackupHeader.AcceptChanges()#显示行$ReadBackupHeader | Format-Table -AutoSize -Wrap

其次个记录集,能够找寻数据库myDB贰零零玖由多个数据文件”myDB二〇一〇” &
“myDB二〇〇九2”和三个日记文件”myDB二零零六_log”组成。还陈诉有各文件的大意存款和储蓄地方,文件类型,文件ID等新闻。

[System.Reflection.Assembly]:: LoadWithPartialName(“Microsoft.SqlServer.SmoExtended” ) | Out-Null

<#===========================配置分发=================================#>

代码中有两行$ReadBackupHeader.AcceptChanges(卡塔尔(قطر‎描述甘休编辑状态。提示澳门新萄京,,引用MSDN对AcceptChanges方法的陈述:在调用
AcceptChanges 时,EndEdit 办法被隐式调用,以便终止任何编辑。
假如行的
RowState 原来是Added或Modified,则 RowState
将变成Unchanged。 如果 RowState
是剔除,则该行将被移除。**PowerShell中的函数(FunctionState of Qatar**

要是大家想在PowerShell中经过Restore类得到挨近音讯,须求通过Restore类提供的五个艺术ReadBackupHeader

ReadFileList
.那五个方法都以会回来多少个DataTable对象。
存在着备份文件的标头音讯和文书组成音讯。

 

##配备公布、分发服务器者登入客商名&密码,这里发表与分发使用同三个实例
#————————————————————
$serverInstance=”WINSERVER01\SQL2008DE01″
$userName=”sa”
$password=”sql20081″


e.g.

$items =Get-ChildItem $backupPath

##设置域账号,应用于同台复制
#————————————————————
$RAccount=”TN\SQLAccount”
$RPassword=”Sql123456″

在本章中???玫?owerShell中的Function。这里将动用到三种用法:function 名称
{begin {管理语句列表}process {管理语句列表}end {管理语句列表}}e.g.

$serverInstance="WINSERVER01\SQL2008DE01" 
$userName="sa"
$password="sql20081"

[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  
$Server=new-object "Microsoft.SqlServer.Management.Smo.Server" $ServerConnection
$Restore=new-object "Microsoft.SqlServer.Management.Smo.Restore"  

$Restore.Devices.AddDevice("E:\DBBackup\myDB2008_20111107_01.trn", [Microsoft.SqlServer.Management.Smo.DeviceType]::File)

$Read=$Restore.ReadBackupHeader($Server)
$FileRead=$Restore.ReadFileList($Server)

$Read  | Format-Table -AutoSize -Wrap -Property DatabaseName,BackupType,BackupStartDate,Position
$FileRead | Format-Table -AutoSize -Wrap -Property LogicalName,PhysicalName,Type,FileId

foreach ($item in $items )

##安装快速照相文件夹,要利用网络路线,并且设置账户$RAccount具备退换权限
#————————————————————
$WorkingDirectory=”\\WINSERVER01\ReplicationSnapshot”

 代码如下复制代码 $DBList=DBA,DBB,DBCFunction 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=$trueBreak}}}}End{Return $CheckResult}}CheckDB 'A' 

澳门新萄京 5

{

<#================================================================#>

函数checkDB,首即便检查输入的$DBvar
是还是不是在清单$DBList中。存在的时候回来True,不设有的?r候再次来到False,有意气风发?特殊的必要正是?$DBList??rdquo;的?r候。前边的其实例子将会采取到那一个函数。函数的别的生龙活虎种简易利用便是,不含Begin{},Process{},End{}部份,如
代码如下复制代码 function name {param
([type]$parameter1[,[type]$parameter2])statement list}

 

$dbRestore = new-object (“Microsoft.SqlServer.Management.Smo.Restore”)

[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SqlServer.Rmo”) | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SqlServer.Smo”) | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SqlServer.ConnectionInfo”) | Out-Null

Function fn_UpdateRow{ Param([string]$DatabaseName,[int32]$row) $ReadBackupHeader.Rows[$row][DatabaseName]=$DatabaseName $ReadBackupHeader.AcceptChanges()}$ReadBackupHeader | Format-Table -AutoSize -Wrapfn_UpdateRow -DatabaseName Test -row 0 $ReadBackupHeader | Format-Table -AutoSize -Wrap

我们在代码中来看有意气风发行:”$Restore.Devices.AddDevice(“E:\DBBackup\myDB2008_20111107_01.trn”,
[Microsoft.SqlServer.Management.Smo.DeviceType]::File卡塔尔国”描述加多备份文件到当下的东山复起对象$Restore中,那样大家才可以使用格局ReadBackupHeader

ReadFileList读取对应的新闻。借使四个文书之中含有四个备份,当我们只须要读取某多少个备份文件的标头音信、文件组成音信,就要先安装$Restore的质量FileNumber。系统预设属性FileNumber为0,方法ReadBackupHeader会读取全体文件,方法ReadFileList会暗中同意读取第三个备份的公文组成内容。

$dbRestore.Devices .AddDevice ($item .FullName , “File” )

$DistributionDB=”Distribution”

此间定义意气风发函数fn_UpdateRow实现立异DataTable对象$ReadBackupHeader中的DatabaseName值。这里函数只当作管理进度,不回来任何值。PowerShell命令Get-Unique

e.g.

 

#Step 1: 成立连接
$ServerConnection =New-object “Microsoft.SqlServer.Management.Common.ServerConnection” $serverInstance,$userName, $password  


澳门新萄京 6

$dt = $dbRestore .ReadFileList ($sqlServer )

#Step 2: 创设同步复克服务器
$ReplicationServer =New-object “Microsoft.SqlServer.Replication.ReplicationServer” $ServerConnection

眼下,大家运用DataTable对象$ReadBackupHeader暂存备份的标头音讯,当大家要还原一个索引上面包车型地铁具有备份文件,会把各类数据库备份的标头音讯,暂存至$ReadBackupHeader中,再遍历种种数据库实行苏醒。这里遍历数据库进程大家将选拔到命令Get-Unique,过滤掉重复的数据库名称。e.g.

 

$header = $dbRestore .ReadBackupHeader ($sqlServer )

$Server=New-object “Microsoft.SqlServer.Management.Smo.Server” $ServerConnection

#遍历数据库 代码如下复制代码 Foreach( $db In $(Foreach($Row In $ReadBackupHeader.rows){$Row[DatabaseName]}) | Sort-Object | Get-Unique ){#还原数据库过程} 

大旨领悟方法Restore类中的方法ReadBackupHeader

ReadFileList,我们接下去的将在贯彻如何恢复数据库,在Restore类提供有三个重温旧业数据库的主意SqlRestore。

$db=$header .Rows [0].DatabaseName

Try
{
    $ServerConnection.Connect()
    
    if($ServerConnection.IsOpen -And $ReplicationServer.IsDistributor -eq $false)
    {
        
        #Step 3:创制分发数据库Distribution
        $DistributionDatabase =New-Object “Microsoft.SqlServer.Replication.DistributionDatabase” $DistributionDB,$ServerConnection
        $DistributionDatabase.DataFolder=$Server.Settings.DefaultFile
        $DistributionDatabase.LogFolder=$Server.Settings.DefaultLog        
        
        #Step 4 : 设置分发数据库
        $ReplicationServer.InstallDistributor([string]$null,$DistributionDatabase)
        
        #Step 5: 设置DistributionPublisher
        $DistributionPublisher=New-Object “Microsoft.SqlServer.Replication.DistributionPublisher” $serverInstance,$ServerConnection
        $DistributionPublisher.DistributionDatabase=$DistributionDatabase.Name
        $DistributionPublisher.WorkingDirectory=$WorkingDirectory
        $DistributionPublisher.PublisherSecurity.WindowsAuthentication=$false
        $DistributionPublisher.PublisherSecurity.SqlStandardLogin=$userName
        $DistributionPublisher.PublisherSecurity.SqlStandardPassword=$password
        $DistributionPublisher.Create()
        
        #Step 6 : 设置域账号具备Owner权限
        if($Server.Logins[$RAccount] -eq $null)
        {
            $Login= New-Object “Microsoft.SqlServer.Management.Smo.Login” $Server,$RAccount
            $Login.LoginType=”WindowsUser”
            $Login.Create()
        }                       
        
        $DB=$Server.Databases[$DistributionDB]
        $User=New-Object “Microsoft.SqlServer.Management.Smo.User” $DB,$RAccount               
        $User.Login=$RAccount
        $User.AddToRole(“db_owner”)
        $User.Create()
        Write-Host “设置分发完了!.”
            
    }

其中$(Foreach($Row In
$ReadBackupHeader.rows){$Row[DatabaseName]}卡塔尔重临的是三个Array对象。事实上例子

e.g.

 

}
Catch
{
    Write-Error $_
}


$serverInstance="WINSERVER01\SQL2008DE01" 
$userName="sa"
$password="sql20081"

[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  
$Server=new-object "Microsoft.SqlServer.Management.Smo.Server" $ServerConnection
$Restore=new-object "Microsoft.SqlServer.Management.Smo.Restore"  

$Restore.Devices.AddDevice("E:\DBBackup\test.bak", [Microsoft.SqlServer.Management.Smo.DeviceType]::File)

$Restore.Database="test"
$Restore.FileNumber=1
$Restore.ReplaceDatabase=$true
$Restore.Script($Server)
$Restore.SqlRestore($Server)

$dbRestore.Database =   $db

 

代码如下复制代码
#===========================================###平复数据库$serverInstance=WINSE酷路泽VE奥迪Q701SQL2009DE01$userName=sa$password=sql二〇一〇1$Path=E:DBBackup$DBList=$RestorePath=E:DATASQL贰零零玖DE01$StopAt=二〇一二-11-818: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-objectMicrosoft.SqlServer.Management.Common.ServerConnection$serverInstance,$userName,$password$ReadBackupHeader=New-ObjectSystem.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-ObjectSystem.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#————————————–#反省备份数据库项目清单#————————————–FunctionCheckDB{Param([String]$DBvar)Begin{[Boolean]$CheckResult=$false}Process{If($DBList-eq){$CheckResult=$true}Else{Foreach($xIn$DBList.Split(,)){If($x-eq$DBvar){$CheckResult=$trueBreak}}}}End{Return$CheckResult}}#————————————–#平复数据库函数#————————————–FunctionRestoreDB{begin{[Boolean]$ExecResult=$False}Process{$rowsBackupHeader=$ReadBackupHeader.Select(DatabaseName=’+$db+’,BackupStartDateAsc)If($rowsBackupHeader){Foreach($rowBackupHeaderIn$rowsBackupHeader){$File=$rowBackupHeader[BakFile]$BackupType=$rowBackupHeader[BackupType]$rowsFileList=$ReadFileList.Select(BakFile=’+$File+’AndFileNumber=+$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-eq2)#政工日志{$Restore.Action=Log$Restore.ToPointInTime=$(if($StopAt-gt$rowBackupHeader[BackupStartDate]){$null}Else{$StopAt})}Else{$Restore.Action=Database$Restore.ToPointInTime=$null}foreach($rowFileListIn$rowsFileList){$logicalFileName=$rowFileList[LogicalName]If($rowFileList.Type-eqD){$physicalFileName=$RestorePath+$logicalFileName+.mdf}ElseIf($rowFileList.Type-eqL){$physicalFileName=$RestorePath+$logicalFileName+.ldf}$Restore.RelocateFiles.Add((New-ObjectMicrosoft.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}}#————————————–#过滤备份文件#————————————–FunctionFilterDB{#完整$tmpRows1=$ReadBackupHeader.Select(DatabaseName=’+$db+’AndBackupType=1AndBackupStartDate=’+$StopAt+’,BackupStartDateDesc)[DateTime]$tmpDate=1900-01-01if($tmpRows1){$tmpRow=$tmpRows1[0]$tmpDate=$tmpRow[BackupStartDate]Foreach($rowIn$ReadBackupHeader.Select(DatabaseName=’+$db+’AndBackupType=1AndBakFile’+$tmpRow[BakFile]+’)){$row.Delete()}}Else{Foreach($rowIn$ReadBackupHeader.Select(DatabaseName=’+$db+’AndBackupType=1)){$row.Delete()}}#差异$tmpRows5=$ReadBackupHeader.Select(DatabaseName=’+$db+’AndBackupType=5AndBackupStartDate=’+$StopAt+’AndBackupStartDate’+$tmpDate+’,BackupStartDateDesc)if($tmpRows1-and$tmpRows5){$tmpRow=$tmpRows5[0]Foreach($rowIn$ReadBackupHeader.Select(DatabaseName=’+$db+’AndBackupType=5AndBakFile’+$tmpRow[BakFile]+’)){$row.Delete()}}Else{Foreach($rowIn$ReadBackupHeader.Select(DatabaseName=’+$db+’AndBackupType=5)){$row.Delete()}}#事情日志$tmpRows2=$ReadBackupHeader.Select(DatabaseName=’+$db+’AndBackupType=2AndBackupStartDate=’+$StopAt+’,BackupStartDateAscState of Qatarif($tmpRows1-and$tmpRows2State of Qatar{$tmpRow=$tmpRows2[0]Foreach($rowIn$ReadBackupHeader.Select(DatabaseName=’+$db+’AndBackupType=2AndBackupStartDate=’+$StopAt+’AndBakFile’+$tmpRow[BakFile]+’)){$row.Delete()}}ElseIf($tmpRows1){Foreach($rowIn$ReadBackupHeader.Select(DatabaseName=’+$db+’AndBackupType=2AndBackupStartDate=’+$tmpDate+’)){$row.Delete()#$ReadBackupHeader|Format-Table-AutoSize-Wrap}}Else{Foreach($rowIn$ReadBackupHeader.Select(DatabaseName=’+$db+’AndBackupType=2)){$row.Delete()}}#结束对DataTable的编辑$ReadBackupHeader.AcceptChanges()#设置NoRecovery$tmpRows=$ReadBackupHeader.Select(DatabaseName=’+$db+’,BackupStartDateDesc)If($tmpRows){$tmpRows[0][NoRecovery]=$false}}#————————————–Try{$ServerConnection.Connect()}Catch{Write-Error$_}if($ServerConnection.IsOpen){Try{$Server=new-objectMicrosoft.SqlServer.Management.Smo.Server$ServerConnection$Restore=new-objectMicrosoft.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($BakInGet-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($rowIn$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($FilerowIn$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($dbIn$(Foreach($RowIn$ReadBackupHeader.rowsState of Qatar{$Row[DatabaseName]})|Sort-Object|Get-Unique){If(CheckDB($db)-eq$true)#反省备份数据库清单{#过滤备份FilterDB#光复数据库$Result=RestoreDB}}}Catch{Write-Error$_}}
上面脚本能实现的是,在叁个索引下存在着各种数据库的大器晚成体化、差别、事务日志备份文件,能够依附设置还原至时间点还原某三个时间点的数据库。补助二个备份文件包涵多个备份,扶助自定义还原数据库项目清单。以上的剧本在PowerShell
2.0 + SQL Server二〇〇五+WinXP 和PowerShell 2.0 + SQL Server2010 Enclave2+Windows
Server 二零零六 本田UR-V2

澳门新萄京 7

$db

澳门新萄京 8

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图