简体   繁体   English

恢复BAK文件是否陷入僵局?

[英]Restore of BAK file is deadlocking?

I'm attempting to restore a backup on many remote machines - each of which have a local .BAK file. 我正在尝试在许多远程计算机上还原备份-每个远程计算机都有一个本地.BAK文件。 This is being done from within a PS workflow: 这是通过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
        }
     }

This seems to work if I do one at a time, but if I run multiple in parallel, I get a deadlock error: 如果一次执行一次,这似乎可行,但是如果并行运行多个,则会出现死锁错误:

Invoke-Sqlcmd : Exclusive access could not be obtained because the database is in use. Invoke-Sqlcmd:由于正在使用数据库,因此无法获得独占访问。
RESTORE DATABASE is terminating abnormally. RESTORE DATABASE异常终止。
Transaction (Process ID 54) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. 事务(进程ID 54)与另一个进程在锁资源上死锁,因此被选择为死锁受害者。 Rerun the transaction. 重新运行事务。
ALTER DATABASE statement failed. ALTER DATABASE语句失败。

What am I doing wrong? 我究竟做错了什么?

Based on the SQL error alone, it appears that the RESTORE DATABASE command is being called more than once on one of your remote servers. 仅基于SQL错误,似乎在一台远程服务器上多次调用了RESTORE DATABASE命令。 Run that script, but comment out the Invoke-Sqlcmd line. 运行该脚本,但注释掉Invoke-Sqlcmd行。 Examine the list of servers and see if you are restoring a database more than once on a server. 检查服务器列表,然后查看是否在服务器上多次还原数据库。

Otherwise, have you tried running the PS script without the parallel option? 否则,您是否尝试过在没有parallel选项的情况下运行PS脚本? In other words, will a regular for each succeed? 换句话说,每个人的常规会成功吗? If so, then your problem is in the syntax of your parallel operation. 如果是这样,那么您的问题出在并行操作的语法中。 I've never used PowerShell parallel processing myself, but it appears to have some unexpected behavior: Reddit discussion 我自己从未使用过PowerShell并行处理,但是它似乎有一些意外行为: Reddit讨论

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM