Storage & Backup

PBS Retention and Garbage Collection: Why Space Stays Used

Shared chunks survive pruning. Only unreferenced chunks become candidates for later GC.
Shared chunks survive pruning. Only unreferenced chunks become candidates for later GC.
Old snapshot S1 references chunks A, B and C; retained S2 references A, B and D. Pruning S1 leaves shared A and B needed by S2. Only C becomes unreferenced and can be reclaimed after the GC cutoff allows it.
Shared chunks survive pruning. Only unreferenced chunks become candidates for later GC.Original Boxvirt conceptual diagram. Documentation and illustrative calculations; no operational test results. View full size ↗

Deleting a backup in Proxmox Backup Server removes its snapshot metadata. The underlying data chunks may still be needed by another backup. Garbage collection (GC) separately finds unreferenced chunks and removes them when its safety cutoff permits. A successful prune job therefore need not produce an immediate increase in free space.

Diagnose the result in this order: did retention remove the intended snapshot, is its data still referenced, has GC completed, and are removals pending? Deleting more recovery points before answering those questions can lose useful history without solving the space problem.

This guide assumes an existing local filesystem-backed PBS datastore, a backup group and permission to inspect them. S3-backed and removable datastores need their own backend-specific checks. For installation, credentials, encryption and a first restore, start with PBS setup.

Validation: official PBS documentation labeled 4.2.9-1 was reviewed on November 9, 2026. No backup deletion or GC run was performed. Calendar entries, chunk labels and sizes below are models, not results from a datastore.

Retention, prune and GC answer different questions

Operation or viewWhat it tells you
Retention policyWhich recovery points should remain?
Prune previewWhich existing snapshots would the policy retain or remove?
Prune executionWhich snapshot metadata was actually removed?
GC taskWhich data chunks are unreferenced and eligible for removal?
Datastore filesystem usageHow much space is currently occupied or available on that filesystem?
Restore testCan a retained recovery point recover the application?

PBS stores backup data as chunks referenced through snapshot indexes. Reuse of a chunk by several snapshots is part of deduplication; snapshots are not independent full-size files whose lengths can simply be subtracted from filesystem usage. The technical overview describes the chunk and index model.

1. Decide which history you need before previewing deletion

Record the datastore, namespace, backup group, desired recovery history and who controls pruning. Retention applies to each backup group’s history; keep-daily: 3 is not a three-snapshot budget for an entire server.

Choose one clear policy owner for the example, a PBS-side prune job. Inspect any PVE backup-job or storage-side pruning settings as well. An additional deletion path can remove a recovery point before the PBS policy would have done so. Retention cannot recreate snapshots already deleted elsewhere.

Also check protected snapshots, incomplete backups and timestamps before interpreting the count. They can differ from the simple complete, unprotected, past-dated snapshots used below. Inspect clock configuration if future-dated snapshots appear; the maintenance manual says they are retained rather than processed as ordinary older snapshots.

A five-snapshot calendar with a missing day

Assume one group vm/201 has exactly these five complete, unprotected snapshots. They are all in the same namespace; the evaluation happens after the latest snapshot. Times are UTC, as indicated by Z, and all belong to the displayed calendar dates in this example.

Set only keep-daily: 3. Other retention options are unset:

Snapshot timestampResult in this modelReason
2026-11-09T08:00:00ZKeepLatest backup in the newest represented day
2026-11-09T02:00:00ZRemoveOlder backup from the same day
2026-11-08T02:00:00ZKeepLatest backup in the second represented day
2026-11-06T02:00:00ZKeepThird represented day; November 7 has no backup
2026-11-02T02:00:00ZRemoveOlder than the three selected represented days

This keeps three snapshots but spans four calendar dates from November 6 through November 9. It does not create a missing November 7 recovery point. It also removes the older same-day snapshot: daily retention is not the same as keeping every snapshot made during three days.

When combining keep-last, hourly, daily, weekly, monthly and yearly rules, PBS processes them in the documented order and applies later rules to older history beyond the periods already covered. Do not add the setting values and advertise the sum as a guaranteed copy count. Use the actual history in the prune simulator and the real group’s preview; missing periods and extra manual backups matter.

2. Preview the exact group and namespace

In PBS, select the intended datastore and namespace. In Content, inspect the group and use its prune action to review the keep/remove decisions before confirming anything. Compare the timestamps with your required recovery points. Do not change protection flags just to make the preview match a target count.

For a CLI preview, the backup-client reference documents prune, --dry-run, repository and namespace options. From an administrative client with appropriate existing access:

proxmox-backup-client prune vm/201 --repository 'operator@[email protected]:lab-backups' --ns lab --keep-daily 3 --dry-run true

pbs.example.net, lab-backups, lab, operator@pbs and vm/201 are illustrative identifiers. Replace them together with the verified target. This example is for a group in the lab namespace; for the root namespace, omit --ns lab deliberately. Keep the normal TLS verification and use an already trusted server identity. Do not place a password or API-token secret in the command line or disable certificate checks.

