Freigeben über


Die Hyper-V-Replikation wird beim Herunterfahren des Systems ausgesetzt.

Dieser Artikel hilft, das Problem zu lösen, bei dem die Hyper-V-Replikation unterbrochen wird, wenn der primäre Server oder der Replikat-Server heruntergefahren wird.

Die Hyper-V-Replikation wird ausgesetzt, wenn der Primärserver oder der Replikaserver heruntergefahren wird. Darüber hinaus zeichnet der Hyper-V Virtual Machine Management Service (VMMS) eine Reihe von Ereignisprotokollen mit Ereignis-IDs 32086 und 32022 auf.

  • Ereignis-ID 32086

    Log Name:  Microsoft-Windows-Hyper-V-VMMS/Admin
    Source:      Hyper-V-VMMS
    Event ID: 32086
    Level:  Error
    Description:  
    Hyper-V suspended replication for virtual machine <VM Name> due to a non-recoverable failure. Resume replication after correcting the failure. (Virtual machine ID <VM GUID>) 
    
  • Ereignis-ID 32022

    Log Name:  Microsoft-Windows-Hyper-V-VMMS/Admin
    Source:      Hyper-V-VMMS
    Event ID: 32022
    Level:  Error
    Description: 
    Hyper-V could not replicate changes for virtual machine <VM Name>: The operation has been canceled (0x80004004). (Virtual Machine ID <VM GUID>)
    

    Hinweis

    Die Beschreibung kann auch die Meldung "Vorgang wurde unterbrochen (0x80004004)" enthalten.

Dieses Problem tritt in Windows Server 2012 Standard, Windows Server 2012 Datacenter und Windows Server 2012 R2 Standard auf. Das Problem wurde in KB4088889 in Windows Server 2016 behoben.

Ursache: Hyper-V VMMS beendet die Ausgabe neuer Prozesse

Dieses Problem tritt auf, da Hyper-V VMMS keine neuen Prozesse mehr ausgibt. Wenn die primären und die Replikatserver heruntergefahren werden, beendet der Hyper-V VMMS die Ausgabe neuer Prozesse (Aufgaben). Wenn die unterschiedlichen Daten des Hyper-V-Replikaservers zu diesem Zeitpunkt eintreffen oder übertragen werden, kann der Übertragungs- oder Empfangsprozess nicht durchgeführt werden, und die Replikation kann ausgesetzt werden.

Problemumgehung 1: Replikation manuell neu starten

Sie können die virtuelle Maschine im Hyper-V Manager auswählen und gedrückt halten (oder mit der rechten Maustaste darauf klicken) und dann Replikation>fortsetzen, um die Replikation manuell fortzusetzen.

Umgehungslösung 2: Replikation automatisch mit einem Skript neu starten

Sie können auch ein Skript zum automatischen Neustart der Replikation im Aufgabenplaner festlegen, um die Replikation beim Systemstart automatisch neu zu starten.

Das Skript startet automatisch die Replikation neu, die zum Zeitpunkt des Systemneustarts oder Herunterfahrens angehalten wurde, und setzt die Replikation automatisch fort, wenn sie sich in einem angehaltenen Zustand befindet.

