Я пытаюсь восстановить резервную копию на многих удаленных машинах - каждый из которых имеет локальный файл .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.
Что я делаю не так?
Последовательный запуск - хотя я только что узнал, что он фактически восстанавливает сервер базы данных моего хозяина - восстановление НЕ происходит на пульте дистанционного управления машины. Любая идея, как это сделать? – RobVious
Возможно, вам нужно добавить флаг в конец вашего оператора Invoke-Sqlcmd: -ServerInstance "SERVERNAME" ИЛИ --ServerInstance "SERVERNAME \ INSTANCENAME" – Gary
Lifesaver. Спасибо, Гэри. – RobVious