Использование API оценки SQL для SQL Server на Linux

Область применения: SQL Server — Linux

API оценки SQL предоставляет механизм оценки конфигурации SQL Server для получения рекомендаций. API поставляется с набором правил, содержащим рекомендации, рекомендуемые командой SQL Server. Этот набор правил улучшен с выпуском новых версий. Полезно убедиться, что конфигурация SQL Server соответствует рекомендациям.

Набор правил, отправленных корпорацией Майкрософт, доступен на сайте GitHub. Просмотреть весь набор правил можно в репозитории примеров.

В этой статье мы рассмотрим два способа запуска API оценки SQL для SQL Server на Linux и контейнеров:

Расширение оценки SQL для Azure Data Studio (предварительная версия)

Расширение оценки SQL для Azure Data Studio (предварительная версия) предоставляет механизм оценки конфигурации SQL Server для рекомендаций.

С помощью этой предварительной версии можно:

  • Оценка SQL Server, базы данных SQL Azure или Управляемый экземпляр SQL Azure и ее баз данных с помощью встроенных правил
  • Получение списка всех встроенных правил, применимых к экземпляру и его базам данных
  • Экспорт результатов оценки и список применимых правил в виде скрипта для хранения его в таблице SQL
  • Создание отчетов HTML для результатов оценки

Снимок экрана: расширение оценки SQL в Azure Data Studio.

Запуск оценки SQL

  • После установки расширения оценки SQL разверните список серверов, щелкните правой кнопкой мыши сервер или базу данных, которую вы хотите оценить, и выберите " Управление".
  • Затем в разделе "Общие" выберите "Оценка SQL". На вкладке "Оценка" выберите "Вызвать оценку ", чтобы выполнить оценку выбранной базы данных SQL Server или Базы данных SQL Azure. После получения результатов можно использовать функции фильтрации и сортировки.
  • Выберите "Экспорт как скрипт" , чтобы получить результаты в формате вставки в таблицу. Вы также можете выбрать "Создать HTML-отчет ", чтобы сохранить результаты оценки в виде HTML-файла. Некоторые правила оценки предназначены для определенных конфигураций SQL Server и для других. То же самое верно для правил базы данных. Например, существуют правила, применимые только к SQL Server 2016 (13.x) или tempdb базе данных.
  • Кнопка "Просмотр применимых правил " отображает правила оценки, используемые для оценки серверов и баз данных после нажатия кнопки "Вызвать оценку". Чтобы просмотреть сведения об API оценки SQL Server и SQL, выберите "Сведения". Результаты сеанса оценки можно просмотреть на вкладке "Журнал".

API оценки SQL с помощью PowerShell

Второй вариант — использовать PowerShell для запуска скрипта API оценки SQL.

Необходимые компоненты

  1. Убедитесь, что вы устанавливаете PowerShell в Linux.

  2. SqlServer Установите модуль PowerShell из коллекция PowerShell, выполняя от имени mssql пользователя.

    su mssql -c "/usr/bin/pwsh -Command Install-Module SqlServer"
    

Настройка оценки

Выходные данные API оценки SQL доступны в формате JSON. Чтобы настроить API оценки SQL, сделайте следующее:

  1. В экземпляре, который вы хотите оценить, создайте имя входа для оценки SQL Server с помощью проверки подлинности SQL. Для создания имени входа и надежного пароля можно использовать следующий скрипт Transact-SQL (T-SQL). Замените <secure_password> строгим паролем выбранного значения.

    USE [master];
    GO
    
    CREATE LOGIN [assessmentLogin] WITH PASSWORD = N'<secure_password>';
    ALTER SERVER ROLE [CONTROL SERVER] ADD MEMBER [assessmentLogin];
    GO
    

    Роль CONTROL SERVER работает для большинства оценок. Однако существует несколько оценок, которые могут потребовать привилегий sysadmin . Если эти правила не выполняются, рекомендуется использовать CONTROL SERVER разрешения.

  2. Сохраните учетные данные для входа в систему следующим образом, заменив <secure_password> пароль, используемый на предыдущем шаге.

    echo "assessmentLogin" > /var/opt/mssql/secrets/assessment
    echo "<secure_password>" >> /var/opt/mssql/secrets/assessment
    
  3. Защитите новые учетные данные оценки, гарантируя, что доступ к учетным данным может получить только mssql пользователь.

    chmod 600 /var/opt/mssql/secrets/assessment
    chown mssql:mssql /var/opt/mssql/secrets/assessment
    

Скачивание скрипта оценки

Ниже приведен пример скрипта, который вызывает API оценки SQL, используя учетные данные, созданные на предыдущих шагах. Скрипт создает выходной файл в формате JSON в этом расположении: /var/opt/mssql/log/assessments

Примечание.

API оценки SQL также может создавать выходные данные в форматах CSV и XML.

Этот скрипт доступен для скачивания с GitHub.

Этот файл можно сохранить как /opt/mssql/bin/runassessment.ps1.

[CmdletBinding()] param ()

$Error.Clear()

# Create output directory if not exists

$outDir = '/var/opt/mssql/log/assessments'
if (-not ( Test-Path $outDir )) { mkdir $outDir }
$outPath = Join-Path $outDir 'assessment-latest'

$errorPath = Join-Path $outDir 'assessment-latest-errors'
if ( Test-Path $errorPath ) { remove-item $errorPath }

