当从Powershell脚本调用Stored Proc时,较大的数据库(10GB +)处于“恢复暂挂”状态

时间:2015-02-06 16:20:48

标签: sql sql-server powershell sql-server-2012

我有这个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\)

我很感激为何会发生这种情况。

由于

1 个答案:

答案 0 :(得分:0)

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

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