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

Развёртывание 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
Автор
Редакция

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

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство