【问题标题】:Getting "Execution Timeout Expired" Running SQL Server Backup through Invoke-Sqlcmd获取“执行超时已过期”通过 Invoke-Sqlcmd 运行 SQL Server 备份
【发布时间】: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


    【解决方案1】:

    所以你已经达到了著名的 SMO 对象的 30 秒超时。

    Grant Friitchey 早在 2010 年就写过它。在这里阅读它:https://www.scarydba.com/2010/04/16/powershell-smo-problem/

    如果你设置它 = 0 - 你会告诉它无限运行。

    关于相同内容的更新博客文章:https://fbrazeal.wordpress.com/2015/06/29/sqlps-tips/

    已编辑:

    根据您运行的版本,您还应该阅读以下内容:https://blogs.technet.microsoft.com/heyscriptingguy/2013/05/06/10-tips-for-the-sql-server-powershell-scripter/

    【讨论】:

    • wordpress 网站的第二个链接现已失效。
    【解决方案2】:

    长问题简答 您需要使用参数-Querytimeout X,其中 X 是以秒为单位的时间

    有问题的查询将像这样工作,其中 0 表示无限超时,我们可以使用 1 到 65535 之间的整数值。

    Invoke-Sqlcmd -ServerInstance "$serverInstance" -Querytimeout 0 -InputFile "C:\Program Files\DBBackups\dbfull_backups.sql" -Variable $sqlVariable -Verbose *> $outputFile
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 2016-12-09
      • 2023-03-04
      • 2022-07-07
      • 2018-08-23
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多