2011-02-25 14 views
9

Başka bir sunucudan veritabanı yedeklemesi alma localhost'ta sqlexpress'e geri yüklemeye çalışıyorum. Bu geri yükleme gui üzerinden çalışacak ama ben powershell ile geri yükleme sorunları yaşıyorum. Bu hattın karakteri 23Veritabanı yedeğini smo ve powershell ile yeni veritabanına geri yükleme hatası

Exception calling "SqlRestore" with "1" argument(s): "Restore failed for Server 
+ $smoRestore.SqlRestore <<<< ($server) 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 

hata mesajı puanı: Ben aşağıdaki hata iletisini alabilirsiniz

 $smoRestore.SqlRestore($server) 

Senaryo: Ben sizinkine çok benzer bir senaryo var

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null 

Import-Module PSCX 
Import-Module WebAdministration 

function GetLatestItem(){ 
    param([string]$RemotePath) 
    $returnString = Get-ChildItem $RemotePath -force -filter "*.7z" | sort @{expression={$_.LastWriteTime}; Descending=$true} | select Name -first 1 
    return $returnString.Name 
} 

function DatabaseExists(){ 
    param([Microsoft.SqlServer.Management.Smo.Server]$server,[string]$databaseName) 
    foreach($database in $server.Databases){ 
     if($database.Name -eq $databaseName){ 
      $true 
     } 
    } 
    $false 
} 

$LocalFile = "C:\backups\backupname.bak.7z" 
$LocalFilePath = "C:\backups\" 

Expand-Archive $Localfile $LocalFilePath  

# Most of the restore information was found at http://www.sqlmusings.com/2009/06/01/how-to-restore-sql-server-databases-using-smo-and-powershell/ 
$backupFile = $LocalFilePath + [IO.Path]::GetFileNameWithoutExtension($LocalFile) 
[Microsoft.SqlServer.Management.Smo.Server]$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") ".\SQLEXPRESS" 
$backupDevice = New-Object ("Microsoft.SqlServer.Management.Smo.BackupDeviceItem") ($backupFile, "File") 
$smoRestore = New-Object Microsoft.SqlServer.Management.Smo.Restore 

$smoRestore.NoRecovery = $true; 
$smoREstore.ReplaceDatabase = $true; 
$smoRestore.Action = "Database" 
$smoRestore.PercentCompleteNotification = 10; 
$smoRestore.Devices.Add($backupDevice) 

# Get the details from the backup device for the database name and output that 
$smoRestoreDetails = $smoRestore.ReadBackupHeader($server) 
$databaseName = $smoRestoreDetails.Rows[0]["DatabaseName"] 

"Database Name from Backup Header : " + $databaseName 
$smoRestore.Database = $databaseName  

if(DatabaseExists $server $databaseName -not){ 
    $smoRestoreFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile") 
    $smoRestoreLog = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile") 
    $smoRestoreFile.LogicalFileName = $smoRestoreDetails.Rows[0]["DatabaseName"] 
    $smoRestoreFile.PhysicalFileName = $server.Information.MasterDBPath + "\" + $smoRestore.Database + "_Data.mdf" 
    $smoRestoreLog.LogicalFileName = $smoRestoreDetails.Rows[0]["DatabaseName"] + "_Log" 
    $smoRestoreLog.PhysicalFileName = $server.Information.MasterDBPath + "\" + $smoRestore.Database + "_Log.ldf" 
    $smoRestore.RelocateFiles.Add($smoRestoreFile) 
    $smoRestore.RelocateFiles.Add($smoRestoreLog) 
} 

$smoRestore.SqlRestore($server) 
if($error.Count -eq 0){ 
} 
else{ 
    $Error[0].exception.message 
} 
+0

Soru kodunuz bir sorunu çözmeme yardımcı oldu! Teşekkürler :) – Gezim

cevap

11

, Birkaç kayda değer farklarla:

  • SqlRestore'u aramadan önce, $server.KillAllProcesses($databaseName) numaralı telefonu arayın.
  • Sana hiç yok $smoRestore.FileNumber = 1 var yerine $true
  • arasında, $smoRestore.NoRecovery = $false var. Bunun GUI'deki yedek kümeden bir dosyayı denetlemesine karşılık geldiğini düşünüyorum.

Ben de mantıksal/fiziksel dosya adlarını ayarlamak için benzer kod var, ancak bunun yerine $server.Information kullanmak yerine, ben ("iyi" olup olmadığından emin olmadıklarını) kayıt defterinden bilgi çekin. Diğer bir fark, $smoRestore.ReadBackupHeader yerine $smoRestore.ReadFileList kullanıyorum.

Ayrıca, henüz yapmadıysanız, doğru göründüğünden emin olmak için yollarınızda birkaç Write-Host ifadesini kullanmayı deneyebilirsiniz.

Kurşun tweakslerden biri, sorununuzu çözer. Komutumdan daha fazla bilgi edinmek isterseniz bana bildirin.

+0

Gelecek okuyucular için, "$ smoRestore.FileNumber = 1" ekleyerek benim için yaptı. – CIGuy

+6

Ayrıca istisna derinlemesine kazmayı deneyebilirsiniz. Kullanmayı deneyin: '$ Hata [0] .exception.GetBaseException(). – sakadas

1

Bir iş arkadaşım ve ben de bu sorunla karşılaştık ve biraz sorun giderme işleminden sonra SQL Server Management Studio'yu kapatmanın hile yaptığını gördük.

Umarız başkası yaptığımız tüm sorun giderme işlemlerini atlayabilir ve bu kolay çözüm birkaç saatte tasarruf sağlar.

İlgili konular