直接切入主題,今天我們繼續來(lái)描述PowerShell的一個(gè)應用,實(shí)現批量還原SQL Server數據庫,可以支持SQL Server 2005\2008數據庫。在本章中,我們將涉及到幾個(gè)要點(diǎn):
Microsoft.SqlServer.Management.Smo.Restore類(lèi)
在PowerShell要實(shí)現還原SQL Server數據庫,我們需要應用到Microsoft.SqlServer.Management.Smo.Restore類(lèi)。它為我們提供了豐富的還原數據庫過(guò)程需要的各種屬性和方法。首先,提供一份數據庫備份文件,我們要還原它,我們需要知道備份文件的標頭信息(backup header information),和備份文件里組成(數據文件&日志文件)(the database and log files contained in the backup set)
要是在SQL Server Management Studio(SSMS)里,直接可以調用Transact-SQL:
use master
go
Restore Headeronly From Disk='E:\DBBackup\myDB2008_20111107_01.trn'
Restore filelistonly From Disk='E:\DBBackup\myDB2008_20111107_01.trn'
在執行結果的第一個(gè)記錄集中,我們可以找到對當前還原有用的信息,如DatabaseName,DackupType,Position,BackupStartDate。
第二個(gè)記錄集,可以找出數據庫myDB2008由兩個(gè)數據文件”myDB2008” & “myDB20082”和一個(gè)日志文件”myDB2008_log”組成。還描述有各文件的物理存儲位置,文件類(lèi)型,文件ID等信息。
要是我們想在PowerShell中通過(guò)Restore類(lèi)獲得類(lèi)似信息,需要通過(guò)Restore類(lèi)提供的兩個(gè)方法ReadBackupHeader 和 ReadFileList .這兩個(gè)方法都是會(huì )返回一個(gè)DataTable對象。 存在著(zhù)備份文件的標頭信息和文件組成信息。
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
我們在代碼中看到有一行:”$Restore.Devices.AddDevice("E:\DBBackup\myDB2008_20111107_01.trn", [Microsoft.SqlServer.Management.Smo.DeviceType]::File)”描述添加備份文件到當前的還原對象$Restore中,這樣我們才可以使用方法ReadBackupHeader 和 ReadFileList讀取對應的信息。如果一個(gè)文件里面含有多個(gè)備份,當我們只需要讀取某一個(gè)備份文件的標頭信息、文件組成信息,就要先設置$Restore的屬性FileNumber。系統預設屬性FileNumber為0,方法ReadBackupHeader會(huì )讀取所有文件,方法ReadFileList會(huì )默認讀取第1個(gè)備份的文件組成內容。
e.g.
基本了解方法Restore類(lèi)中的方法ReadBackupHeader 和 ReadFileList,我們接下來(lái)的就要實(shí)現如何還原數據庫,在Restore類(lèi)提供有一個(gè)還原數據庫的方法SqlRestore。
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\test.bak", [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$Restore.Database="test"
$Restore.FileNumber=1
$Restore.ReplaceDatabase=$true
$Restore.Script($Server)
$Restore.SqlRestore($Server)
代碼$Restore.Script($Server),只是顯示出還原的Transact-SQL語(yǔ)句。當然還有其他的屬性,如
$Restore.Action 描述還原的是數據庫還是日志,默認是數據庫.
$Restore.KeepReplication 描述是否保留復制設置。默認保留。
$Restore.NoRecovery 描述指定不發(fā)生回滾。從而使前滾按順序在下一條語(yǔ)句中繼續進(jìn)行。如,當還原(完整+差異) 或還原(完整+事務(wù)日志),需要設置。
有些時(shí)候我們還原數據庫,碰到一些應用程序正在使用要還原的數據庫。那么我們需要先終止對應的進(jìn)程,不然還原會(huì )報錯。在Restore類(lèi)沒(méi)有提供終止進(jìn)程的方法,需要借助Server類(lèi)的方法KillAllProcesses來(lái)刪除某一數據庫的所有進(jìn)程。
e.g.
$Server.KillAllProcesses($Restore.Database)
System.Data.DataTable類(lèi)
在前面我們說(shuō)到Restore類(lèi)的方法ReadBackupHeader 和 ReadFileList能返回一個(gè)DataTable對象,我們在后面的例子中會(huì )使用到DataTable對象,來(lái)存儲備份的標頭信息和文件組成信息。
e.g.
[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
定義$ReadBackupHeaderd對象來(lái)存儲Restore類(lèi)的方法ReadBackupHeader返回的結果集。定義$ReadFileList對象來(lái)存儲Restore類(lèi)的方法ReadFileList返回的結果集。后面的實(shí)際例子我們還將應用到增加和刪除行的方法.
#增加行
$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
#刪除行
$ReadBackupHeader.Rows[0].Delete()
$ReadBackupHeader.AcceptChanges()
#顯示行
$ReadBackupHeader | Format-Table -AutoSize -Wrap
代碼中有兩行“$ReadBackupHeader.AcceptChanges()”描述結束編輯狀態(tài)。
提示,引用MSDN對AcceptChanges方法的描述:在調用 AcceptChanges 時(shí),EndEdit 方法被隱式調用,以便終止任何編輯。 如果行的 RowState 原來(lái)是“Added”或“Modified”,則 RowState 將變成“Unchanged”。 如果 RowState 是“刪除”,則該行將被移除。
PowerShell中的函數(Function)
在本章中將應用到PowerShell中的Function。這里將應用到兩種用法:
function <名稱(chēng)> {
begin {<處理語(yǔ)句列表>}
process {<處理語(yǔ)句列表>}
end {<處理語(yǔ)句列表>}
}
e.g.
$DBList="DBA,DBB,DBC"
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
}
}
CheckDB 'A'