Führen Sie die folgenden Schritte sowohl auf dem primären Server als auch auf dem Replikatserver aus:

  1. Kopieren Sie das Skript für den automatischen Neustart der Replikation, und speichern Sie es in einem beliebigen Ordner (z. B. C:\Scripts) mit dem Dateinamen restartReplication.ps1.

  2. Starten Sie PowerShell, und führen Sie das folgende Cmdlet aus:

    PS > Set-ExecutionPolicy RemoteSigned
    

    Hinweis

    • Sie müssen das Cmdlet nicht auf einem System ausführen, das es bereits ausgeführt hat.
    • PowerShell kann standardmäßig nicht auf einem System gestartet werden, das noch nie PowerShell ausgeführt hat.
  3. Drücken Sie die Windows-Logo-Taste + X, um das Menü unten links auf dem Bildschirm anzuzeigen, und wählen Sie Computerverwaltung.

  4. Erweitern Sie den Aufgabenplaner im linken Bereich. Wählen Sie Taskplaner-Bibliothek aus und halten Sie gedrückt (oder klicken Sie mit der rechten Maustaste), und wählen Sie dann Task erstellen aus. Das Fenster zur Erstellung von Aufgaben wird angezeigt.

  5. Setzen Sie die folgenden Optionen auf der Registerkarte Allgemein:

    • Name: Geben Sie einen Vorgangsnamen an (z. B. Hyper-V Replikat-AutoResume-Aufgabe)
    • Wenn Sie die Aufgabe ausführen, verwenden Sie das folgende Benutzerkonto: Geben Sie ein Benutzerkonto mit Administratorrechten an (zum Beispiel, <Domänenname>\Administrator).
    • Run only when user is logged on: Deaktivieren Sie die Option
    • Unabhängig davon, ob der Benutzer angemeldet ist oder nicht ausführen: Option überprüfen
    • Run with highest privileges: Option auswählen
  6. Wählen Sie die Registerkarte Auslöser und dann Neu.

  7. Legen Sie die folgenden Optionen fest und wählen Sie dann OK:

    • Begin the task: Wählen Sie Beim Start
    • Erweiterte Einstellungen>Aktiviert: Option überprüfen

    Hinweis

    Die anderen Optionen sind nicht ausgewählt.

  8. Wählen Sie die Aktionen-Registerkarte und dann Neu aus.

  9. Legen Sie die folgenden Optionen fest und wählen Sie dann OK:

    • Aktion: Auswählen Ein Programm starten
    • Programm/Skript: powershell.exe eingeben
    • Add arguments (optional): Geben Sie den vollständigen Pfad des Auto-Restart-Skripts an (zum Beispiel C:\Scripts\restartReplication.ps1)
    • Start in (optional): Lassen Sie den Wert leer
  10. Lassen Sie die Standardeinstellungen auf den Registerkarten Bedingungen und Einstellungen unverändert und wählen Sie dann OK, um die Einstellungen abzuschließen.

Wenn die Authentifizierung auffordert, geben Sie das Administrator-Passwort ein.

Testen Sie den Betriebsstatus des Skripts

Nachdem Sie die Einstellungen für das Skript abgeschlossen haben, können Sie die folgenden Schritte ausführen, um den Betriebsstatus des Skripts auf dem primären Server zu testen.

  1. Wählen Sie die virtuelle Maschine aus, für die die Replikation im Hyper-V-Manager des primären Servers konfiguriert ist. Wählen Sie es aus und halten Sie es gedrückt (oder klicken Sie mit der rechten Maustaste darauf), und wählen Sie dann Replikation>Replikation anhalten, um es absichtlich zu unterbrechen.

  2. Wählen Sie die angehaltene virtuelle Maschine im Hyper-V Manager aus und dann die Registerkarte Replikation unten auf dem Bildschirm. Stellen Sie sicher, dass der ReplikationsstatusAngehalten ist.

  3. Starten Sie den primären Server neu. Wenn er nicht neu gestartet werden kann, starten Sie den Aufgabenplaner auf dem primären Server. Wählen Sie die oben erstellte Aufgabe aus und halten Sie sie gedrückt (oder führen Sie einen Rechtsklick aus), und wählen Sie dann Run.

  4. Das Skript wird ausgeführt, wenn das System gestartet wird oder eine manuelle Aufgabe ausgeführt wird. Um zu überprüfen, ob die Replikation automatisch neu gestartet wird, wählen Sie die angehaltene virtuelle Maschine aus dem Hyper-V-Manager auf dem primären Server aus und wählen Sie dann unten auf dem Bildschirm die Registerkarte Replikation aus. Wenn der Replikationsstatus auf Replikation aktiviert steht, hat die Replikation ihren normalen Betrieb wieder aufgenommen.

