databasebackupcost-optimizationaws

Manual database snapshot sprawl: the graveyard on your invoice

Manual snapshots never expire. Every pre-migration safety copy taken over five years is still billing. A typical mid-sized account holds hundreds of gigabytes of snapshots nobody could name the purpose of.

The C3X Team··6 min read

Quick answer

Automated database snapshots expire on your retention schedule. Manual snapshots never expire and persist even after the source database is deleted. On RDS they are billed at $0.095 per GB-month in us-east-1 for the data they hold. A team that takes a pre-deployment snapshot before each of 40 releases per year, on a 400 GB database, accumulates roughly $3.80 per snapshot per month, so three years of untouched snapshots is about 120 snapshots costing $456 per month. The fix is a scheduled job that deletes manual snapshots older than a defined age unless they carry an explicit retention tag.

Snapshot sprawl is the purest form of cloud waste: a charge for something no human has looked at in years, that nobody would miss, and that accumulates with perfect regularity because taking a snapshot is the responsible thing to do before a risky change. The responsibility is real. The cleanup is what gets skipped.

Why manual snapshots persist

Automated backups on RDS, Cloud SQL, and Azure are tied to a retention window and to the lifecycle of the database. Delete the instance and, depending on configuration, the automated backups go with it. Manual snapshots behave completely differently: they have no expiry, they survive the deletion of the source database, and on RDS they even survive account-level backup policy changes. They are permanent until someone explicitly deletes them.

That design is correct. A snapshot you took before a destructive migration should not vanish because a retention policy rolled over. But combined with a habit of snapshotting before every change and no cleanup process, it produces a steadily growing charge with no ceiling.

The arithmetic of a snapshot habit

ScenarioSnapshots after 3 yearsData heldMonthly cost
Pre-release snapshot, 40 releases/year, 400 GB db120about 4.8 TBabout $456
Weekly manual snapshot, 200 GB db156about 3.1 TBabout $295
Pre-migration snapshots, 6 per year, 1 TB db18about 18 TBabout $1,710
Snapshots of deleted dev databasesvariesoften 1 to 3 TB$95 to $285

Snapshots are incremental against each other within a lineage, so the figures above are conservative if your snapshots are closely spaced and the database changes slowly. But incrementality does not help across lineages: a snapshot of a database that has since been deleted and recreated shares no blocks with anything current, so it holds full size forever.

The deleted-database case is the one that surprises people most. Delete the RDS instance, the console stops showing it, the monthly instance charge disappears, and the manual snapshot keeps billing quietly under a heading nobody reviews. A 1 TB snapshot of a database deleted two years ago has cost about $2,280 since.

Finding the sprawl

Three queries catch almost all of it. First, list manual snapshots older than 90 days and check whether the source database still exists. Second, list snapshots whose source instance identifier no longer resolves, which are orphans by definition. Third, group snapshots by source database and look for any database with more than a handful, which indicates a snapshot habit without a cleanup step.

On AWS this is a few lines with the CLI against describe-db-snapshots filtered by snapshot-type manual, and the AllocatedStorage field gives you the size to multiply by $0.095. Equivalent listings exist on Cloud SQL and Azure. Do the same for EBS snapshots of self-managed database volumes, which follow the same pattern at $0.05 per GB-month for standard tier.

A retention policy that survives contact with reality

Snapshot purposeKeep forMechanism
Pre-deployment safety copy7 daysAutomatic deletion job
Pre-migration copy30 daysAutomatic deletion job
Compliance or legal holdAs requiredExplicit retain-until tag, exempt from job
Final snapshot of deleted database90 daysAutomatic deletion job

The mechanism matters more than the policy. Write a scheduled function that deletes manual snapshots older than their category's age unless they carry a retain-until tag with a future date. Require the tag at creation time by wrapping snapshot creation in a small script or module, so an untagged snapshot is simply an expiring one. Anything that depends on someone remembering to clean up later will not work, because the person who took the snapshot has moved on to the thing the snapshot was protecting.

For snapshots you genuinely must keep for years, check whether archive tiers apply. EBS Snapshots Archive costs $0.0125 per GB-month against $0.05 for standard, a 75 percent saving, at the cost of a 24 to 72 hour restore time and a minimum 90 day commitment. For a compliance snapshot you hope never to read, that trade is obviously correct: 10 TB of archived snapshots costs $125 per month instead of $500.

What to expect from a cleanup

A first pass on an account that has never done this typically removes 40 to 70 percent of snapshot storage, and the recovered spend is permanent rather than one-off. Combine it with archive tiering for the genuine long-term holds and the snapshot line frequently drops by 80 percent. Then put the scheduled job in place, because without it the graveyard refills at exactly the rate it filled the first time.

Price snapshot and backup configuration from Terraform so retention is a reviewed decision. Compare storage and snapshot options against the resource catalog, and see EBS snapshot pricing for the block-storage equivalent.

FAQ

Do manual database snapshots expire?

No. Unlike automated backups, which are tied to a retention window and to the database lifecycle, manual snapshots have no expiry, survive deletion of the source database, and persist until someone explicitly deletes them. On RDS they are billed at $0.095 per GB-month in us-east-1 for the data they hold, indefinitely.

How much does snapshot sprawl cost?

A pre-release snapshot habit on a 400 GB database across 40 releases per year accumulates 120 snapshots in three years, roughly 4.8 TB, about $456 per month. Six pre-migration snapshots per year on a 1 TB database reach about 18 TB in three years, roughly $1,710 per month. Snapshots of databases that were deleted and recreated share no blocks with anything current, so they hold full size forever.

What happens to snapshots when I delete the database?

Manual snapshots survive. The console stops showing the instance, the hourly charge disappears, and the snapshot keeps billing under a heading nobody reviews. A 1 TB manual snapshot of a database deleted two years ago has accumulated about $2,280 in charges since. Orphaned snapshots whose source instance no longer resolves are the highest-yield cleanup target.

How do I find orphaned snapshots?

Three checks cover most of it: list manual snapshots older than 90 days and verify the source database still exists, list snapshots whose source instance identifier no longer resolves, and group snapshots by source database looking for any with more than a handful. On AWS, describe-db-snapshots filtered to snapshot-type manual gives you sizes to multiply by $0.095 per GB-month.

Should long-term snapshots be archived?

Usually yes. EBS Snapshots Archive costs $0.0125 per GB-month against $0.05 standard, a 75 percent saving, in exchange for a 24 to 72 hour restore time and a 90 day minimum commitment. For a compliance snapshot you hope never to read, that trade is clearly right: 10 TB costs $125 per month archived instead of $500.

How does C3X help with snapshot cost?

C3X prices backup and snapshot configuration from Terraform before you merge, so retention settings and storage classes carry visible cost figures at review time. Since snapshot sprawl accumulates from decisions that each looked trivial, having the recurring cost of a retention choice appear in the pull request is where the habit is cheapest to correct.

What to do next

Stop paying for snapshots nobody can name. C3X reads your Terraform and prices your resources against a live catalog. Start with the quickstart.

Try C3X on your own Terraform

Free and open source. No API key required. One command to install, one command to estimate.