Review the complete output and command status. A permissions failure, empty selection or wrong namespace does not establish that retention is correct. Use an account authorized for this pruning scope; a token suitable for creating backups is not automatically authorized to delete any group’s snapshots. Keep the preview and target identifiers in your maintenance record.

This command is intentionally a dry run. Execute pruning only after matching the real preview to the recovery policy, using the reviewed scope in the GUI or an explicitly reviewed PBS prune job. Start with a small disposable group before enabling broader scheduled deletion. No schedule is installed by this article.

3. Check what pruning actually removed

After the approved prune runs, inspect its task log and refresh the same group in Content. Check that the intended snapshots disappeared and that the required newest and older recovery points remain.

Snapshot count and filesystem space are separate observations. In a symbolic example, let every chunk have a physical payload of exactly 4 MiB, with compression and overhead deliberately excluded:

SnapshotReferenced chunksAction
Old S1A, B, CPrune
New S2A, B, DKeep

Before pruning, the union is A, B, C and D: 16 MiB of modeled payload. After removing S1’s metadata, S2 still needs A, B and D: 12 MiB. Only C’s 4 MiB becomes a potential GC removal. Removing a snapshot that references 12 MiB therefore does not necessarily free 12 MiB.

If all of S1’s chunks were also referenced by S2, potential payload reclamation would be zero. Real datastore metadata, compression, other groups and active backups make filesystem accounting more complex than this example. Use the retention capacity model for planning assumptions, rather than interpreting this illustration as a dedup ratio.

4. Run GC and read its completed task

In the datastore’s Prune & GC view, inspect the previous GC result and start a new run when appropriate for the datastore’s workload. GC works on the whole datastore, including references outside the one group or namespace you just pruned.

On the PBS server as an authorized administrator, the documented CLI equivalents for the illustrative lab-backups datastore are:

proxmox-backup-manager garbage-collection status lab-backups
proxmox-backup-manager garbage-collection start lab-backups
proxmox-backup-manager garbage-collection status lab-backups

Starting a task is not evidence of completion. Follow its task log through the final status, preserve errors, and read the completed run’s removed-data and pending-removal figures. The manager reference defines these commands.

GC marks data still referenced by snapshot indexes, then sweeps chunks subject to an access-time cutoff. Under the documented default behavior, that cutoff accounts for a 24-hour-and-5-minute safety interval and the oldest active backup writer when relevant. This is not a promise to release space exactly 24 hours and 5 minutes after clicking Delete.

Chunks recorded as Pending removals were not eligible for deletion in that run. Once the relevant cutoff allows removal, a subsequent successful GC is still needed. Record the run’s start time, any active writer and its pending total before deciding whether the result is unexpected. The maintenance documentation explains the access-time behavior.

PBS exposes datastore tuning options affecting GC timing and checks. Leave them at their documented defaults for this procedure; reducing the cutoff, disabling the access-time safety check or manipulating chunk timestamps is not a demonstrated fix for a full datastore. The storage documentation explains why correct access-time behavior matters.

5. Compare the datastore with the filesystem underneath

For this local-filesystem example, an authorized PBS administrator can inspect the configured path and then the filesystem containing it:

proxmox-backup-manager datastore show lab-backups

Read the returned path, then substitute it below. /mnt/datastore/lab-backups is an example path, not a location discovered on your server:

findmnt -T /mnt/datastore/lab-backups
df -hT /mnt/datastore/lab-backups
df -i /mnt/datastore/lab-backups

Verify that the expected device is mounted. Compare filesystem capacity and inode usage before and after a completed GC, using the same filesystem and units. Other data on that filesystem, underlying filesystem snapshots, quotas and reserved space can affect what is available. If there are separate ZFS snapshots retaining datastore blocks, inspect their own retention rather than assuming PBS GC deletes them.

For a datastore approaching exhaustion, preserve the task evidence and required recovery points, control further growth through your maintenance process, and arrange capacity or qualified recovery work. A full filesystem may lack room for normal maintenance. Do not delete files from .chunks or discard snapshot indexes by hand: that can damage retained recovery points.

Diagnose the observation before changing retention

ObservationNext check
Snapshot count did not fallCorrect group/namespace, completed prune, protection and actual keep/remove decisions
Count fell; GC has not runSchedule or run GC, then read its completed task
GC reports pending removalsCutoff eligibility, active writer and a later successful run
GC succeeded with few eligible chunksReferences from other retained snapshots and groups
GC removed chunks; filesystem still appears fullCorrect mount, other data, quotas, inodes and underlying filesystem snapshots
Prune or GC failedTask error and capacity/permissions; do not interpret a failed job as successful cleanup

Before automating, keep one maintenance record containing the policy owner, scope, preview, actual removed snapshots, completed GC result, remaining free space and an isolated restore of a retained point. Set schedules and alerts from observed job durations and growth, while allowing for delayed reclamation. A retention rule defines desired history; it does not automatically make space whenever a new backup needs it.

An accidentally pruned snapshot has no supported “undo prune” button in this workflow. Leftover chunks are not a replacement for the lost snapshot’s manifest and indexes. Recover from another retained point or an independent copy, and verify its application data before cutover.

Sources

KEEP EXPLORING

Related guides