Sql 较大的数据库(10GB+;)保留在;“恢复挂起”;从Powershell脚本调用存储过程时的状态

Sql 较大的数据库(10GB+;)保留在;“恢复挂起”;从Powershell脚本调用存储过程时的状态,sql,sql-server,powershell,sql-server-2012,Sql,Sql Server,Powershell,Sql Server 2012,我有一个powershell脚本,它非常适合5GB及更小的数据库。然而,当它尝试使用更大的数据库时,它会遇到问题。问题是,当此脚本完成运行时,较大的数据库将处于恢复挂起模式 此脚本的目标是将前一天晚上最新的SQL BAK文件复制到名为test的文件夹中。一旦存在SQL BAK文件,脚本将继续执行下一步,将每个SQL BAK文件恢复到SQL实例 当该脚本在较小的数据库中运行时,它将完成,不会出现任何错误。但是,对于大型数据库,它也会在没有错误的情况下完成,但数据库仍处于恢复挂起模式 $bak_pa

我有一个powershell脚本,它非常适合5GB及更小的数据库。然而,当它尝试使用更大的数据库时,它会遇到问题。问题是,当此脚本完成运行时,较大的数据库将处于恢复挂起模式

此脚本的目标是将前一天晚上最新的SQL BAK文件复制到名为test的文件夹中。一旦存在SQL BAK文件,脚本将继续执行下一步,将每个SQL BAK文件恢复到SQL实例

当该脚本在较小的数据库中运行时,它将完成,不会出现任何错误。但是,对于大型数据库,它也会在没有错误的情况下完成,但数据库仍处于恢复挂起模式

$bak_path = "\\nas2\sqlbackups"
$yesterday = (Get-Date -hour 13 -Minute 0 -Second 0).AddDays(-1)
get-childitem -path $bak_path -Filter "SERVERXYZ*.bak" -Exclude *master*.**,*model*.**,*msdb*.** -File -recurse |
where {$_.CreationTime -gt $yesterday} | copy-item -Destination I:\test


do {

      $bak_path = "I:\TEST"
      Get-ChildItem -path $bak_path | Where-Object {$_.name -like "*SERVERXYZ*"}          |  select -last 1 |
      rename-item -newname {"Database.bak"}
      $Input = Get-ChildItem -path $bak_path Database.bak


      $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
      $SqlConnection.ConnectionString = "Server=SQLENTBAK;Database=test;Integrated Security=True"
      $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
      $SqlCmd.CommandText = "dbo.restoredatabase"
      $SqlCmd.Connection = $SqlConnection
      $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
      $SqlAdapter.SelectCommand = $SqlCmd
      $DataSet = New-Object System.Data.DataSet
      $SqlAdapter.Fill($DataSet)
      $SqlConnection.Close()
      $DataSet.Tables[0]

      $FileName = "I:\TEST\Database.bak"
      if (Test-Path $FileName) {
      Remove-Item $FileName}           

} while (Get-ChildItem I:\TEST\)
我很感激任何关于为什么会发生这种情况的见解


谢谢

您没有提供dbo.restoredatabase,但我希望您在执行该存储过程时超时,而在连接终止时不会回滚,因为默认超时为30秒


您需要将
$SqlCmd.CommandTimeout
更改为更宽松的值,例如300,持续5分钟。足够的长度取决于许多因素。

是的,您会这么认为,但是我运行的是Microsoft SQL Server Enterprise(SQL Server 11.0.5058)。还有一件事,我能够通过SSMS手动恢复10GB及更大的数据库。好的,我做了更多的测试,这就是我发现的。我的存储过程dbo.restoredatabase可以很好地处理大型数据库。好的,我做了更多的测试,这就是我发现的。我的存储过程dbo.restoredatabase适用于大型数据库。不知何故,它似乎与鲍威尔ISE或其他东西有关。任何想法,我的强项是TSQL而不是Powershell,因此我非常感谢在这方面提供的任何帮助。作为参考,这是有效的。有趣的是,我不知道我需要设置超时限制。