从 Powershell 脚本调用存储过程时,较大的数据库 (10GB+) 处于 "restore pending" 状态
Larger databases (10GB+) left in "restore pending" state when Stored Proc is called from Powershell script
我有这个 powershell 脚本,它非常适合 5GB 或更小的数据库。但是,当它尝试访问更大的数据库时会出现问题。问题是,当此脚本完成到 运行 时,较大的数据库将处于恢复挂起模式。
此脚本的目标是将前一天晚上的最新 SQL BAK 文件复制到名为 test 的文件夹中。一旦 SQL BAK 文件存在,脚本将继续执行下一步,将每个 SQL BAK 文件恢复到 SQL 实例。
当此脚本 运行s 用于较小的数据库时,它会完成且没有错误。然而,对于大型数据库,它也可以毫无错误地完成,但数据库仍处于还原挂起模式。
$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
更改为更慷慨,例如 5 分钟 300。长度是否足够取决于很多因素。
我有这个 powershell 脚本,它非常适合 5GB 或更小的数据库。但是,当它尝试访问更大的数据库时会出现问题。问题是,当此脚本完成到 运行 时,较大的数据库将处于恢复挂起模式。
此脚本的目标是将前一天晚上的最新 SQL BAK 文件复制到名为 test 的文件夹中。一旦 SQL BAK 文件存在,脚本将继续执行下一步,将每个 SQL BAK 文件恢复到 SQL 实例。
当此脚本 运行s 用于较小的数据库时,它会完成且没有错误。然而,对于大型数据库,它也可以毫无错误地完成,但数据库仍处于还原挂起模式。
$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
更改为更慷慨,例如 5 分钟 300。长度是否足够取决于很多因素。