2014-10-15 4 views
12

Si sta tentando di ripristinare un database utilizzando il cmdlet Restore-SqlDatabase. Ho bisogno di spostare i file, ma sto ottenendo il seguente errrorProblemi relativi alla proprietà RelocateFile nel cmdlet Restore-SqlDatabase

Restore-SqlDatabase : Cannot bind parameter 'RelocateFile'. Cannot convert the 
"Microsoft.SqlServer.Management.Smo.RelocateFile" value of type 
"Microsoft.SqlServer.Management.Smo.RelocateFile" to type 
"Microsoft.SqlServer.Management.Smo.RelocateFile". 
At line:25 char:108 
+ ... e -RelocateFil $RelocateData 
+     ~~~~~~~~~~~~~ 
+ CategoryInfo   : InvalidArgument: (:) [Restore-SqlDatabase], ParameterBindingException 
+ FullyQualifiedErrorId CannotConvertArgumentNoMessage,Microsoft.SqlServer.Management.PowerShell.RestoreSqlDatabaseCommand 

Il mio codice PowerShell aspetto come questo

$RelocateData = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("MyDB_Data", "c:\data\MySQLServerMyDB.mdf") 
$RelocateLog = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("MyDB_Log", "c:\data\MySQLServerMyDB.ldf") 
$file = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile($RelocateData,$RelocateLog) 
[email protected]($RelocateData,$RelocateLog) 
Restore-SqlDatabase -ServerInstance DEV\DEMO -Database "test" -BackupFile $backupfile -RelocateFile $myarr 
+0

Credo che si dovrebbe ricordare che questo errore si verifica quando si esegue l'aggiornamento da SQL 2012 a SQL 2014. Io sollevo questo bug in Connect anche e fatelo sapere al link. – zerocool18

risposta

8

Questo appare come una differenza nella versione di SMO di aver caricato e la uno che Restore-SqlDatabase si aspetta. Ci sono probabilmente due approcci qui ...

  1. Assicurarsi che le versioni corrispondano.
  2. Utilizzare il metodo Microsoft.SqlServer.Management.Smo.Restore.SqlRestore anziché il cmdlet Restore-SqlDatabase.

Ho estratto i pezzi rilevanti da uno script più grande di seguito. Non è testato in questa forma e ci sono alcune variabili come $ ServerName che si presume siano disponibili ma dovrebbero essere sufficienti per farti andare avanti.

+0

Thx Scott che ha funzionato :-) –

+2

Ehi lì - Ho questo problema, e sono un po 'un noel PowerShell. Come faccio a "assicurarmi che le versioni corrispondano"? – howlee

13

Per la soluzione n. 1, è necessario specificare il nome qualificato dell'assembly quando si installa il file di riposizionamento per utilizzare l'assembly corretto.

 
$RelocateData = New-Object 'Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' -ArgumentList "MyDB_Data", "c:\data\MySQLServerMyDB.mdf" 
$RelocateLog = New-Object 'Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' -ArgumentList "MyDB_Log", "c:\data\MySQLServerMyDB.ldf" 
$file = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile($RelocateData,$RelocateLog) 
[email protected]($RelocateData,$RelocateLog) 
Restore-SqlDatabase -ServerInstance DEV\DEMO -Database "test" -BackupFile $backupfile -RelocateFile $myarr

Spero che sia d'aiuto!

+0

Questo ha funzionato per me. – JamesQMurphy

+0

Questo ha funzionato anche per me, grazie! Mi ha salvato un po 'di mal di testa ... –

+0

Risposta davvero utile. Ci ha risparmiato un sacco di tempo e di caos. Questo dovrebbe essere "Contrassegnato come risposta". Tuttavia, puoi dire dove hai trovato questa sintassi? – zerocool18

2

Ho bloggato sulla risoluzione di questo problema modificando le variabili del percorso di ambiente. Si prega di controllare http://powershelldiaries.blogspot.in/2015/08/backup-sqldatabase-restore-sqldatabase.html. Come già detto sopra, la risposta di "Samuel Dufour" mi ha aiutato. Ho solo pensato ad un altro modo.

+0

Spiegazione molto interessante, aiuta a capire il problema nei dettagli. –

+0

Questo ha funzionato per me, anche se non penso che nessuna di queste opzioni sia l'ideale. – itslittlejohn

2

È possibile farlo in una versione indipendente dalla strada:

$sqlServerSnapinVersion = (Get-Command Restore-SqlDatabase).ImplementingType.Assembly.GetName().Version.ToString() 
$assemblySqlServerSmoExtendedFullName = "Microsoft.SqlServer.SmoExtended, Version=$sqlServerSnapinVersion, Culture=neutral, PublicKeyToken=89845dcd8080cc91" 

$RelocateData = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, $assemblySqlServerSmoExtendedFullName"('MyDB_Data', 'c:\data\MySQLServerMyDB.mdf') 
$RelocateLog = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, $assemblySqlServerSmoExtendedFullName"('MyDB_Log', 'c:\data\MySQLServerMyDB.ldf') 
[email protected]($RelocateData,$RelocateLog) 
Restore-SqlDatabase -ServerInstance DEV\DEMO -Database "test" -BackupFile $backupfile -RelocateFile $myarr