Windows Server  ·  critical  ·  Failover clustering & Hyper-V

Hyper-V checkpoints will not merge, and the disk fills

Differencing disks are accumulating because a merge has not completed, and each one grows until the volume runs out.

What you see

The virtual machine folder is full of .avhdx files, the volume is filling, and the machine slows down. Deleting the checkpoint appears to do nothing.

What is actually wrong

A backup product that took a checkpoint and failed before removing it, a merge that cannot complete for lack of free space, or a chain that has grown too long to merge inside a maintenance window.

Codes and articles

avhdxmerge in progressEvent 19100Event 12290checkpoint stuck0x80070490

Fixes (2)

Free enough space for the merge to run
Elevated PowerShell on the host60 minuteshigh riskreversible

The volume is nearly full. A merge needs working space and will not start without it.

  1. Establish the size of the chain and the free space.

    PowerShell
    Get-VM | Get-VMHardDiskDrive | ForEach-Object { Get-VHD $_.Path } | Format-Table Path,VhdType,FileSize,Size,ParentPath -AutoSizeGet-Volume | Format-Table DriveLetter,FileSystemLabel,SizeRemaining,Size
  2. Do not delete .avhdx files by hand. They are a chain, and removing one destroys everything after it.

    This is the single most damaging thing that can be done in this situation, and it is a common instinct when a disk is full. Each differencing disk holds only the changes since its parent; deleting one in the middle makes the whole chain unrecoverable.

  3. Move something else off the volume — an ISO library, an old export, another virtual machine — to create room.

  4. Or move the virtual machine's storage to a volume with space, which can be done while it runs.

    PowerShell
    Move-VMStorage -VMName VM01 -DestinationStoragePath D:\VMs\VM01
  5. Then start the merge.

    PowerShell
    Get-VMSnapshot -VMName VM01 | Remove-VMSnapshotGet-VM VM01 | Format-List Name,Status
Confirm it workedThe chain collapses to a single VHDX and free space returns.
PowerShell
Get-VM VM01 | Get-VMHardDiskDrive | ForEach-Object { Get-VHD $_.Path } | Format-List Path,VhdType,ParentPath
If you need to undo itNone. Take a backup before starting if the data matters.
Complete the merge and stop it recurring
Elevated PowerShell1–6 hoursmedium riskreversible

There is space and the merge is stuck or has not started.

  1. List the checkpoints, including the ones a backup product created and hid.

    PowerShell
    Get-VMSnapshot -VMName VM01 -SnapshotType All | Format-Table Name,SnapshotType,CreationTime,ParentSnapshotName

    Recovery checkpoints created by a backup do not appear in the Hyper-V Manager tree in older versions. Listing all types is what reveals a chain that appears empty in the console.

  2. Remove them, which triggers the merge.

    PowerShell
    Get-VMSnapshot -VMName VM01 -SnapshotType All | Remove-VMSnapshot -Confirm:$false
  3. Watch the merge progress. It runs in the background and can take hours on a large chain.

    PowerShell
    Get-VM VM01 | Format-List Name,StatusGet-WinEvent -LogName 'Microsoft-Windows-Hyper-V-VMMS-Admin' -MaxEvents 20 | Format-Table TimeCreated,Id,Message -Wrap
  4. If the merge will not start, shut the virtual machine down and it will merge offline, which is faster and more reliable.

    PowerShell
    Stop-VM VM01Get-VMSnapshot -VMName VM01 -SnapshotType All | Remove-VMSnapshot
  5. If the chain is orphaned — the .avhdx files exist but Hyper-V has no checkpoint for them — reconnect them with Merge-VHD, working from the newest backwards.

    PowerShell
    Get-VHD 'D:\VMs\VM01\disk_ABC.avhdx' | Format-List Path,ParentPath,VhdTypeMerge-VHD -Path 'D:\VMs\VM01\disk_ABC.avhdx' -DestinationPath 'D:\VMs\VM01\disk.vhdx'
  6. Fix the backup product's configuration so checkpoints are removed after each job — an accumulating chain is always a symptom of that.

Confirm it workedThe virtual machine has a single VHDX with no parent and no checkpoints remain.
PowerShell
Get-VMSnapshot -VMName VM01 -SnapshotType AllGet-VM VM01 | Get-VMHardDiskDrive | ForEach-Object { Get-VHD $_.Path } | Format-List Path,VhdType,ParentPath
If you need to undo itBack up the whole virtual machine folder before merging; a failed merge is not reversible without it.

Where this stops. This write-up was written and checked by hand. It says what each step changes, how to confirm it worked and how to reverse it, and anything destructive is flagged before you reach it. If it does not match what your machine is doing, search the Support Centre for the exact code or message — and when something needs a person, get in touch.