2014-10-15 7 views
12

Restore-SqlDatabase cmdlet을 사용하여 데이터베이스를 복원하려고합니다. 나는 파일을 재배치 할 필요가 있지만, 나는 다음과 같은 errror 받고 있어요Restore-SqlDatabase cmdlet의 RelocateFile 속성 문제

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 

넣은
$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

나는 당신이 SQL 2014에 SQL 2012에서 업그레이드 할 때이 오류가 나는 또한 연결이 버그를 올릴 것이다 발생 언급해야한다고 생각하고 당신이 링크를 알게하십시오. – zerocool18

답변

8

이 SMO의 버전의 차이처럼 보이는 등 내 파워 쉘 코드 조회 하나는 Restore-SqlDatabase가 예상합니다. 여기에는 아마도 두 가지 접근 방법이 있습니다.

  1. 버전이 일치하는지 확인하십시오.
  2. Restore-SqlDatabase cmdlet 대신 Microsoft.SqlServer.Management.Smo.Restore.SqlRestore 메서드를 사용하십시오.

아래의 큰 스크립트에서 관련 부분을 추출했습니다. 이 폼에서 테스트되지 않았고 사용 가능한 것으로 가정되는 $ ServerName과 같은 몇 가지 변수가 있지만 사용자를 끌어들일만큼 충분해야합니다.

+0

Thx Scott that worked :-) –

+2

안녕하세요 - 저는이 문제가 있으며 저는 파워 쉘 놈입니다. 버전이 일치하는지 어떻게 확인합니까? – howlee

13

해결 방법 1의 경우 정확한 어셈블리를 사용하기 위해 파일을 재배치 할 때 어셈블리 규정 이름을 지정해야합니다.

 
$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

희망 하시겠습니까?

+0

이것은 나를 위해 일했습니다. – JamesQMurphy

+0

이것도 나를 위해 일했다, 고마워! 저에게 조금 두통을 덜어 줬습니다 ... –

+0

정말 도움이되는 대답입니다. 우리에게 많은 시간과 혼란을 가져다주었습니다. 이것은 "답변으로 표시"해야합니다. 그러나이 구문을 발견 한 곳을 알려주시겠습니까? – zerocool18

2

환경 경로 변수를 변경하여이 문제를 해결하는 것에 대해 블로그를 보았습니다. http://powershelldiaries.blogspot.in/2015/08/backup-sqldatabase-restore-sqldatabase.html을 확인하십시오. 위에서 언급했듯이 "사무엘 뒤 푸르"의 대답은 나를 도왔습니다. 나는 다른 생각을했습니다.

당신은 버전 독립적 인 방법으로이 작업을 수행 할 수 있습니다
+0

매우 흥미로운 설명인데,이 문제를 자세히 이해하는 것이 도움이됩니다. –

+0

이 옵션 중 하나라도 이상적이라고 생각하지 않지만이 방법은 저에게 효과적입니다. – itslittlejohn

2

:

$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