SQL Assessment API használata Linuxon futó SQL Serverhez

A következőkre vonatkozik:SQL Server Linux rendszeren

Az SQL Assessment API egy olyan mechanizmust biztosít, amely kiértékeli az SQL Server konfigurációját az ajánlott eljárásokhoz. Az API egy szabálykészlettel érkezik, amely az SQL Server csapata által ajánlott ajánlott eljárásokat tartalmazza. Ez a szabálykészlet az új verziók kiadásával bővül. Érdemes meggyőződni arról, hogy az SQL Server konfigurációja összhangban van az ajánlott eljárásokkal.

A Microsoft kiszállított szabálykészlete elérhető a GitHubon. A teljes szabálykészletet megtekintheti a mintaadattárban.

Ebben a cikkben két módot vizsgálunk meg az SQL Assessment API futtatására az SQL Serveren Linuxon és konténereken.

SQL Assessment-bővítmény az Azure Data Studióhoz (előzetes verzió)

Az Azure Data Studio SQL Assessment bővítménye (előzetes verzió) egy mechanizmust biztosít az SQL Server konfigurálásának értékeléséhez az ajánlott eljárásokhoz.

Ezzel az előzetes verzióval a következőt teheti:

  • A beépített szabályok segítségével értékelje a SQL Server-t, az Azure SQL-adatbázist vagy a felügyelt Azure SQL-példányt és azok adatbázisait.
  • Egy példányra és annak adatbázisára vonatkozó összes beépített szabály listájának lekérése
  • Kiértékelési eredmények exportálása és az alkalmazandó szabályok listája szkriptként az SQL-táblában való tároláshoz
  • HTML-jelentések létrehozása az értékelések eredményeiről

Képernyőkép az SQL Assessment-bővítményről az Azure Data Studióban.

SQL-felmérés indítása

  • Az SQL Assessment bővítmény telepítése után bontsa ki a kiszolgálólistát, kattintson a jobb gombbal egy kiértékelni kívánt kiszolgálóra vagy adatbázisra, és válassza kezelése lehetőséget.
  • Ezután az Általános szakaszban válassza SQL Assessmentlehetőséget. Az Értékelés lapon válassza a Felmérés meghívása lehetőséget a kiválasztott SQL Server vagy Azure SQL-adatbázis kiértékeléséhez. Miután az eredmények elérhetővé válnak, használhatja a szűrési és rendezési funkciókat.
  • Válassza a Szkriptként exportálás lehetőséget, hogy az eredményeket beszúró táblázatformátumban kapja meg. Az értékelési eredmények HTML-fájlként való mentéséhez HTML-jelentés létrehozása is kiválasztható. Egyes értékelési szabályok bizonyos SQL Server-konfigurációkra, másokra vonatkoznak. Ugyanez igaz az adatbázisszabályokra is. Vannak például olyan szabályok, amelyek csak az SQL Server 2016 -ra (13.x) vagy a tempdb-adatbázisra vonatkoznak.
  • A Vonatkozó szabályok megtekintése gomb megjeleníti a kiszolgálók és adatbázisok értékeléséhez használt értékelési szabályokat, miután kiválasztotta Az értékelés meghívásalehetőséget. Az SQL Server és az SQL Assessment API adatainak megtekintéséhez válassza Információlehetőséget. Az értékelési munkamenet eredményei az Előzmények lapon tekinthetők meg.

SQL Assessment API PowerShell segítségével

A második lehetőség a PowerShell használata az SQL Assessment API-szkript futtatásához.

Előfeltételek

  1. Győződjön meg arról, hogy a PowerShellt telepíti Linuxra.

  2. Telepítse a SqlServer PowerShell-modult a PowerShell-katalógusból, amely mssql felhasználóként fut.

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

Az értékelés beállítása

Az SQL Assessment API kimenete JSON formátumban érhető el. Az SQL Assessment API konfigurálásához az alábbi lépéseket kell végrehajtania:

  1. Az Ön által értékelni kívánt példányban hozzon létre egy bejelentkezést az SQL Server értékeléséhez az SQL hitelesítés használatával. A következő Transact-SQL (T-SQL) szkripttel hozhat létre bejelentkezést és erős jelszót. A jelszónak az SQL Server alapértelmezett jelszóházirendetkell követnie. Alapértelmezés szerint a jelszónak legalább nyolc karakter hosszúnak kell lennie, és a következő négy készletből három karakterből kell állnia: nagybetűk, kisbetűk, 10 számjegyből és szimbólumokból. A jelszavak legfeljebb 128 karakter hosszúak lehetnek. Használjon olyan jelszavakat, amelyek a lehető legkomplexebbek és hosszúak.

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

    A CONTROL SERVER szerepkör a legtöbb értékelésnél működik. Vannak azonban olyan értékelések, amelyekhez sysadmin jogosultságokra lehet szükség. Ha nem futtatja ezeket a szabályokat, akkor az CONTROL SERVER engedélyek használatát javasoljuk.

  2. A bejelentkezéshez használt hitelesítő adatokat az alábbiak szerint tárolja, és cserélje le ismét a <password> az előző lépésben használt jelszóra.

    echo "assessmentLogin" > /var/opt/mssql/secrets/assessment
    echo "<password>" >> /var/opt/mssql/secrets/assessment
    
  3. Az új értékelési hitelesítő adatok védelméhez biztosíthatja, hogy csak a mssql felhasználó férhessen hozzá a hitelesítő adatokhoz.

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

Az értékelési szkript letöltése

Az alábbi példaszkript meghívja az SQL Assessment API-t az előző lépésekben létrehozott hitelesítő adatok használatával. A szkript létrehoz egy kimeneti fájlt JSON formátumban ezen a helyen: /var/opt/mssql/log/assessments.

Jegyzet

Az SQL Assessment API CSV- és XML-formátumban is képes kimenetet létrehozni.

Ez a szkript letölthető GitHub.

Ezt a fájlt /opt/mssql/bin/runassessment.ps1ként mentheti.

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

Jegyzet

Ha megbízható környezetben futtatja ezt a szkriptet, és prelogin kézfogási hibát kap, adja hozzá a -TrustServerCertificate jelzőt a kód $serverName, $hostName és Get-SqlInstance sorainak parancsaihoz.

Hajtsa végre az értékelést

  1. Győződjön meg arról, hogy a szkript mssqltulajdonában van és végrehajtható.

    chown mssql:mssql /opt/mssql/bin/runassessment.ps1
    chmod 700 /opt/mssql/bin/runassessment.ps1
    
  2. Hozzon létre naplómappát, és rendelje hozzá a megfelelő engedélyeket a mssql felhasználóhoz a mappában:

    mkdir /var/opt/mssql/log/assessments/
    chown mssql:mssql /var/opt/mssql/log/assessments/
    chmod 0700 /var/opt/mssql/log/assessments/
    
  3. Most már létrehozhatja az első értékelést, de győződjön meg róla, hogy ezt mssql felhasználóként teszi, így a későbbi értékelések automatikusan futtathatók cron vagy systemd biztonságosabban.

    su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"
    
  4. A parancs befejeződése után a kimenet JSON formátumban jön létre. Ez a kimenet bármilyen olyan eszközzel integrálható, amely támogatja a JSON-fájlok elemzését. Az egyik ilyen példaeszköz a Red Hat Insights .