函數checkDB,主要是檢查輸入的$DBvar 是否在清單$DBList中。存在的時(shí)候返回True,不存在的時(shí)候返回False,有一種特殊的需求就是當$DBList為””的時(shí)候。后面的實(shí)際例子將會(huì )應用到這個(gè)函數。
函數的另外一種簡(jiǎn)單應用就是,不含Begin{},Process{},End{}部份,如
function <name> {
param ([type]$parameter1[,[type]$parameter2])
<statement list>
}
Function fn_UpdateRow
{
Param([string]$DatabaseName,[int32]$row)
$ReadBackupHeader.Rows[$row]["DatabaseName"]=$DatabaseName
$ReadBackupHeader.AcceptChanges()
}
$ReadBackupHeader | Format-Table -AutoSize -Wrap
fn_UpdateRow -DatabaseName "Test" -row 0
$ReadBackupHeader | Format-Table -AutoSize -Wrap
這里定義一函數fn_UpdateRow實(shí)現更新DataTable對象$ReadBackupHeader中的”DatabaseName”值。這里函數只作為處理過(guò)程,不返回任何值。
PowerShell命令Get-Unique
前面,我們使用DataTable對象$ReadBackupHeader暫存備份的標頭信息,當我們要還原一個(gè)目錄下面的所有備份文件,會(huì )把各個(gè)數據庫備份的標頭信息,暫存至$ReadBackupHeader中,再遍歷各個(gè)數據庫進(jìn)行還原。這里遍歷數據庫過(guò)程我們將應用到命令Get-Unique,過(guò)濾掉重復的數據庫名稱(chēng)。
e.g.
#遍歷數據庫
Foreach( $db In $(Foreach($Row In $ReadBackupHeader.rows){$Row["DatabaseName"]}) | Sort-Object | Get-Unique )
{
#還原數據庫過(guò)程
}
其中“$(Foreach($Row In $ReadBackupHeader.rows){$Row["DatabaseName"]})”返回的是一個(gè)Array對象。
實(shí)際例子

