Linux üzerinde SQL Server için SQL Değerlendirme API'sini kullanma

Şunlar için geçerlidir:Linux üzerinde SQL Server

SQL Değerlendirme API, SQL Server'ın yapılandırmasını en iyi uygulamalar için değerlendirmek için bir mekanizma sağlar. API, SQL Server ekibi tarafından önerilen en iyi yöntemleri içeren bir kural kümesiyle teslim edilir. Bu kural kümesi, yeni sürümlerin yayımlanmasıyla geliştirilmiştir. SQL Server yapılandırmanızın önerilen en iyi yöntemlerle uyumlu olduğundan emin olmak yararlı olur.

Microsoft tarafından gönderilen kural seti GitHub'da mevcut. tüm kural kümesiniörnekleri deposundagörüntüleyebilirsiniz.

Bu makalede, Linux üzerinde SQL Server ve konteynerlerde SQL Değerlendirme API'sini çalıştırmak için PowerShell kullanın.

Önkoşullar

  1. Linux üzerine PowerShell'i yüklediğinizden emin olun.

  2. SqlServer kullanıcısı olarak çalışan PowerShell Galerisi'nden mssql PowerShell modülünü yükleyin.

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

Değerlendirmeyi ayarlama

SQL Değerlendirme API, JSON formatında çıktı sağlar. SQL Değerlendirme API'sini yapılandırmak için aşağıdaki adımları tamamlayın:

  1. Değerlendirmek istediğiniz örnekte SQL Authentication kullanarak SQL Server değerlendirmeleri için bir giriş oluşturun. Aşağıdaki Transact-SQL betiklerini kullanarak bir giriş ve güçlü bir şifre oluşturun. Parolanız, SQL Server varsayılanparola ilkesine uygun olmalıdır. Varsayılan olarak, parola en az sekiz karakter uzunluğunda olmalı ve şu dört kümeden üçünün karakterlerini içermelidir: büyük harfler, küçük harfler, 10 tabanındaki basamaklar ve simgeler. Parolalar en çok 128 karakter uzunluğunda olabilir. Mümkün olduğunca uzun ve karmaşık parolalar kullanın.

    USE [master];
    GO
    
    CREATE LOGIN [assessmentLogin]
        WITH PASSWORD = N'<password>';
    
    GRANT CONTROL SERVER TO [assessmentLogin];
    GO
    

    CONTROL SERVER izni, çoğu değerlendirmede işe yarar. Ancak, bazı değerlendirmeler sistem yöneticisi ayrıcalıkları gerektirebilir. Bu değerlendirmeleri çalıştırmıyorsanız, CONTROL SERVER izinlerini kullanın.

  2. Örneke bağlanmak için kimlik bilgilerini sakla. Önceki adımda kullandığınız şifreyi değiştirin <password> .

    echo "assessmentLogin" > /var/opt/mssql/secrets/assessment
    echo "<password>" >> /var/opt/mssql/secrets/assessment
    
  3. Kimlik bilgilerine yalnızca mssql kullanıcının erişebilmesini sağlayarak yeni değerlendirme kimlik bilgilerinin güvenliğini sağlayın.

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

Değerlendirme betiğini indirme

Aşağıdaki örnek betik, önceki adımlarda oluşturduğunuz kimlik bilgilerini kullanarak SQL Değerlendirme API'sini çağırır. Betik, /var/opt/mssql/log/assessments dizininde JSON çıktısı oluşturur.

Not

SQL Değerlendirme API'si, CSV ve XML biçimlerinde de çıkış oluşturabilir.

Bu betik, GitHubüzerinden indirilebilir.

Bu dosyayı /opt/mssql/bin/runassessment.ps1olarak kaydedebilirsiniz.

[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
    }
}

Not

Bu betiği güvenilir ortamlarda çalıştırdığınızda ve oturum açma öncesi bir el sıkışma hatası alırsanız, kodda $serverName, $hostName ve Get-SqlInstance satırlarının komutlarına -TrustServerCertificate bayrağını ekleyin.

Değerlendirmeyi çalıştırma

  1. Kullanıcının scripte sahip olduğundan ve çalıştırabileceğinden emin mssql olun.

    chown mssql:mssql /opt/mssql/bin/runassessment.ps1
    chmod 700 /opt/mssql/bin/runassessment.ps1
    
  2. Bir log klasörü oluşturun ve kullanıcıya klasör için izinler verin mssql .

    mkdir /var/opt/mssql/log/assessments/
    chown mssql:mssql /var/opt/mssql/log/assessments/
    chmod 0700 /var/opt/mssql/log/assessments/
    
  3. Artık ilk değerlendirmenizi kullanıcı mssql olarak oluşturabilirsiniz. Bu kullanıcı olarak değerlendirmeler yapmak daha güvenlidir, özellikle sonraki değerlendirmeleri otomatik olarak veya cronsystemdüzerinden çalıştırdığınızda.

    su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"
    
  4. Komut bittiğinde, çıktıyı JSON formatında oluşturur. Bu çıktıyı, JSON dosyalarını ayrıştırmayı destekleyen herhangi bir araçla, Visual Studio Code dahil olmak üzere, kullanabilirsiniz.