BAK 文件的恢复是死锁?
Restore of BAK file is deadlocking?
我正在尝试在许多远程机器上恢复备份 - 每台机器都有一个本地 .BAK
文件。这是在 PS 工作流程中完成的:
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 错误,似乎在您的一台远程服务器上多次调用 RESTORE DATABASE 命令。 运行 该脚本,但注释掉 Invoke-Sqlcmd 行。检查服务器列表,看看您是否在一台服务器上多次还原数据库。
否则,您是否尝试过 运行 没有并行选项的 PS 脚本?换句话说,每个人的正则都会成功吗?如果是这样,那么您的问题出在并行操作的语法中。我自己从未使用过 PowerShell 并行处理,但它似乎有一些意外行为:Reddit discussion
我正在尝试在许多远程机器上恢复备份 - 每台机器都有一个本地 .BAK
文件。这是在 PS 工作流程中完成的:
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 错误,似乎在您的一台远程服务器上多次调用 RESTORE DATABASE 命令。 运行 该脚本,但注释掉 Invoke-Sqlcmd 行。检查服务器列表,看看您是否在一台服务器上多次还原数据库。
否则,您是否尝试过 运行 没有并行选项的 PS 脚本?换句话说,每个人的正则都会成功吗?如果是这样,那么您的问题出在并行操作的语法中。我自己从未使用过 PowerShell 并行处理,但它似乎有一些意外行为:Reddit discussion