2016-08-10 4 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.

Что я делаю не так?

ответ

1

Исходя из одной только ошибки SQL, представляется, что команда RESTORE DATABASE вызывается более одного раза на одном из ваших удаленных серверов. Запустите этот скрипт, но закомментируйте строку Invoke-Sqlcmd. Изучите список серверов и посмотрите, восстанавливаете ли вы базу данных несколько раз на сервере.

В противном случае вы попытались запустить сценарий PS без параллельного варианта? Другими словами, будет ли регулярный для каждого успех? Если это так, то ваша проблема заключается в синтаксисе вашей параллельной операции. Я никогда не использовал параллельную обработку PowerShell, но, похоже, имеет некоторое неожиданное поведение: Reddit discussion

+0

Последовательный запуск - хотя я только что узнал, что он фактически восстанавливает сервер базы данных моего хозяина - восстановление НЕ происходит на пульте дистанционного управления машины. Любая идея, как это сделать? – RobVious

+0

Возможно, вам нужно добавить флаг в конец вашего оператора Invoke-Sqlcmd: -ServerInstance "SERVERNAME" ИЛИ --ServerInstance "SERVERNAME \ INSTANCENAME" – Gary

+0

Lifesaver. Спасибо, Гэри. – RobVious