2016-08-10 12 views
0

多くのリモートマシン(それぞれローカルの.BAKファイルを持っている)でバックアップを復元しようとしています。これは、PSワークフロー内から行われています:BAKファイルの復元がデッドロックしていますか?

foreach -parallel ($server in $targetServers) 
{ 
    InlineScript 
     { 
      $serverName = $using:server.serverName; 
      $serverDrive = $using:server.drive; 
      $bakFileName = $using:testBakFileName; 
      $targetFileFullPath = "\\$servername\$serverDrive\$bakFileName"; 
      $sqlScript = 
       "ALTER DATABASE $using:TargetDbName SET Single_User WITH Rollback Immediate 
       GO 
       RESTORE DATABASE $using:TargetDbName FROM DISK = N'$targetFileFullPath' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10 
       ALTER DATABASE $using:TargetDbName SET MULTI_USER" 
      Write-Output " Restoring $using:TargetDbName from $targetFileFullPath on $serverName with $sqlScript" 
      Invoke-Sqlcmd -Query "$sqlScript" -Verbose -queryTimeout 65534 
     } 
    } 

これは私が一度に一つをすれば動作するようだが、私は並列で複数を実行する場合、私はデッドロックエラーを取得:

Invoke-Sqlcmd : Exclusive access could not be obtained because the database is in use.
RESTORE DATABASE is terminating abnormally.
Transaction (Process ID 54) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
ALTER DATABASE statement failed.

私は間違って何をしていますか?単独のSQLエラーに基づいて、DATABASEコマンドを復元すること

答えて

1

を表示され、あなたのリモートサーバーのいずれかに複数回呼び出されています。そのスクリプトを実行しますが、Invoke-Sqlcmd行をコメントアウトします。サーバーのリストを調べ、サーバーで複数回データベースをリストアしているかどうかを確認します。

はそうしないと、並列オプションなしでPSスクリプトを実行しようとしましたか?言い換えれば、それぞれが成功するでしょうか?もしそうなら、問題は並列操作の構文にあります。 Reddit discussion

+0

私はそれが実際に私のホストマシンのデータベースサーバーに復元されていることを知りましたが、復旧はリモートでは起こっていませんマシン。どのようにそれが起こるようにするか? – RobVious

+0

あなたはあなたの呼び出し-sqlcmdの文の最後にフラグを追加する必要がある場合があります-ServerInstance「SERVERNAME」OR --ServerInstance「サーバー名\のINSTANCENAME」 – Gary

+0

命の恩人。ゲイリーに感謝します。 – RobVious

関連する問題