【发布时间】: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