Veeam VM checkpoint restore hanging at 99%

Server & Cloud Intermediate 👁 11 views 📅 Jun 15, 2026

When restoring a VM checkpoint in Veeam, the restore hangs at 99% or fails with incomplete status. Usually caused by a locked VMDK file or mismatched CBT data.

When this error shows up

You're in the Veeam console, restoring a VM from a backup taken maybe 3 hours ago. The bar creeps up to 99% and just sits there. After 20 minutes, Veeam throws a warning: "Restore completed with incomplete status." The VM boots, but something's off — maybe network config is missing, or a service won't start. I've seen this exact thing at a law firm last month where a restored domain controller wouldn't replicate because the checkpoint restore never finished writing the AD database file.

What's really going on

Veeam uses VMware snapshots (checkpoints) to capture a consistent VM state. During restore, it replays those checkpoint files — the delta disks — back onto the base VMDK. At 99%, it's finalizing the merge. Two things usually cause the hang:

  • Locked VMDK file — another process (like a backup job, a storage vMotion, or even a third-party antivirus scan) has a lock on the virtual disk file. Veeam can't finish writing.
  • CBT (Changed Block Tracking) mismatch — if the VM's CBT data is stale or corrupted, Veeam's restore engine can't reconcile the block mapping, so it stalls at the last block.

The fix (in order)

  1. Kill the restore, but don't panic — Cancel the job in Veeam. Don't restart it yet. On the ESXi host, find the VM and check for any orphaned snapshot files. Run vim-cmd vmsvc/getallvms | grep your_vm_name to get the VM ID, then vim-cmd vmsvc/snapshot.get vm_id. If a snapshot exists, remove it manually using vim-cmd vmsvc/snapshot.removeall vm_id.
  2. Reset CBT on the VM — This is the most common fix. Power off the target VM (the one you restored). On the datastore, locate the VM's .vmx file. Edit it with a text editor (SSH to the host or use vCenter's datastore browser). Add this line at the end:
    ctkEnabled = "FALSE"
    Save and power on the VM. Wait 5 minutes, then power it off again. Remove that line from the .vmx file, save, and power back on. This clears the old CBT tracking data.
  3. Check for file locks — On the ESXi host, run esxcli storage vmfs file list | grep your_vm_name.vmdk. If you see a lock, run esxcli storage vmfs file lock list to see which host holds it. If it's a stale lock from a previous failed job, force-reregister the VM or reboot the host if you have a maintenance window. But check — reboot kills running VMs on that host.
  4. Re-run the restore with a different network — In the Veeam restore wizard, under Network, select "Restore VM to a different network" but then choose the same network. Sounds dumb, but this forces Veeam to re-allocate a new MAC address, which can break the lock on the NIC configuration file. I've had this work on three separate occasions.

If it still fails

You're probably dealing with a corrupt backup file. Try restoring to a different datastore entirely — pick a host that's not in the same cluster. If that works, the problem is storage-level (maybe a snapshot consolidation that was interrupted on the original datastore). If it still fails, validate the backup restore point by running a SureBackup job from that same restore point. If SureBackup fails, the backup itself is bad — you'll need to fall back to an earlier restore point or a different backup method.

Pro tip: I always run a CBT reset before a major restore, even if I don't see the 99% hang. It saves 30 minutes of troubleshooting later.

Was this solution helpful?