function ConvertTo-LogOutput {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true)]
        $input
    )
    process {
        switch ($input) {
            { $_ -is [System.Management.Automation.WarningRecord] } {
                $result = @{
                    'TimeStamp' = $(Get-Date).ToString("O");
                    'Warning'   = $_.Message
                }
            }
            default {
                $result = @{
                    'TimeStamp'      = $input.TimeStamp;
                    'Severity'       = $input.Severity;
                    'TargetType'     = $input.TargetType;
                    'ServerName'     = $serverName;
                    'HostName'       = $hostName;
                    'TargetName'     = $input.TargetObject.Name;
                    'TargetPath'     = $input.TargetPath;
                    'CheckId'        = $input.Check.Id;
                    'CheckName'      = $input.Check.DisplayName;
                    'Message'        = $input.Message;
                    'RulesetName'    = $input.Check.OriginName;
                    'RulesetVersion' = $input.Check.OriginVersion.ToString();
                    'HelpLink'       = $input.HelpLink
                }

                if ( $input.TargetType -eq 'Database') {
                    $result['AvailabilityGroup'] = $input.TargetObject.AvailabilityGroupName
                }
            }
        }

        $result
    }
}

function Get-TargetsRecursive {

    [CmdletBinding()]
    Param (
        [Parameter(ValueFromPipeline = $true)]
        [Microsoft.SqlServer.Management.Smo.Server] $server
    )

    $server
    $server.Databases
}

function Get-ConfSetting {
    [CmdletBinding()]
    param (
        $confFile,
        $section,
        $name,
        $defaultValue = $null
    )

    $inSection = $false

    switch -regex -file $confFile {
        "^\s*\[\s*(.+?)\s*\]" {
            $inSection = $matches[1] -eq $section
        }
        "^\s*$($name)\s*=\s*(.+?)\s*$" {
            if ($inSection) {
                return $matches[1]
            }
        }
    }

    return $defaultValue
}

try {
    Write-Verbose "Acquiring credentials"

    $login, $pwd = Get-Content '/var/opt/mssql/secrets/assessment' -Encoding UTF8NoBOM -TotalCount 2
    $securePassword = ConvertTo-SecureString $pwd -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential ($login, $securePassword)
    $securePassword.MakeReadOnly()

    Write-Verbose "Acquired credentials"

    $serverInstance = '.'

    if (Test-Path /var/opt/mssql/mssql.conf) {
        $port = Get-ConfSetting /var/opt/mssql/mssql.conf network tcpport

        if (-not [string]::IsNullOrWhiteSpace($port)) {
            Write-Verbose "Using port $($port)"
            $serverInstance = "$($serverInstance),$($port)"
        }
    }

    # IMPORTANT: If the script is run in trusted environments and there is a prelogin handshake error,
    # add -TrustServerCertificate flag in the commands for $serverName, $hostName and Get-SqlInstance lines below.
    $serverName = (Invoke-SqlCmd -ServerInstance $serverInstance -Credential $credential -Query "SELECT @@SERVERNAME")[0]
    $hostName = (Invoke-SqlCmd -ServerInstance $serverInstance -Credential $credential -Query "SELECT HOST_NAME()")[0]

    # Invoke assessment and store results.
    # Replace 'ConvertTo-Json' with 'ConvertTo-Csv' to change output format.
    # Available output formats: JSON, CSV, XML.
    # Encoding parameter is optional.

    Get-SqlInstance -ServerInstance $serverInstance -Credential $credential -ErrorAction Stop
    | Get-TargetsRecursive
    | ForEach-Object { Write-Verbose "Invoke assessment on $($_.Urn)"; $_ }
    | Invoke-SqlAssessment 3>&1
    | ConvertTo-LogOutput
    | ConvertTo-Json -AsArray
    | Set-Content $outPath -Encoding UTF8NoBOM
}
finally {
    Write-Verbose "Error count: $($Error.Count)"

    if ($Error) {
        $Error
        | ForEach-Object { @{ 'TimeStamp' = $(Get-Date).ToString("O"); 'Message' = $_.ToString() } }
        | ConvertTo-Json -AsArray
        | Set-Content $errorPath -Encoding UTF8NoBOM
    }
}

Примечание.

При запуске этого скрипта в доверенных средах и получении ошибки подтверждения предварительного журнала добавьте -TrustServerCertificate флаг в команды для $serverName$hostName и Get-SqlInstance строки в коде.

Запуск оценки

  1. Убедитесь, что скрипт принадлежит и исполняемый mssqlфайл.

    chown mssql:mssql /opt/mssql/bin/runassessment.ps1
    chmod 700 /opt/mssql/bin/runassessment.ps1
    
  2. Создайте папку журнала и назначьте пользователю соответствующие разрешения mssql в папке:

    mkdir /var/opt/mssql/log/assessments/
    chown mssql:mssql /var/opt/mssql/log/assessments/
    chmod 0700 /var/opt/mssql/log/assessments/
    
  3. Теперь вы можете создать первую оценку, но убедитесь, что вы делаете это как mssql пользователь, чтобы последующие оценки могли выполняться автоматически через cron или systemd более безопасно.

    su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"
    
  4. После завершения команды выходные данные создаются в формате JSON. Эти выходные данные можно интегрировать с любым инструментом, поддерживающим синтаксический анализ JSON-файлов. Одним из таких примеров является Red Hat Insights.