Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server в Linux
SQL Assessment API предоставляет механизм для оценки конфигурации SQL Server на основе лучших практик. API поставляется с набором правил, содержащим рекомендации, рекомендуемые командой SQL Server. Этот набор правил улучшен с выпуском новых версий. Полезно убедиться, что конфигурация SQL Server соответствует рекомендациям.
Набор правил, выпущенный Microsoft, доступен на GitHub. Просмотреть весь набор правил можно в репозитории примеров.
В этой статье используйте PowerShell для запуска SQL Assessment API для SQL Server на Linux и контейнеров.
Предварительные условия
Убедитесь, что вы устанавливаете PowerShell в Linux.
SqlServerУстановите модуль PowerShell из коллекция PowerShell, выполняя от имениmssqlпользователя.su mssql -c "/usr/bin/pwsh -Command Install-Module SqlServer"
Настройка оценки
SQL Assessment API предоставляет результаты в формате JSON. Для настройки SQL Assessment API выполните следующие шаги:
Создайте учётную запись для входа для оценки SQL Server с проверкой подлинности SQL Server в экземпляре, который вы хотите оценить. Используйте следующий скрипт Transact-SQL, чтобы создать логин и надёжный пароль. Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.
USE [master]; GO CREATE LOGIN [assessmentLogin] WITH PASSWORD = N'<password>'; GRANT CONTROL SERVER TO [assessmentLogin]; GOCONTROL SERVERразрешение подходит для большинства оценок. Однако для некоторых оценок могут потребоваться права системного администратора . Если вы не запускаете эти проверки, используйте разрешенияCONTROL SERVER.Сохраните учётные данные для подключения к экземпляру. Замените
<password>пароль, который использовали на предыдущем этапе.echo "assessmentLogin" > /var/opt/mssql/secrets/assessment echo "<password>" >> /var/opt/mssql/secrets/assessmentОбеспечьте безопасность новых учетных данных оценки, гарантируя, что доступ к ним может получить только
mssqlпользователь.chmod 600 /var/opt/mssql/secrets/assessment chown mssql:mssql /var/opt/mssql/secrets/assessment
Скачивание скрипта оценки
Следующий пример скрипта вызывает SQL Assessment API с использованием учетных данных, созданных на предыдущих этапах. Скрипт генерирует 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 кода.
Запустите оценку
Убедитесь, что
mssqlпользователь владеет скриптом и может его выполнить.chown mssql:mssql /opt/mssql/bin/runassessment.ps1 chmod 700 /opt/mssql/bin/runassessment.ps1Создайте папку журнала и дайте
mssqlпользователю права на её доступ.mkdir /var/opt/mssql/log/assessments/ chown mssql:mssql /var/opt/mssql/log/assessments/ chmod 0700 /var/opt/mssql/log/assessments/Теперь вы можете создать свою первую оценку как пользователь
mssql. Запускать проверки от имени этого пользователя безопаснее, особенно если впоследствии вы автоматически запускаете проверки черезcronилиsystemd.su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"Когда команда завершается, она создаёт вывод в формате JSON. Этот вывод можно использовать с любым инструментом, поддерживающим разбор JSON-файлов, включая Visual Studio Code.