上面腳本能實(shí)現的是,在一個(gè)目錄下存在著(zhù)各個(gè)數據庫的完整、差異、事務(wù)日志備份文件,可以根據設置“還原至時(shí)間點(diǎn)”還原某一個(gè)時(shí)間點(diǎn)的數據庫。支持一個(gè)備份文件包含多個(gè)備份,支持自定義還原數據庫清單。以上的腳本在PowerShell 2.0 + SQL Server2005+WinXP 和PowerShell 2.0 + SQL Server2008 R2+Windows Server 2008 R2 測試通過(guò)。
小結
本章我們描述了PowerShell2.0的一個(gè)應用,批量還原數據庫,支持完整、差異、事務(wù)日志備份文件,并對其中的一些知識要點(diǎn)提取出來(lái)說(shuō)明,讓我們對PowerShell 2.0 有進(jìn)一步的了解。在真實(shí)中,一些時(shí)候,特別是要在數據庫后臺批量處理一些任務(wù),我們發(fā)覺(jué)PowerShell能為我們帶來(lái)許多的方便。當然了,這里只是取1個(gè)批量的還原的例子,在實(shí)際的應用中,我們也許會(huì )碰到比當前例子更為復雜的情況,如頁(yè)面還原、段落還原、聯(lián)機還原等??筛鶕囟ǖ膱?chǎng)景,修改或編寫(xiě)更為復雜的腳本。直接切入主題,今天我們繼續來(lái)描述PowerShell的一個(gè)應用,實(shí)現批量還原SQL Server數據庫,可以支持SQL Server 2005\2008數據庫。在本章中,我們將涉及到幾個(gè)要點(diǎn):
Microsoft.SqlServer.Management.Smo.Restore類(lèi)
在PowerShell要實(shí)現還原SQL Server數據庫,我們需要應用到Microsoft.SqlServer.Management.Smo.Restore類(lèi)。它為我們提供了豐富的還原數據庫過(guò)程需要的各種屬性和方法。首先,提供一份數據庫備份文件,我們要還原它,我們需要知道備份文件的標頭信息(backup header information),和備份文件里組成(數據文件&日志文件)(the database and log files contained in the backup set)
要是在SQL Server Management Studio(SSMS)里,直接可以調用Transact-SQL:
use master
go
Restore Headeronly From Disk='E:\DBBackup\myDB2008_20111107_01.trn'
Restore filelistonly From Disk='E:\DBBackup\myDB2008_20111107_01.trn'
在執行結果的第一個(gè)記錄集中,我們可以找到對當前還原有用的信息,如DatabaseName,DackupType,Position,BackupStartDate。
第二個(gè)記錄集,可以找出數據庫myDB2008由兩個(gè)數據文件”myDB2008” & “myDB20082”和一個(gè)日志文件”myDB2008_log”組成。還描述有各文件的物理存儲位置,文件類(lèi)型,文件ID等信息。
要是我們想在PowerShell中通過(guò)Restore類(lèi)獲得類(lèi)似信息,需要通過(guò)Restore類(lèi)提供的兩個(gè)方法ReadBackupHeader 和 ReadFileList .這兩個(gè)方法都是會(huì )返回一個(gè)DataTable對象。 存在著(zhù)備份文件的標頭信息和文件組成信息。
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
我們在代碼中看到有一行:”$Restore.Devices.AddDevice("E:\DBBackup\myDB2008_20111107_01.trn", [Microsoft.SqlServer.Management.Smo.DeviceType]::File)”描述添加備份文件到當前的還原對象$Restore中,這樣我們才可以使用方法ReadBackupHeader 和 ReadFileList讀取對應的信息。如果一個(gè)文件里面含有多個(gè)備份,當我們只需要讀取某一個(gè)備份文件的標頭信息、文件組成信息,就要先設置$Restore的屬性FileNumber。系統預設屬性FileNumber為0,方法ReadBackupHeader會(huì )讀取所有文件,方法ReadFileList會(huì )默認讀取第1個(gè)備份的文件組成內容。
e.g.
基本了解方法Restore類(lèi)中的方法ReadBackupHeader 和 ReadFileList,我們接下來(lái)的就要實(shí)現如何還原數據庫,在Restore類(lèi)提供有一個(gè)還原數據庫的方法SqlRestore。
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\test.bak", [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$Restore.Database="test"
$Restore.FileNumber=1
$Restore.ReplaceDatabase=$true
$Restore.Script($Server)
$Restore.SqlRestore($Server)
代碼$Restore.Script($Server),只是顯示出還原的Transact-SQL語(yǔ)句。當然還有其他的屬性,如
$Restore.Action 描述還原的是數據庫還是日志,默認是數據庫.
$Restore.KeepReplication 描述是否保留復制設置。默認保留。
$Restore.NoRecovery 描述指定不發(fā)生回滾。從而使前滾按順序在下一條語(yǔ)句中繼續進(jìn)行。如,當還原(完整+差異) 或還原(完整+事務(wù)日志),需要設置。
有些時(shí)候我們還原數據庫,碰到一些應用程序正在使用要還原的數據庫。那么我們需要先終止對應的進(jìn)程,不然還原會(huì )報錯。在Restore類(lèi)沒(méi)有提供終止進(jìn)程的方法,需要借助Server類(lèi)的方法KillAllProcesses來(lái)刪除某一數據庫的所有進(jìn)程。
e.g.
$Server.KillAllProcesses($Restore.Database)
System.Data.DataTable類(lèi)
在前面我們說(shuō)到Restore類(lèi)的方法ReadBackupHeader 和 ReadFileList能返回一個(gè)DataTable對象,我們在后面的例子中會(huì )使用到DataTable對象,來(lái)存儲備份的標頭信息和文件組成信息。
e.g.
[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
定義$ReadBackupHeaderd對象來(lái)存儲Restore類(lèi)的方法ReadBackupHeader返回的結果集。定義$ReadFileList對象來(lái)存儲Restore類(lèi)的方法ReadFileList返回的結果集。后面的實(shí)際例子我們還將應用到增加和刪除行的方法.
#增加行
$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
#刪除行
$ReadBackupHeader.Rows[0].Delete()
$ReadBackupHeader.AcceptChanges()
#顯示行
$ReadBackupHeader | Format-Table -AutoSize -Wrap
代碼中有兩行“$ReadBackupHeader.AcceptChanges()”描述結束編輯狀態(tài)。
提示,引用MSDN對AcceptChanges方法的描述:在調用 AcceptChanges 時(shí),EndEdit 方法被隱式調用,以便終止任何編輯。 如果行的 RowState 原來(lái)是“Added”或“Modified”,則 RowState 將變成“Unchanged”。 如果 RowState 是“刪除”,則該行將被移除。
PowerShell中的函數(Function)
在本章中將應用到PowerShell中的Function。這里將應用到兩種用法:
function <名稱(chēng)> {
begin {<處理語(yǔ)句列表>}
process {<處理語(yǔ)句列表>}
end {<處理語(yǔ)句列表>}
}
e.g.
$DBList="DBA,DBB,DBC"
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
}
}
CheckDB 'A'

