【发布时间】:2019-03-03 20:12:54
【问题描述】:
免责声明:我是 Powershell 的新手。
我正在尝试使用从 Powershell 运行的 SQL 脚本编写两个 SQL Server Express 数据库的备份脚本。当我从 SSMS 运行 SQL 时,它运行良好,没有超时。当我从 Powershell 脚本运行 SQL 时,小型数据库备份成功,但大型数据库备份失败并出现以下错误:
Invoke-Sqlcmd : Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
At C:\Program Files\DBBackups\dbfull_backup.ps1:5 char:1
+ Invoke-Sqlcmd -ServerInstance "$serverInstance" -InputFile "C:\Program Files\ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
+ FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
这是 .ps1 脚本的第 5 行,其中包含 Invoke-SqlCmd:
Invoke-Sqlcmd -ServerInstance "$serverInstance" -InputFile "C:\Program Files\DBBackups\dbfull_backups.sql" -Variable $sqlVariable -Verbose *> $outputFile
这是来自 SQL 的 BACKUP 命令:
BACKUP DATABASE FrameStore TO DISK = @framestore_backup_file;
通过 Powershell/Invoke-Sqlcmd 运行时的超时时间是否与通过 SSMS 时不同?在 SSMS 中运行时,备份需要不到 3 分钟,因此与我在 docs.microsoft 文档中看到的 10 分钟数字相差不大。这是在 SSMS 中运行时的备份输出:
BACKUP DATABASE successfully processed 467003 pages in 176.917 seconds (20.622 MB/sec).
版本信息:
操作系统:Windows Server 2012 R2
MS SQL Server Express 2017
PSVersion 4.0
(如果这个问题已经在另一个 SO 页面中得到解决,我深表歉意。虽然它看起来很基本,但我找不到这个具体问题。)
编辑:
我继续尝试将 -QueryTimeout 参数设置为 3600 秒。这允许备份成功而没有错误。那么,什么是默认值?
根据Microsoft Docs page for Invoke-Sqlcmd -QueryTimeout parameter:
指定查询超时前的秒数。如果未指定超时值,则查询不会超时。
所以...如果这是真的并且我没有指定超时,为什么会超时?这是否从 PS 版本 4 更改为记录的版本?在备份上设置超时似乎是不好的做法?我对这方面的意见感兴趣。它现在有效,但我仍然对我的解决方案没有信心(解决方法?)。
【问题讨论】:
标签: sql-server powershell