次のスクリプトを使用して、サイズが15GBを超え、mdfとldfのサイズが100GBを超えるデータベースを復元しています。しかし、ドライブに十分なスペースがあり、SSMSを使用して手動で復元することができます。 しかし、PowerShellスクリプトを使用しているときにこのエラーが発生しています。 マシンでSQL Server 2012を使用しています。 このスクリプトでは、データベースのサイズを小さくして復元できます。 SMOを使用して復元しています。パワーシェルを使用して15GBを超える大きなデータベースを復元することができません
私を助けてください。その他のコードベースについてもお答えします。
"1" の引数(複数可)と "SqlRestore" を呼び出して例外: "サーバー 'localhost' のために失敗した復元します。" Dで :\ CI \ RestoreDb.ps1:65文字:9 + $ smoRestore。 SqlRestore($サーバー) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~カテゴリー情報:NotSpecified:(:) []、 MethodInvocationException + FullyQualifiedErrorId:FailedOperationExceptionここ
function Invoke-DatabaseRestore {
param ([String]$SQLServer="(local)",
$BackupPath,[String]$DataBaseName,
[String]$BackupFileFilter = "")
$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $SQLServer
if ($server.Databases[$DataBaseName] -ne $null)
{
$server.KillDatabase($DataBaseName)
#$server.databases[$DataBaseName].drop()
}
# Get-ChildItem $BackupPath -Filter $BackupFileFilter | select fullname | % { $backupFile = $_.FullName
#we will query the database name from the backup header later
#$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $SQLServer
$backupDevice = New-Object("Microsoft.SqlServer.Management.Smo.BackupDeviceItem") ($BackupPath, "File")
$smoRestore = new-object("Microsoft.SqlServer.Management.Smo.Restore")
$backupDevice| FL *
#Get default log and data file locations
$DataPath ="D:\MSSQL\Data"
$LogPath = "D:\MSSQL\Log"
if(!(Test-Path($DataPath+"\"+$DataBaseName)))
{
New-Item -Name $DataBaseName -Path $DataPath -ItemType Directory -Force
}
if(!(Test-Path($LogPath+"\"+$DataBaseName)))
{
New-Item -Name $DataBaseName -Path $LogPath -ItemType Directory -Force
}
$DataPath = $DataPath+"\"+$DataBaseName
$LogPath = $LogPath+"\"+$DataBaseName
#restore settings
$smoRestore.NoRecovery = $false;
$smoRestore.ReplaceDatabase = $true;
$smoRestore.Action = "Database"
$smoRestore.PercentCompleteNotification = 10;
$smoRestore.Devices.Add($backupDevice)
#get database name from backup file
$smoRestoreDetails = $smoRestore.ReadBackupHeader($server)
#give a new database name
$smoRestore.Database = $DataBaseName # $smoRestoreDetails.Rows[0]["DatabaseName"]
#Relocate each file in the restore to the default directory
$smoRestoreFiles = $smoRestore.ReadFileList($server)
foreach ($File in $smoRestoreFiles) {
#Create relocate file object so that we can restore the database to a different path
$smoRestoreFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
#the logical file names should be the logical filename stored in the backup media
$smoRestoreFile.LogicalFileName = $File.LogicalName
$smoRestoreFile.PhysicalFileName = $(if($File.Type -eq "L") {$LogPath} else {$DataPath}) + "\" + [System.IO.Path]::GetFileName($File.PhysicalName)
$smoRestore.RelocateFiles.Add($smoRestoreFile)
}
#restore database
$smoRestore.SqlRestore($server)
}
#load assemblies
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null
$SqlInstance = 'HYDHTC233832D'
$DatabaseName = "xyz"
$BackupPath = "D:\xyz.bak"
Invoke-DatabaseRestore -SQLServer $SqlInstance -BackupPath $BackupPath -DataBaseName $DatabaseName
を私が述べられたエラーは、データベースのサイズとは何かを持っているか表示されません。 'localhost'はローカルインスタンスの有効なSQL Serverインスタンス名ではありません。 –
私はセキュリティ上の理由から、意図的にlocalhostに名前を変更しました。 同じスクリプトを使用して、サイズの小さいDbsを復元することができるため、dbサイズが重要になります。 –
ここの答えは助けになるかもしれません:http://stackoverflow.com/questions/5979086/sql-server-timeout-while-restoring-databases-with-smo –