Could we help you? Please click the banners. We are young and desperately need the money
Veeam Backup & Replication 13.0.1 startet plötzlich nicht mehr korrekt, die Konsole kann sich nicht mit dem Backup-Server verbinden oder zentrale Veeam-Dienste bleiben nach einem Neustart gestoppt?
Genau dieses Verhalten ist bei mir inzwischen zweimal auf einem Windows-basierten Veeam Backup & Replication 13.0.1 Server aufgetreten. In beiden Fällen war die Lösung überraschend einfach: Zuerst musste der lokale PostgreSQL-Dienst wieder laufen. Anschliessend wurden die Veeam-Dienste kontrolliert neu gestartet.
Dieser Beitrag zeigt, warum PostgreSQL bei einer Veeam-Installation eine zentrale Rolle spielt, wie sich das Problem schnell diagnostizieren lässt und wie ein PowerShell-Skript die Wiederherstellung automatisiert. Das Skript benötigt kein Veeam PowerShell-Modul und arbeitet ausschliesslich mit den Windows-Diensten. Damit eignet es sich sowohl für Administratoren, die Veeam täglich betreuen, als auch für technisch interessierte Anwender, die einen ausgefallenen Backup-Server systematisch wieder in Betrieb nehmen müssen.
Wichtig: Es handelt sich hier um einen in meiner Umgebung zweimal erfolgreich eingesetzten Praxis-Fix. Daraus folgt nicht automatisch, dass Veeam Backup & Replication 13.0.1 generell einen bestätigten Produktfehler besitzt, durch den PostgreSQL beendet wird. Ein gestoppter oder nicht erreichbarer Datenbankdienst ist jedoch eine technisch plausible Ursache, weil Veeam seine Konfigurationsdatenbank für den Betrieb zentraler Dienste benötigt.
Der Fehler kann auf den ersten Blick wie ein reines Veeam-Serviceproblem aussehen. Besonders auffällig sind Situationen, in denen die Veeam Backup & Replication Console nicht mehr sauber verbindet, der VeeamBackupSvc nicht läuft oder mehrere Veeam-Dienste nach einem Serverstart im Status Stopped verbleiben.
Veeam dokumentiert selbst, dass die Konsole über den Veeam Backup Service mit dem Backup-Server kommuniziert. Kann dieser Dienst nicht starten, ist eine nicht erreichbare Konfigurationsdatenbank eine mögliche Ursache. Bei einer Windows-Installation von Veeam Backup & Replication kann diese Datenbank auf PostgreSQL oder Microsoft SQL Server liegen. Wird PostgreSQL lokal verwendet und dessen Windows-Dienst ist gestoppt, fehlt dem Veeam Backup Service eine wesentliche Grundlage für den Start.
VeeamBackupSvc ist gestoppt oder startet nicht zuverlässig.Veeam Backup & Replication speichert seine zentrale Konfiguration in einer Datenbank. Dazu gehören unter anderem Informationen über Jobs, Repositories, Infrastrukturkomponenten, Credentials-Referenzen und weitere Konfigurationsdaten. Bei Veeam Backup & Replication 13 auf Windows wird PostgreSQL offiziell als Konfigurationsdatenbank unterstützt und kann direkt durch das Veeam-Setup installiert werden.
Ist diese Datenbankinstanz nicht erreichbar, kann der zentrale Veeam Backup Service seine Konfiguration nicht vollständig laden. Genau deshalb sollte man bei einem vermeintlichen Veeam-Dienstproblem nicht nur die Dienste mit dem Namen Veeam* betrachten, sondern zuerst sicherstellen, dass der zugehörige PostgreSQL-Dienst tatsächlich läuft.
Die logische Startreihenfolge lautet daher:
Windows verwaltet einen Teil der Dienstabhängigkeiten selbst. Trotzdem ist es bei einer gestörten Installation sinnvoll, die Umgebung kontrolliert von unten nach oben neu aufzubauen, anstatt einzelne Dienste wahllos mit Restart zu bearbeiten.
Öffne PowerShell als Administrator und prüfe zunächst, ob auf dem Veeam-Server ein lokaler PostgreSQL-Dienst vorhanden ist:
Get-Service | Where-Object { $_.Name -match '(?i)postgres' -or $_.DisplayName -match '(?i)postgresql' }
Wird genau eine PostgreSQL-Instanz angezeigt und steht sie auf Stopped, kann sie mit dem tatsächlichen Dienstnamen gestartet werden:
Start-Service -Name "postgresql-x64-17"
Achtung: Der konkrete Dienstname kann je nach PostgreSQL-Version und Installation abweichen. Kopiere den Namen daher nicht blind. Zeigt der Server mehrere PostgreSQL-Instanzen, muss zuerst geklärt werden, welche Instanz die Veeam-Konfigurationsdatenbank hostet.
Verwendet die Veeam-Installation eine entfernte PostgreSQL-Datenbank oder Microsoft SQL Server, ist der lokale PostgreSQL-Schritt nicht anwendbar. In diesem Fall muss die Erreichbarkeit der tatsächlich konfigurierten Datenbank geprüft werden. Dafür stellt Veeam die Configuration Database Connection Utility bereit.
Das folgende Skript automatisiert den Recovery-Ablauf. Es prüft zuerst auf lokale PostgreSQL-Dienste. Wird genau einer gefunden, startet das Skript ihn bei Bedarf und wartet, bis der Status Running erreicht wurde. Bei mehreren PostgreSQL-Diensten wird aus Sicherheitsgründen abgebrochen.
Anschliessend ermittelt das Skript alle lokal installierten Veeam-Dienste. Neu gestartet werden Dienste, die zuvor liefen oder deren Windows-Startmodus auf automatisch steht. Dadurch werden auch automatisch konfigurierte Veeam-Dienste wieder aktiviert, die wegen der ausgefallenen Datenbank bereits vor Ausführung des Skripts gestoppt waren. Manuelle Dienste, die im normalen Betrieb nicht permanent laufen sollen, werden dagegen nicht pauschal erzwungen.
#requires -RunAsAdministrator
[CmdletBinding()]
param(
[ValidateRange(10, 300)]
[int]$TimeoutSeconds = 60
)
$ErrorActionPreference = 'Stop'
function Wait-ServiceState {
param(
[Parameter(Mandatory)]
[string]$Name,
[Parameter(Mandatory)]
[ValidateSet('Running', 'Stopped')]
[string]$State
)
$deadline = (Get-Date).AddSeconds($TimeoutSeconds)
do {
$service = Get-Service -Name $Name -ErrorAction Stop
if ($service.Status.ToString() -eq $State) {
return
}
Start-Sleep -Milliseconds 500
}
while ((Get-Date) -lt $deadline)
throw "Timeout: Dienst '$Name' erreicht Status '$State' nicht."
}
Write-Host "=== Veeam Service Recovery ===" -ForegroundColor Cyan
# 1. Lokale PostgreSQL-Dienste erkennen.
$postgresServices = @(
Get-Service | Where-Object {
$_.Name -match '(?i)postgres' -or
$_.DisplayName -match '(?i)postgresql'
}
)
if ($postgresServices.Count -eq 1) {
$postgres = $postgresServices[0]
if ($postgres.Status -ne 'Running') {
Write-Host "Starte PostgreSQL: $($postgres.Name)" -ForegroundColor Yellow
Start-Service -Name $postgres.Name
Wait-ServiceState -Name $postgres.Name -State 'Running'
}
Write-Host "PostgreSQL läuft: $($postgres.Name)" -ForegroundColor Green
}
elseif ($postgresServices.Count -gt 1) {
Write-Host "Mehrere PostgreSQL-Dienste gefunden:" -ForegroundColor Yellow
$postgresServices | Format-Table Name, DisplayName, Status -AutoSize
throw "Abbruch: Bitte zuerst prüfen, welche PostgreSQL-Instanz die Veeam-Konfigurationsdatenbank hostet."
}
else {
Write-Warning "Kein lokaler PostgreSQL-Dienst gefunden. Veeam verwendet möglicherweise eine Remote-Datenbank oder Microsoft SQL Server."
}
# 2. Installierte Veeam-Dienste und deren Startmodus erfassen.
$veeamCim = @(
Get-CimInstance Win32_Service | Where-Object {
$_.Name -like 'Veeam*' -or
$_.DisplayName -like 'Veeam*'
}
)
if ($veeamCim.Count -eq 0) {
throw "Keine lokalen Veeam-Dienste gefunden."
}
$veeamServices = @(
foreach ($item in $veeamCim) {
$service = Get-Service -Name $item.Name -ErrorAction SilentlyContinue
if ($null -ne $service) {
[pscustomobject]@{
Name = $service.Name
DisplayName = $service.DisplayName
Status = $service.Status
StartMode = $item.StartMode
}
}
}
)
# Dienste berücksichtigen, die vor dem Neustart liefen oder automatisch starten sollen.
$targets = @(
$veeamServices | Where-Object {
$_.Status -eq 'Running' -or $_.StartMode -eq 'Auto'
}
)
# Kleine Zahl = früh starten / spät stoppen.
$priority = @{
'VeeamDeploySvc' = 10
'VeeamMountSvc' = 20
'VeeamFilesysVssSvc' = 25
'VeeamCatalogSvc' = 30
'VeeamExplorersRecoverySvc' = 35
'VeeamBrokerSvc' = 40
'VeeamBackupUpdateSvc' = 45
'VeeamManagementAgentSvc' = 45
'VeeamBackupCdpSvc' = 50
'VeeamBackupSvc' = 60
'VeeamCloudSvc' = 70
'VeeamBackupRESTSvc' = 80
'VeeamWebSvc' = 90
}
function Get-Priority {
param([string]$Name)
if ($priority.ContainsKey($Name)) {
return $priority[$Name]
}
return 55
}
# 3. Laufende Veeam-Dienste von oben nach unten stoppen.
Write-Host "`nStoppe Veeam-Dienste ..." -ForegroundColor Cyan
$stopOrder = @(
$targets |
Where-Object { (Get-Service -Name $_.Name).Status -eq 'Running' } |
Sort-Object @{Expression = { Get-Priority $_.Name }; Descending = $true}, Name
)
foreach ($service in $stopOrder) {
Write-Host "Stoppe $($service.Name)"
Stop-Service -Name $service.Name -Force
Wait-ServiceState -Name $service.Name -State 'Stopped'
}
Start-Sleep -Seconds 2
# 4. Veeam-Dienste von unten nach oben starten.
Write-Host "`nStarte Veeam-Dienste ..." -ForegroundColor Cyan
$startOrder = @(
$targets |
Sort-Object @{Expression = { Get-Priority $_.Name }; Descending = $false}, Name
)
foreach ($service in $startOrder) {
$current = Get-Service -Name $service.Name
if ($current.Status -ne 'Running') {
Write-Host "Starte $($service.Name)"
Start-Service -Name $service.Name
Wait-ServiceState -Name $service.Name -State 'Running'
}
}
# 5. Endstatus anzeigen.
Write-Host "`n=== Endstatus ===" -ForegroundColor Cyan
$targets |
ForEach-Object { Get-Service -Name $_.Name } |
Sort-Object DisplayName |
Format-Table Status, Name, DisplayName -AutoSize
Write-Host "Veeam Service Recovery abgeschlossen." -ForegroundColor Green
Speichere den Code beispielsweise als Restart-VeeamPostgreSQLAndServices.ps1. Öffne danach eine PowerShell-Konsole mit Administratorrechten und starte das Skript:
.\Restart-VeeamPostgreSQLAndServices.ps1
Falls die lokale PowerShell-Ausführungsrichtlinie das Skript blockiert, kann es für diesen einzelnen Prozess ohne dauerhafte Änderung der Systemrichtlinie gestartet werden:
powershell.exe -ExecutionPolicy Bypass -File ".\Restart-VeeamPostgreSQLAndServices.ps1"
Das Starten und Stoppen von Windows-Systemdiensten benötigt administrative Rechte. Das Skript besitzt deshalb die PowerShell-Direktive #requires -RunAsAdministrator. Ohne erhöhte Rechte wird es nicht ausgeführt.
Das Skript stoppt zentrale Veeam-Dienste. Es sollte deshalb nur während eines Wartungsfensters beziehungsweise dann ausgeführt werden, wenn keine Backup-, Replication-, Restore- oder Tape-Operation aktiv sein soll. Ein laufender Job kann durch einen Dienststopp unterbrochen werden.
Der automatische PostgreSQL-Start ist für Veeam-Server gedacht, deren Konfigurationsdatenbank lokal auf PostgreSQL liegt. Nutzt die Umgebung eine Remote-Datenbank, muss deren Zustand separat geprüft werden. Bei mehreren lokalen PostgreSQL-Instanzen bricht das Skript absichtlich ab, anstatt eine beliebige Instanz zu starten.
Das Skript verwendet Get-Service, Start-Service, Stop-Service und Get-CimInstance. Es ist deshalb nicht vom Veeam PowerShell Snap-In oder einem zusätzlichen Modul abhängig. Voraussetzung ist lediglich eine moderne Windows-PowerShell-Umgebung, wie sie auf unterstützten Windows-Server-Versionen vorhanden ist.
Ein Windows-Neustart kann dieselbe Wirkung erzielen, ist aber nicht immer die beste erste Massnahme. Wenn PostgreSQL beim Booten nicht sauber verfügbar wird oder der Start einzelner Veeam-Dienste zu früh erfolgt, kann man nach einem Reboot wieder in derselben Situation landen. Der kontrollierte Service-Recovery-Prozess ist transparenter und zeigt direkt, welcher Dienst nicht startet.
| Methode | PostgreSQL wird geprüft | Kontrollierte Reihenfolge | Diagnosewert | Downtime |
|---|---|---|---|---|
| Dieses PowerShell-Skript | Ja | Ja | Hoch | Kurz |
| Dienste manuell in services.msc | Nur wenn daran gedacht wird | Fehleranfällig | Mittel | Kurz |
| Kompletter Windows-Reboot | Indirekt | Abhängig vom Autostart | Niedrig | Höher |
Der hier beschriebene Ablauf ist ein Betriebs- und Recovery-Fix, kein Ersatz für Produktupdates. Wer noch Veeam Backup & Replication 13.0.1 einsetzt, sollte nach Wiederherstellung des normalen Betriebs den aktuellen Veeam-Release- und Security-Stand prüfen. Veeam veröffentlicht regelmässig Updates mit Fehlerkorrekturen, Sicherheitskorrekturen und Funktionsverbesserungen.
Gerade Backup-Infrastruktur sollte sicherheitstechnisch besonders konservativ betrieben werden: aktuelle Veeam-Patches, aktuelles Windows-Patching, geschützte Management-Zugänge, getrennte Backup-Credentials und regelmässig geprüfte Configuration Backups gehören zur Basis.