函數checkDB,主要是檢查輸入的$DBvar 是否在清單$DBList中。存在的時(shí)候返回True,不存在的時(shí)候返回False,有一種特殊的需求就是當$DBList為””的時(shí)候。后面的實(shí)際例子將會(huì )應用到這個(gè)函數。
函數的另外一種簡(jiǎn)單應用就是,不含Begin{},Process{},End{}部份,如
function <name> {
param ([type]$parameter1[,[type]$parameter2])
<statement list>
}
Function fn_UpdateRow
{
Param([string]$DatabaseName,[int32]$row)
$ReadBackupHeader.Rows[$row]["DatabaseName"]=$DatabaseName
$ReadBackupHeader.AcceptChanges()
}
$ReadBackupHeader | Format-Table -AutoSize -Wrap
fn_UpdateRow -DatabaseName "Test" -row 0
$ReadBackupHeader | Format-Table -AutoSize -Wrap
這里定義一函數fn_UpdateRow實(shí)現更新DataTable對象$ReadBackupHeader中的”DatabaseName”值。這里函數只作為處理過(guò)程,不返回任何值。
PowerShell命令Get-Unique
前面,我們使用DataTable對象$ReadBackupHeader暫存備份的標頭信息,當我們要還原一個(gè)目錄下面的所有備份文件,會(huì )把各個(gè)數據庫備份的標頭信息,暫存至$ReadBackupHeader中,再遍歷各個(gè)數據庫進(jìn)行還原。這里遍歷數據庫過(guò)程我們將應用到命令Get-Unique,過(guò)濾掉重復的數據庫名稱(chēng)。
e.g.
#遍歷數據庫
Foreach( $db In $(Foreach($Row In $ReadBackupHeader.rows){$Row["DatabaseName"]}) | Sort-Object | Get-Unique )
{
#還原數據庫過(guò)程
}
其中“$(Foreach($Row In $ReadBackupHeader.rows){$Row["DatabaseName"]})”返回的是一個(gè)Array對象。
實(shí)際例子

上面腳本能實(shí)現的是,在一個(gè)目錄下存在著(zhù)各個(gè)數據庫的完整、差異、事務(wù)日志備份文件,可以根據設置“還原至時(shí)間點(diǎn)”還原某一個(gè)時(shí)間點(diǎn)的數據庫。支持一個(gè)備份文件包含多個(gè)備份,支持自定義還原數據庫清單。以上的腳本在PowerShell 2.0 + SQL Server2005+WinXP 和PowerShell 2.0 + SQL Server2008 R2+Windows Server 2008 R2 測試通過(guò)。
小結
本章我們描述了PowerShell2.0的一個(gè)應用,批量還原數據庫,支持完整、差異、事務(wù)日志備份文件,并對其中的一些知識要點(diǎn)提取出來(lái)說(shuō)明,讓我們對PowerShell 2.0 有進(jìn)一步的了解。在真實(shí)中,一些時(shí)候,特別是要在數據庫后臺批量處理一些任務(wù),我們發(fā)覺(jué)PowerShell能為我們帶來(lái)許多的方便。當然了,這里只是取1個(gè)批量的還原的例子,在實(shí)際的應用中,我們也許會(huì )碰到比當前例子更為復雜的情況,如頁(yè)面還原、段落還原、聯(lián)機還原等??筛鶕囟ǖ膱?chǎng)景,修改或編寫(xiě)更為復雜的腳本。
聯(lián)系客服