我有这个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\)
我很感激为何会发生这种情况。
由于
答案 0 :(得分:0)
您没有提供dbo.restoredatabase
但我希望您在执行该存储过程时超时,并且在连接终止时不回滚,因为默认超时为30秒。
您需要将$SqlCmd.CommandTimeout
更改为更慷慨,例如300,持续5分钟。足够的长度取决于很多因素。