Problembehandlung bei der Azure-Erweiterung für SQL Server
Gilt für: SQL Server
Fragen Sie Azure Resource Graph ab, um den Zustand der Azure-Erweiterung für SQL Server auf Ihren Azure Arc-fähigen Servern zu identifizieren. In diesem Artikel werden Abfragen veranschaulicht, die fehlerhafte Erweiterungen identifizieren.
Tipp
Wenn Sie damit noch nicht vertraut sind, sollten Sie sich über Azure Resource Graph informieren:
Ermitteln fehlerhafter Erweiterungen
Diese Abfrage gibt Instanzen von SQL Server auf Servern zurück, auf denen Erweiterungen installiert, aber nicht fehlerfrei sind. Die Datumsangaben werden in der Abfrage hartcodiert. Die Abfrage gibt Ressourcen zurück, bei denen Erweiterungen einen fehlerhaften Status aufweisen oder der Zeitpunkt des letzten Uploads der Erweiterung nicht im Mai 2024 (2024/05
) oder Juni 2024 (2024/06
) liegt. Ersetzen Sie diese Datumsangaben durch jene für Ihre Ressourcen.
resources
| where type == "microsoft.hybridcompute/machines/extensions"
| where properties.type in ("WindowsAgent.SqlServer","LinuxAgent.SqlServer")
| where properties.instanceView.status.message !contains "SQL Server Extension Agent: Healthy" or (properties.instanceView.status.message !contains "timestampUTC : 2024/05" and properties.instanceView.status.message !contains "timestampUTC : 2024/06") or properties.instanceView.status.message !contains "uploadStatus : OK"
| project id, resourceGroup, subscriptionId,
ExtensionHealth = iif(properties.instanceView.status.message !contains "SQL Server Extension Agent: Healthy", "Unhealthy", "Healthy"),
LastUploadTimestamp = iif(indexof(properties.instanceView.status.message,"timestampUTC : ") > 0, iif(properties.instanceView.status.message !contains "timestampUTC : 2024/06", substring(properties.instanceView.status.message,indexof(properties.instanceView.status.message,"timestampUTC : ") + 15, 10),"Recent"),"no timestamp"),
LastUploadStatus = iif(indexof(properties.instanceView.status.message,"uploadStatus : OK") > 0, "OK", "Unhealthy"),
Message = properties.instanceView.status.message
Überprüfen Sie den Wert in der Eigenschaft Nachricht in den Abfrageergebnissen, um mögliche spezifische Probleme zu ermitteln.
Ermitteln einer fehlerhaften Erweiterung (PowerShell)
Dieses Beispiel wird in PowerShell ausgeführt. PowerShell ermöglicht eine Ausführung mit Datumsangaben, die nicht hartcodiert sind. Das Beispiel gibt Ressourcen zurück, bei denen Erweiterungen einen fehlerhaften Status aufweisen oder der Zeitpunkt des letzten Uploads der Erweiterung nicht im laufenden Monat oder im Vormonat liegt.
# PowerShell script to execute an Azure Resource Graph query using Azure CLI
# where the extension status is unhealthy or the extension last upload time isn't in this month or the previous month.
# Requires the Az.ResourceGraph PowerShell module
# Login to Azure if needed
#az login
$currentYear = (Get-Date).Year
$currentMonth = "{0:D2}" -f (Get-Date).Month
$previousMonth = "{0:D2}" -f ((Get-Date).Month-1)
$currentDay = "{0:D2}" -f (Get-Date).Day
$currentYearMonth = "$currentYear/$currentMonth"
$previousYearMonth = "$currentYear/$previousMonth"
$currentDate = "$currentYear/$currentMonth/$currentDay"
# Define the Azure Resource Graph query
$query = @"
Resources
| where type == 'microsoft.hybridcompute/machines/extensions'
| where properties.type in ('WindowsAgent.SqlServer','LinuxAgent.SqlServer')
| where properties.instanceView.status.message !contains 'SQL Server Extension Agent: Healthy'
or (properties.instanceView.status.message !contains 'timestampUTC : $previousYearMonth'
and properties.instanceView.status.message !contains 'timestampUTC : $currentYearMonth')
or properties.instanceView.status.message !contains 'uploadStatus : OK'
| project id, resourceGroup, subscriptionId,
ExtensionHealth = iif(properties.instanceView.status.message !contains 'SQL Server Extension Agent: Healthy', 'Unhealthy', 'Healthy'),
LastUploadTimestamp = iif(indexof(properties.instanceView.status.message,'timestampUTC : ') > 0, iif(properties.instanceView.status.message !contains 'timestampUTC : $currentYearMonth', substring(properties.instanceView.status.message,indexof(properties.instanceView.status.message,'timestampUTC : ') + 15, 10),'Recent'),'no timestamp'),
LastUploadStatus = iif(indexof(properties.instanceView.status.message,'uploadStatus : OK') > 0, 'OK', 'Unhealthy'),
Message = properties.instanceView.status.message
"@
# Execute the Azure Resource Graph query
$result = Search-AzGraph -Query $query
# Output the results
$result | Format-Table -Property ExtensionHealth, LastUploadTimestamp, LastUploadStatus, Message
Überprüfen Sie den Wert in der Spalte Nachricht in den Ergebnissen, um mögliche spezifische Probleme zu ermitteln.
Identifizieren fehlender Updates für Erweiterungen
Identifizieren Sie Erweiterungen, die den Status kürzlich nicht aktualisiert haben. Diese Abfrage gibt eine Liste der Azure-Erweiterungen für SQL Server zurück, die nach der Anzahl der Tage seit der letzten Aktualisierung der Erweiterung ihren Status sortiert haben. Ein Wert von „-1“ gibt an, dass die Erweiterung abgestürzt ist und ein Callstack im Erweiterungsstatus vorhanden ist.
// Show the timestamp extracted
// If an extension has crashed (i.e. no heartbeat), fill timestamp with "1900/01/01, 00:00:00.000"
//
resources
| where type =~ 'microsoft.hybridcompute/machines/extensions'
| extend extensionStatus = parse_json(properties).instanceView.status.message
| extend timestampExtracted = extract(@"timestampUTC\s*:\s*(\d{4}/\d{2}/\d{2}, \d{2}:\d{2}:\d{2}\.\d{3})", 1, tostring(extensionStatus))
| extend timestampNullFilled = iff(isnull(timestampExtracted) or timestampExtracted == "", "1900/01/01, 00:00:00.000", timestampExtracted)
| extend timestampKustoFormattedString = strcat(replace(",", "", replace("/", "-", replace("/", "-", timestampNullFilled))), "Z")
| extend agentHeartbeatUtcTimestamp = todatetime(timestampKustoFormattedString)
| extend agentHeartbeatLagInDays = datetime_diff('day', now(), agentHeartbeatUtcTimestamp)
| project id, extensionStatus, agentHeartbeatUtcTimestamp, agentHeartbeatLagInDays
| limit 100
| order by ['agentHeartbeatLagInDays'] asc
Diese Abfrage gibt die Anzahl der Erweiterungen zurück, die nach der Anzahl der Tage gruppiert sind, seit die Erweiterung ihren Status zuletzt aktualisiert hat. Ein Wert von „-1“ gibt an, dass die Erweiterung abgestürzt ist und ein Callstack im Erweiterungsstatus vorhanden ist.
// Aggregate by timestamp
//
// -1: Crashed extension with no heartbeat, we got a stacktrace instead
// 0: Healthy
// >1: Stale/Offline
//
resources
| where type =~ 'microsoft.hybridcompute/machines/extensions'
| extend extensionStatus = parse_json(properties).instanceView.status.message
| extend timestampExtracted = extract(@"timestampUTC\s*:\s*(\d{4}/\d{2}/\d{2}, \d{2}:\d{2}:\d{2}\.\d{3})", 1, tostring(extensionStatus))
| extend timestampNullFilled = iff(isnull(timestampExtracted) or timestampExtracted == "", "1900/01/01, 00:00:00.000", timestampExtracted)
| extend timestampKustoFormattedString = strcat(replace(",", "", replace("/", "-", replace("/", "-", timestampNullFilled))), "Z")
| extend agentHeartbeatUtcTimestamp = todatetime(timestampKustoFormattedString)
| extend agentHeartbeatLagInDays = iff(agentHeartbeatUtcTimestamp == todatetime("1900/01/01, 00:00:00.000Z"), -1, datetime_diff('day', now(), agentHeartbeatUtcTimestamp))
| summarize numExtensions = count() by agentHeartbeatLagInDays
| order by numExtensions desc