Freigeben über


Verwenden der SQL-Bewertungs-API für SQL Server für Linux

Gilt für: SQL Server – Linux

Die API für die SQL-Bewertung bietet einen Mechanismus, um die Konfiguration der SQL Server-Instanz nach Best Practices zu bewerten. Die API umfasst einen vordefinierten Regelsatz, der vom SQL Server-Team empfohlene Best Practices enthält. Dieser Regelsatz wird mit der Veröffentlichung von neuen Versionen erweitert. Er ist praktisch, da Sie damit sicherstellen können, dass Ihre SQL Server-Konfiguration den empfohlenen Best Practices entspricht.

Der von Microsoft bereitgestellte Regelsatz ist auf GitHub verfügbar. Sie können den gesamten Regelsatz im Beispielrepository anzeigen.

In diesem Artikel werden zwei Möglichkeiten beschrieben, wie Sie die SQL-Bewertungs-API für SQL Server für Linux und Container ausführen können.

Erweiterung „SQL-Bewertung“ für Azure Data Studio (Vorschau)

Die Erweiterung „SQL-Bewertung“ für Azure Data Studio (Vorschau) bietet einen Mechanismus zum Auswerten der Konfiguration von SQL Server nach Best Practices.

Mit dieser Vorschauversion können Sie folgende Aktionen durchführen:

  • Bewerten einer Instanz von SQL Server, Azure SQL-Datenbank oder Azure SQL Managed Instance und der zugehörigen Datenbanken mit integrierten Regeln
  • Abrufen einer Liste aller integrierten Regeln, die für eine Instanz und deren Datenbanken gelten
  • Exportieren von Bewertungsergebnissen und der Liste der anwendbaren Regeln als Skript zum Speichern in einer SQL-Tabelle
  • Erstellen von HTML-Berichten zu Bewertungsergebnissen

Screenshot Erweiterung „SQL-Bewertung“ in Azure Data Studio

Starten einer SQL-Bewertung

  • Erweitern Sie nach der Installation der Erweiterung „SQL-Bewertung“ die Serverliste, klicken Sie mit der rechten Maustaste auf einen Server oder eine Datenbank, die Sie bewerten möchten, und wählen Sie Verwalten aus.
  • Wählen Sie dann im Abschnitt Allgemein die Option SQL-Bewertung aus. Wählen Sie auf der Registerkarte Bewertung die Option Bewertung aufrufen aus, um die Bewertung der ausgewählten SQL Server-Instanz oder Azure SQL-Datenbank-Instanz durchzuführen. Sobald die Ergebnisse verfügbar sind, können Sie die Filter- und Sortierfeatures verwenden.
  • Wählen Sie Als Skript exportieren aus, um die Ergebnisse im Format „In Tabelle einfügen“ zu erhalten. Sie können auch HTML-Bericht erstellen auswählen, um die Bewertungsergebnisse als HTML-Datei zu speichern. Einige Bewertungsregeln sind für bestimmte SQL Server-Konfigurationen vorgesehen, andere für andere Konfigurationen. Gleiches gilt für Datenbankregeln. Beispielsweise gibt es Regeln, die nur für SQL Server 2016 (13.x) oder die tempdb-Datenbank gelten.
  • Auf der Schaltfläche Anwendbare Regeln anzeigen werden die Bewertungsregeln angezeigt, die zum Durchführen der Bewertung Ihrer Server und Datenbanken verwendet werden, nachdem Sie Bewertung aufrufen ausgewählt haben. Um Informationen zu SQL Server und der SQL-Bewertungs-API anzuzeigen, wählen Sie Info aus. Die Ergebnisse der Bewertungssitzung können auf der Registerkarte Verlauf überprüft werden.

SQL-Bewertungs-API mit PowerShell

Eine zweite Option besteht darin, PowerShell zum Ausführen des SQL-Bewertungs-API-Skripts zu verwenden.

