Гид по технологиям

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

6 min read SQL Server Обновлено 24 Nov 2025
Service Pack для SQL Server через PowerShell
Service Pack для SQL Server через PowerShell

Развёртывание Service Pack на нескольких серверах.

Быстрые ссылки

  • Предварительные требования
  • Проверка на ожидающую перезагрузку
  • Копирование инсталлятора на 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 обычно требуется пять шагов:

  1. Убедиться, что сервер не ожидает перезагрузки.
  2. Скопировать инсталлятор на удалённый SQL Server.
  3. Распаковать содержимое инсталлятора (если он упакован).
  4. Запустить инсталлятор в тихом режиме.
  5. Очистить временные файлы.

Ниже — подробные инструкции и варианты автоматизации.

Проверка на ожидающую перезагрузку

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. Тестовая группа (1–2 сервера) — выполните полную процедуру и дождитесь 48–72 часа мониторинга.
  2. Канареечное развёртывание (10% серверов) — если нет проблем, расширьте группу.
  3. Полный прогон на оставшихся серверах.
  4. Отчёт и ретроспектива с командами DBA и Ops.

Краткий глоссарий

  • Service Pack: агрегированный пакет обновлений для продукта Microsoft.
  • PowerShell Remoting: механизм выполнения команд удалённо через WinRM.
  • Invoke-Program: пример вспомогательной функции для запуска программ на удалённом узле.

Резюме

Вы узнали, как удалённо и тихо установить Service Pack для SQL Server с помощью PowerShell: проверка готовности, копирование файла, распаковка, тихая установка и очистка. Шаблон скрипта позволяет легко масштабировать задачу на десятки и сотни серверов. Ключевые советы: всегда тестируйте на небольшой выборке серверов, проверяйте ожидающие перезагрузки и контролируйте свободное место и логи.

Важно: перед массовым развёртыванием убедитесь, что у вас есть план отката и актуальные бэкапы баз данных.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Обновить Cube WP10 до Anniversary Update
Мобильные устройства

Обновить Cube WP10 до Anniversary Update

Как проверить, запущен ли Docker daemon
DevOps

Как проверить, запущен ли Docker daemon

Как запланировать твит в Twitter
соцсети

Как запланировать твит в Twitter

docker cp — копирование файлов между хостом и контейнером
Docker

docker cp — копирование файлов между хостом и контейнером

Копирование файлов по SSH без пароля
Сеть

Копирование файлов по SSH без пароля

Создайте собственные обои: от съёмки до готового фона
Фото

Создайте собственные обои: от съёмки до готового фона