Sql 较大的数据库(10GB+;)保留在;“恢复挂起”;从Powershell脚本调用存储过程时的状态
我有一个powershell脚本,它非常适合5GB及更小的数据库。然而,当它尝试使用更大的数据库时,它会遇到问题。问题是,当此脚本完成运行时,较大的数据库将处于恢复挂起模式 此脚本的目标是将前一天晚上最新的SQL BAK文件复制到名为test的文件夹中。一旦存在SQL BAK文件,脚本将继续执行下一步,将每个SQL BAK文件恢复到SQL实例 当该脚本在较小的数据库中运行时,它将完成,不会出现任何错误。但是,对于大型数据库,它也会在没有错误的情况下完成,但数据库仍处于恢复挂起模式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
$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,因此我非常感谢在这方面提供的任何帮助。作为参考,这是有效的。有趣的是,我不知道我需要设置超时限制。