Menü schliessen

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.

Typische Symptome: Veeam-Konsole verbindet nicht oder Dienste starten nicht

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.

  • Die Veeam-Konsole kann den Backup-Server nicht erreichen.
  • VeeamBackupSvc ist gestoppt oder startet nicht zuverlässig.
  • REST- oder Web-Dienste funktionieren nicht.
  • Mehrere Veeam-Dienste stehen nach einem Neustart auf Stopped.
  • Ein kompletter Windows-Neustart hilft nicht dauerhaft oder nur sporadisch.
  • Im Veeam-Service-Log erscheinen Hinweise auf eine nicht erreichbare Konfigurationsdatenbank.

Warum PostgreSQL vor den Veeam-Diensten laufen muss

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:

  1. PostgreSQL-Konfigurationsdatenbank verfügbar machen.
  2. Basis- und Infrastruktur-Dienste von Veeam starten.
  3. Den zentralen Veeam Backup Service starten.
  4. Darauf aufbauende REST-, Cloud- und Web-Dienste starten.

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.

Schnelldiagnose: Läuft der PostgreSQL-Dienst?

Ö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.

PowerShell-Skript: PostgreSQL prüfen und Veeam-Dienste sauber neu starten

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

So wird das Skript ausgeführt

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"

 

Welche Voraussetzungen und Abhängigkeiten gibt es?

Administratorrechte unter Windows

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.

Keine aktiven Backup- oder Restore-Jobs

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.

Lokale PostgreSQL-Konfiguration

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.

Kein Veeam PowerShell-Modul erforderlich

Das Skript verwendet Get-ServiceStart-ServiceStop-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.

Warum nicht einfach den kompletten Veeam-Server neu starten?

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

 

Veeam 13.0.1 aktualisieren: Recovery-Fix ersetzt kein Update

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.