【问题标题】:Larger databases (10GB+) left in "restore pending" state when Stored Proc is called from Powershell script从 Powershell 脚本调用 Stored Proc 时,较大的数据库 (10GB+) 处于“恢复挂起”状态
【发布时间】:2015-04-06 20:32:52
【问题描述】:

我有这个 powershell 脚本,它适用于 5GB 或更小的数据库。但是,当它尝试使用更大的数据库时会出现问题。问题是,当此脚本完成运行时,较大的数据库将处于恢复挂起模式。

此脚本的目标是将前一天晚上的最新 SQL BAK 文件复制到名为 test.txt 的文件夹中。一旦 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\)

我会很感激任何关于为什么会发生这种情况的见解。

谢谢

【问题讨论】:

  • 是的,你会这么认为,但是我运行的是 Microsoft SQL Server Enterprise (SQL Server 11.0.5058)。还有一件事,我可以通过 SSMS 手动恢复 10GB 或更大的数据库。
  • 好的,我做了更多的测试,这就是我发现的。我的存储过程 dbo.restoredatabase 适用于大型数据库。
  • 好的,我做了更多的测试,这就是我发现的。我的存储过程 dbo.restoredatabase 适用于大型数据库。不知何故,它似​​乎与 Poweshell ISE 或其他东西有关。任何想法,我的优势在于 TSQL 而不是 Powershell,因此我将不胜感激。

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


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
相关资源
最近更新 更多