Развёртывание Service Pack для SQL Server через PowerShell

Быстрые ссылки
- Предварительные требования
- Проверка на ожидающую перезагрузку
- Копирование инсталлятора на SQL Server
- Распаковка сжатого инсталлятора
- Запуск установщика Service Pack
- Очистка после установки
- Развёртывание на множестве серверов
- Критерии приёмки
- Резюме
Введение
Как и любое серверное ПО, Microsoft SQL Server нужно поддерживать в актуальном состоянии. Microsoft регулярно выпускает Service Pack’и и обновления. Каждый установщик Service Pack поддерживает тихую (silent) установку, что даёт возможность запускать установку по команде и автоматизировать её для одного или сотен серверов.
В этой статье описан практический подход: сначала ручная установка на один сервер с удалённым выполнением команд, затем — шаблон для массового развёртывания.
Предварительные требования
Прежде чем начинать, убедитесь, что у вас есть:
- SQL Server, который нужно обновить (версия не критична для процесса).
- Права пользователя, позволяющие устанавливать пакеты на целевом сервере (локальная администрация или эквивалент).
- Включённый PowerShell Remoting (WinRM) на целевом SQL Server.
- Загруженный инсталлятор Service Pack от Microsoft.
- Базовые знания PowerShell для чтения и адаптации скриптов.
Если всё готово — продолжаем.
Общий план действий
Для удалённой тихой установки Service Pack обычно требуется пять шагов:
- Убедиться, что сервер не ожидает перезагрузки.
- Скопировать инсталлятор на удалённый SQL Server.
- Распаковать содержимое инсталлятора (если он упакован).
- Запустить инсталлятор в тихом режиме.
- Очистить временные файлы.
Ниже — подробные инструкции и варианты автоматизации.
Проверка на ожидающую перезагрузку
Service Pack не установится, если система помечена как ожидающая перезагрузка. Лучше проверять это заранее и пропускать или планировать такой сервер отдельно.
Ниже — пример функции Test-PendingReboot, которая проверяет типичные регистровые ключи и статус Windows Update. Эта функция возвращает $true, если перезагрузка требуется, и $false в противном случае.
function Test-PendingReboot {
param(
[string]$ComputerName = $env:COMPUTERNAME
)
$script = {
$keys = @(
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing',
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired'
)
foreach ($k in $keys) {
if (Test-Path $k) { return $true }
}
# Проверка PendingFileRenameOperations
$pfro = Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Name PendingFileRenameOperations -ErrorAction SilentlyContinue
if ($pfro) { return $true }
return $false
}
Invoke-Command -ComputerName $ComputerName -ScriptBlock $script
}Важно: в некоторых средах могут быть дополнительные индикаторы перезагрузки (настройки антивируса, сторонние установщики). При сомнениях — обсудите с администраторами сервера.
Копирование инсталлятора на SQL Server
Если вы запускаете команды из той же доменной сети и у вас есть права администратора, самый простой способ — использовать Copy-Item к административному шару c$ целевого сервера.
Пример: локальный файл C:\SQLServerServicePacks\SQL2016SP2.exe и сервер SQLSRV:
Copy-Item -Path 'C:\SQLServerServicePacks\SQL2016SP2.exe' -DestinationPath '\\SQLSRV\c$\'Если серверы в другом домене или у вас нет доступа к административному шару, используйте Invoke-Command с New-PSSession и Copy-Item -ToSession, либо инструменты развертывания (SCCM, Azure).
Распаковка сжатого инсталлятора
Многие инсталляторы Service Pack поддерживают ключ /extract или /x для извлечения содержимого. Пример аргументов:
/extract:”C:\Temp\SQLSP” /quiet
Вы можете выполнить распаковку удалённо без RDP, если используете удалённое выполнение команд. В оригинальном описании упоминается функция Invoke-Program — ниже приведён пример такой функции, реализованный поверх Invoke-Command и Start-Process.
Пример реализации Invoke-Program
function Invoke-Program {
param(
[Parameter(Mandatory=$true)] [string]$ComputerName,
[Parameter(Mandatory=$true)] [string]$FilePath,
[string]$ArgumentList = '',
[int]$TimeoutSeconds = 3600
)
$sb = {
param($fp, $args, $timeout)
$startInfo = @{ FilePath = $fp; ArgumentList = $args; Wait = $true; NoNewWindow = $true }
try {
$p = Start-Process @startInfo -PassThru -ErrorAction Stop
if ($p.WaitForExit($timeout * 1000)) { return $p.ExitCode }
else { throw "Process did not exit within timeout" }
}
catch {
throw $_
}
}
Invoke-Command -ComputerName $ComputerName -ScriptBlock $sb -ArgumentList $FilePath, $ArgumentList, $TimeoutSeconds
}Используя эту функцию, распаковка на сервере SQLSRV будет выглядеть так:
Invoke-Program -ComputerName 'SQLSRV' -FilePath 'C:\SQLServerServicePacks\SQL2016SP2.exe' -ArgumentList '/extract:"C:\Temp\SQLSP" /quiet'После успешного выполнения вы получите папку C:\Temp\SQLSP на удалённом сервере с распакованными файлами инсталляции.
Запуск установщика Service Pack
Когда файлы распакованы, запустите setup.exe с ключами тихой установки. Для Service Pack обычно используются ключи /q (quiet) и /allinstances (патчить все экземпляры SQL на сервере).
Пример запуска удалённо:
Invoke-Program -ComputerName 'SQLSRV' -FilePath 'C:\Temp\SQLSP\setup.exe' -ArgumentList '/q /allinstances'Рекомендации:
- Запуск в неинтерактивном режиме означает отсутствие диалогов — следите за логами установщика на удалённой машине.
- Проверьте свободное место на системном диске до установки.
- Для крупных инсталляций рассмотрите окно обслуживания с уведомлением пользователей.
Очистка после установки
Если установка прошла успешно, удалите копию инсталлятора и временную папку, чтобы не занимать место на сервере:
Remove-Item -Path '\\SQLSRV\c$\SQLServerServicePacks\SQL2016SP2.exe','\\SQLSRV\c$\temp\SQLSP' -Recurse -ForceИли выполните удаление непосредственно на сервере:
Invoke-Command -ComputerName 'SQLSRV' -ScriptBlock { Remove-Item -Path 'C:\SQLServerServicePacks\SQL2016SP2.exe','C:\temp\SQLSP' -Recurse -Force }Развёртывание на множестве серверов (шаблон)
Чтобы применить процесс к группе серверов, используйте цикл foreach с логированием, проверками и обработкой ошибок. Ниже — примерный шаблон, который можно адаптировать под вашу среду.
$servers = @('SQLSRV1','SQLSRV2','SQLSRV3')
$installerLocal = 'C:\SQLServerServicePacks\SQL2016SP2.exe'
$remoteTemp = 'C:\Temp\SQLSP'
$log = 'C:\DeployLogs\SPDeploy.log'
foreach ($s in $servers) {
try {
Write-Output "[$s] Начало обработки" | Tee-Object -FilePath $log -Append
if (Test-PendingReboot -ComputerName $s) {
Write-Output "[$s] Пропуск: требуется перезагрузка" | Tee-Object -FilePath $log -Append
continue
}
Copy-Item -Path $installerLocal -Destination "\\$s\c$\" -ErrorAction Stop
Invoke-Program -ComputerName $s -FilePath "C:\\SQLServerServicePacks\\SQL2016SP2.exe" -ArgumentList "/extract:\"$remoteTemp\" /quiet"
Invoke-Program -ComputerName $s -FilePath "$remoteTemp\setup.exe" -ArgumentList '/q /allinstances'
Invoke-Command -ComputerName $s -ScriptBlock { Remove-Item -Path 'C:\SQLServerServicePacks\SQL2016SP2.exe','C:\temp\SQLSP' -Recurse -Force }
Write-Output "[$s] Успешно" | Tee-Object -FilePath $log -Append
}
catch {
Write-Output "[$s] Ошибка: $($_.Exception.Message)" | Tee-Object -FilePath $log -Append
}
}В этом шаблоне можно добавить уведомления (email/Teams), расширенное логирование и метрики успешности.
Критерии приёмки
После установки проверьте следующие пункты, чтобы считать работу выполненной:
- SQL Server показывает новую версию/билд. Пример (через sqlcmd):
Invoke-Command -ComputerName 'SQLSRV' -ScriptBlock { sqlcmd -Q "SELECT SERVERPROPERTY('ProductVersion'), SERVERPROPERTY('ProductLevel'), SERVERPROPERTY('Edition')" }- Службы SQL запущены и экземпляры доступны.
- Бэкапы и индексные операции не прерваны; выполните smoke-тесты приложения.
- На сервере нет критичных ошибок в логах установки (проверьте каталог установки и Setup Bootstrap).
Когда это не сработает — типичные причины
- Сервер ожидает перезагрузки (см. выше).
- Недостаточно прав у учётной записи для копирования/устновки.
- Антивирус/контроль приложений блокируют запуск инсталлятора.
- Несовместимость архитектур (x86 vs x64) или неправильный пакет для версии SQL.
- Мало свободного места на диске.
Для каждой причины — отдельный план действий: координация с операторами, освобождение места, временное отключение блокировок (в рамках политики безопасности).
Альтернативные подходы
- SCCM / ConfigMgr: централизованное развёртывание с отчётностью.
- WSUS / Windows Update for Business: если Service Pack доступен как обновление ОС (редко применимо для SQL).
- Azure Automation / Update Management: для облачных и гибридных сред.
- PDQ Deploy или другие сторонние инструменты для быстрого распространения исполняемых файлов.
- Ручной RDP для одиночных критичных серверов (если нужно интерактивно отвечать на диалоги).
Безопасность и соответствие
- Не передавайте пароли в открытом виде. Используйте управляемые учётные записи или Windows Integrated Authentication.
- Логи установки могут содержать системную информацию; храните их в защищённом хранилище.
- Планируйте развёртывания в окне обслуживания. Сообщайте заинтересованным сторонам о возможных рестартах.
Роли и чек-листы
DBA:
- Проверить совместимость приложений с новым Service Pack.
- Сделать полные бэкапы баз.
- Выполнить smoke-тесты после обновления.
Системный администратор:
- Проверить доступность PowerShell Remoting.
- Обеспечить права на копирование/запуск.
- Проверить свободное место и обновления ОС.
Инженер автоматизации:
- Настроить цикл перебора серверов.
- Добавить логирование и оповещения.
- Реализовать повторные попытки и контроль таймаутов.
Мини-методология развертывания
- Тестовая группа (1–2 сервера) — выполните полную процедуру и дождитесь 48–72 часа мониторинга.
- Канареечное развёртывание (10% серверов) — если нет проблем, расширьте группу.
- Полный прогон на оставшихся серверах.
- Отчёт и ретроспектива с командами DBA и Ops.
Краткий глоссарий
- Service Pack: агрегированный пакет обновлений для продукта Microsoft.
- PowerShell Remoting: механизм выполнения команд удалённо через WinRM.
- Invoke-Program: пример вспомогательной функции для запуска программ на удалённом узле.
Резюме
Вы узнали, как удалённо и тихо установить Service Pack для SQL Server с помощью PowerShell: проверка готовности, копирование файла, распаковка, тихая установка и очистка. Шаблон скрипта позволяет легко масштабировать задачу на десятки и сотни серверов. Ключевые советы: всегда тестируйте на небольшой выборке серверов, проверяйте ожидающие перезагрузки и контролируйте свободное место и логи.
Важно: перед массовым развёртыванием убедитесь, что у вас есть план отката и актуальные бэкапы баз данных.
Похожие материалы
Обновить Cube WP10 до Anniversary Update
Как проверить, запущен ли Docker daemon
Как запланировать твит в Twitter
docker cp — копирование файлов между хостом и контейнером
Копирование файлов по SSH без пароля