2016-05-02 34 views
1

次のスクリプトを使用して、サイズが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     
+0

を私が述べられたエラーは、データベースのサイズとは何かを持っているか表示されません。 'localhost'はローカルインスタンスの有効なSQL Serverインスタンス名ではありません。 –

+0

私はセキュリティ上の理由から、意図的にlocalhostに名前を変更しました。 同じスクリプトを使用して、サイズの小さいDbsを復元することができるため、dbサイズが重要になります。 –

+0

ここの答えは助けになるかもしれません:http://stackoverflow.com/questions/5979086/sql-server-timeout-while-restoring-databases-with-smo –

答えて

0

は、問題の原因は、大規模なデータベースへの接続がタイムアウトしました。 $ conn.StatementTimeout = 10000の追加 は私に問題を解決:) おかげ

関連する問題