Получение «Время выполнения истекло» Запуск резервного копирования SQL Server через Invoke-Sqlcmd - PullRequest
0 голосов
/ 27 сентября 2018

Отказ от ответственности: я новичок в Powershell.

Я пытаюсь создать сценарий резервного копирования двух баз данных SQL Server Express с помощью сценария SQL, запускаемого из Powershell.Когда я запускаю SQL From SSMS, он работает без таймаута.Когда я запускаю SQL из сценария Powershell, резервное копирование небольшой базы данных завершается успешно, но резервное копирование большей базы данных завершается неудачно с этой ошибкой:

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

Вот строка 5 из сценария .ps1, который имеет Invoke-SqlCmd:

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

Вот команда BACKUP из SQL:

BACKUP DATABASE FrameStore TO DISK = @framestore_backup_file;

Отличается ли время ожидания при запуске через Powershell / Invoke-Sqlcmd от SSMS?При запуске в SSMS резервное копирование занимает менее 3 минут, поэтому оно не близко к 10-минутному числу, которое я видел в документации по docs.microsoft.Вот выходные данные резервного копирования при запуске в 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. Я не смог найти эту конкретную проблему, хотя она кажется довольно простой.)

РЕДАКТИРОВАТЬ: * 1028Я пошел дальше и попытался добавить параметр -QueryTimeout, установленный в 3600 секунд.Это позволило выполнить резервное копирование без ошибок.Итак, что по умолчанию?

Согласно странице Microsoft Docs для параметра Invoke-Sqlcmd -QueryTimeout :

Задает количество секунд до истечения времени ожидания запросов.Если значение тайм-аута не указано, запросы не истекают.

Итак ... если это правда, и я не указал время ожидания, почему оно истекло?Изменилось ли это с версии PS 4 на версию, документированную?Кажется ли плохой практикой устанавливать время ожидания для резервной копии?Мне интересны мнения по этому поводу.Это работает сейчас, но я все еще не уверен в своем решении (обходной путь?).

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Короткий ответ на длинный вопрос. Вам нужно использовать параметр -Querytimeout X, где X - время в секундах.

. Запрашиваемый запрос будет работать примерно так: 0 - бесконечное время ожидания. Мы можем использовать целочисленное значение от 1 до 65535.

Invoke-Sqlcmd -ServerInstance "$serverInstance" -Querytimeout 0 -InputFile "C:\Program Files\DBBackups\dbfull_backups.sql" -Variable $sqlVariable -Verbose *> $outputFile
0 голосов
/ 28 сентября 2018

Итак, вы достигли знаменитого 30-секундного тайм-аута объекта SMO.

Грант Фричи написал об этом еще в 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...