Voraussetzungen

  1. Stellen Sie sicher, dass Sie PowerShell unter Linux installieren.

  2. Installieren Sie das PowerShell-Modul SqlServer aus dem PowerShell-Katalog, das als mssql-Benutzer ausgeführt wird.

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

Einrichten der Bewertung

Die Ausgabe der SQL-Bewertungs-API ist im JSON-Format verfügbar. Sie müssen die folgenden Schritte ausführen, um die SQL-Bewertungs-API wie folgt zu konfigurieren:

  1. Erstellen Sie in der Instanz, die Sie bewerten möchten, mithilfe der SQL-Authentifizierung eine Anmeldung für SQL Server-Bewertungen. Sie können das folgende Transact-SQL-Skript (T-SQL) verwenden, um einen Anmeldenamen und ein sicheres Kennwort zu erstellen. Ersetzen Sie <secure_password> durch ein sicheres Kennwort Ihrer Wahl.

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

    Die CONTROL SERVER-Rolle funktioniert für die meisten Bewertungen. Es gibt jedoch einige Bewertungen, für die möglicherweise sysadmin-Berechtigungen erforderlich sind. Wenn Sie diese Regeln nicht ausführen, wird die Verwendung von CONTROL SERVER-Berechtigungen empfohlen.

  2. Speichern Sie wie folgt die Anmeldeinformationen für die Anmeldung auf dem System, und ersetzen Sie dabei <secure_password> erneut durch das Kennwort, das Sie im vorherigen Schritt verwendet haben.

    echo "assessmentLogin" > /var/opt/mssql/secrets/assessment
    echo "<secure_password>" >> /var/opt/mssql/secrets/assessment
    
  3. Sichern Sie die neuen Anmeldeinformationen für die Bewertung, indem Sie sicherstellen, dass nur der mssql-Benutzer auf die Anmeldeinformationen zugreifen kann.

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

Herunterladen des Bewertungsskripts

Im Folgenden finden Sie ein Beispielskript, das die SQL-Bewertungs-API mit den in den vorherigen Schritten erstellten Anmeldeinformationen aufruft. Das Skript generiert eine Ausgabedatei im JSON-Format an folgendem Speicherort: /var/opt/mssql/log/assessments.

Hinweis

Die SQL-Bewertungs-API kann auch Ausgaben in CSV- und XML-Formaten generieren.

Das Skript steht auf GitHub als Download zur Verfügung.

Sie können diese Datei als /opt/mssql/bin/runassessment.ps1 speichern.

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

Hinweis

Wenn Sie dieses Skript in vertrauenswürdigen Umgebungen ausführen und einen Pre-Login-Handshake-Fehler erhalten, fügen Sie das -TrustServerCertificate-Flag in den Befehlen für die Zeilen $serverName, $hostName und Get-SqlInstance im Code hinzu.

Ausführen der Bewertung

  1. Stellen Sie sicher, dass sich das Skript im Besitz von mssql befindet und auch von diesem Benutzer ausgeführt wird.

    chown mssql:mssql /opt/mssql/bin/runassessment.ps1
    chmod 700 /opt/mssql/bin/runassessment.ps1
    
  2. Erstellen Sie den Protokollordner, und weisen Sie dem Benutzer mssql die entsprechenden Berechtigungen für den Ordner zu:

    mkdir /var/opt/mssql/log/assessments/
    chown mssql:mssql /var/opt/mssql/log/assessments/
    chmod 0700 /var/opt/mssql/log/assessments/
    
  3. Sie können jetzt Ihre erste Bewertung erstellen, aber stellen Sie aber sicher, dass Sie dies als mssql-Benutzer tun, damit nachfolgende Bewertungen automatisch sicherer über cron oder systemd ausgeführt werden können.

    su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"
    
  4. Nach Abschluss des Befehls wird die Ausgabe im JSON-Format generiert. Diese Ausgabe kann mit jedem Tool integriert werden, das das Analysieren von JSON-Dateien unterstützt. Ein solches Beispieltool ist Red Hat Insights.