Sie können auch die Systemereignisprotokolle überprüfen, um den Betriebsstatus des Skripts zu bestätigen.

  • Ereignis zum Starten des Skripts

    Log Name: System
    Source:   Hyper-V Replica script  
    Event ID: 0
    Level:   Information
    Description:  
    Starting script to restart replication.
    
  • Ereignis zur Wiederaufnahme der Replikation

    Log Name: System
    Source:   Hyper-V Replica script   
    Event ID: 4
    Level:    Information
    Description:  
    Replication for <VM Name> on <Primary Server Name> was in suspended and resumed successfully.
    

Wenn ein Fehler wie ein Neustartfehler auftritt, wird der Fehlerinhalt im Systemereignisprotokoll mit einer Ereignisquelle namens "Hyper-V Replica-Skript" aufgezeichnet.

Skript zum automatischen Neustart der Replikation

Dies ist das Skript für den automatischen Neustart der Replikation:

$EventSource = "Hyper-V Replica script"  ### Event source name recorded in system log. 
$StartUpTimeout = 60                     ### Startup timeout value for replication service in second.
If ([System.Diagnostics.EventLog]::SourceExists($EventSource) -eq $false)
{
    New-EventLog -LogName System -Source $EventSource 
}
Write-EventLog -LogName System -Source $EventSource -EntryType Information -EventID 0 -Message "Starting script to restart replication."
### Wait until VMMS starts up.
(Get-Service "vmms").WaitForStatus("Running")  ### No timeout. 
### Wait until replication service in VMMS gets active.
$Count = 0
While((Get-VMReplication).count -eq 0) 
{
    Start-Sleep -s 1
    $Count++   
    If ($Count -eq $StartUpTimeout) 
    {
        Write-EventLog -LogName System -Source $EventSource -EntryType Error -EventID 1 -Message "VMMS did not complete initialization after VMMS service started up. Exiting..."
        Exit(1)
    }
}
$Message = "Replication service in VMMS was started successfully. It took " + $Count + " seconds after VMMS started."
Write-EventLog -LogName System -Source $EventSource -EntryType Information -EventID 2 -Message $Message
###
### MAIN
###
$LocalVMs = Get-VMReplication   ### Get local VMs with replication enabled.
Foreach($LocalVM in $LocalVMs) 
{
    $PrimaryServer = $LocalVM.PrimaryServer
    $VMName = $LocalVM.Name
    ### Get-VMReplication will access remote primary server if this VM is RecoveryVM.
    $VM = Get-VMReplication -ComputerName $PrimaryServer | Where-Object { $_.Name -eq $VMName}
    If ($VM -eq $null -or $VM.count -eq 0) 
    {
        $Message = "Get-VMReplication has failed." + $Error[0].Exception + "(VM: " + $VMName + " Server: " + $PrimaryServer + ")" 
        Write-EventLog -LogName System -Source $EventSource -EntryType Error -EventID 3 -Message $Message
        Exit(1)
    }
    ### If the VM is normal, move to next VM.
    If ($VM.State -ne "Suspended" -and $VM.State -ne "Error") { continue }  
    ### Resuming replication here.
    $Err = Resume-VMReplication -VMName $VMName -ComputerName $PrimaryServer 2>&1 
    ### Wait status update for 1 sec.
    Start-Sleep -s 1
    
    ### Checking the replication status after resuming the replication
    $CurrentVM = Get-VMReplication -ComputerName $PrimaryServer | Where-Object { $_.Name -eq $VMName}
    
    ### If the replication state is still in suspended or error, it logs to event service.
    If ($CurrentVM.State -eq "Suspended" -or $VM.State -eq "Error")
    {  
        $Message = "Failed to resume replication for " + $VMName + " on " + $PrimaryServer + ". Please check replication status manually."  + $Err.Exception
        Write-EventLog -LogName System -Source $EventSource -EntryType Error -EventID 3 -Message $Message
    } 
    Else 
    {
        $Message = "Replication for " + $VMName + " on " + $PrimaryServer + " was in suspended and resumed successfully."
        Write-EventLog -LogName System -Source $EventSource -EntryType Information -EventID 4 -Message $Message
    }
}