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
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
Stellen Sie sicher, dass Sie PowerShell unter Linux installieren.
Installieren Sie das PowerShell-Modul
SqlServer
aus dem PowerShell-Katalog, das alsmssql
-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:
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 vonCONTROL SERVER
-Berechtigungen empfohlen.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
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
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
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/
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 übercron
odersystemd
ausgeführt werden können.su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"
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.