Veeam VM checkpoint restore hanging at 99%
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)
- 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_nameto get the VM ID, thenvim-cmd vmsvc/snapshot.get vm_id. If a snapshot exists, remove it manually usingvim-cmd vmsvc/snapshot.removeall vm_id. - 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:
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.ctkEnabled = "FALSE" - Check for file locks — On the ESXi host, run
esxcli storage vmfs file list | grep your_vm_name.vmdk. If you see a lock, runesxcli storage vmfs file lock listto 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. - 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?