28.2. Database Backups
Table of Contents
Why Database Backups Matter
Backups are your safety net. Disks fail, developers run the wrong DELETE query, cloud providers have outages, and attackers can destroy data.
A database backup strategy answers three questions:
- How much data can we afford to lose?
- How long can we afford the database to be down?
- How do we actually restore when something goes wrong?
We will focus on practical concepts you can apply to any relational database, such as PostgreSQL.
A backup that you have never restored is not a backup.
It is just a file.
Core Backup Concepts
RPO and RTO
Two key metrics drive your backup design:
- RPO (Recovery Point Objective)
How much data you can lose, measured in time. - RPO = 24 hours: you can lose up to 1 day of data.
- RPO = 5 minutes: you accept losing at most 5 minutes of data.
- RTO (Recovery Time Objective)
How long it can take to get the system back up. - RTO = 4 hours: service can be down for up to 4 hours.
- RTO = 5 minutes: you need almost instant recovery.
| Scenario | Example RPO | Example RTO | Typical Approach |
|---|---|---|---|
| Small hobby app | 24 h | 24 h | Daily full backup |
| Small business, important data | 1 h | 2 h | Hourly incremental + daily full backup |
| Payments, financial transactions | 5 min | 15 min | Continuous log backup + hot standby replica |
Always define RPO and RTO before choosing your backup tools.
Tools serve your objectives, not the other way around.
Types of Database Backups
Logical vs Physical Backups
Logical backups
A logical backup saves your data as SQL statements or a logical format.
- For example, with PostgreSQL:
pg_dumpgenerates SQL you can run to recreate the database.pg_dump --format=customcreates a compressed logical dump.
Characteristics:
- Portable between versions and sometimes between systems.
- Smaller and easier to inspect.
- Slower to restore for large datasets.
Physical backups
A physical backup copies the actual database files on disk:
- Data files, WAL logs, configuration files etc.
Characteristics:
- Very fast to restore.
- Usually must be restored into the same database engine and version.
- Good for very large databases.
- Often used together with WAL / log archiving for point in time recovery.
| Backup Type | Level | Pros | Cons |
|---|---|---|---|
| Logical | Database | Portable, readable, flexible | Slow restore, heavier load on running server |
| Physical | File | Fast restore, good for very large DBs | Less portable, more complex to manage |
Full, Incremental, and Differential Backups
These terms are often used in storage-level or physical backups.
- Full backup
One complete copy of the database at a point in time. - Incremental backup
Only the data that changed since the last backup (full or incremental). - Differential backup
Only the data that changed since the last full backup.
Example schedule:
- Sunday: Full backup
- Monday: Incremental
- Tuesday: Incremental
- β¦
To recover Wednesday:
- Restore Sunday full + Monday incremental + Tuesday incremental.
With differential:
- Sunday: Full backup
- Monday: Differential
- Tuesday: Differential
To recover Wednesday:
- Restore Sunday full + Tuesday differential.
Incremental saves more space, differential simplifies restores.
Hot, Warm, and Cold Backups
These terms describe whether the database is running during the backup.
- Hot backup
Database stays online and continues to accept reads and writes. - Warm backup
Database is online but in a restricted state (for example read-only). - Cold backup
Database is shut down while you copy the files.
| Mode | Downtime | Data up to moment of backup? | Typical for |
|---|---|---|---|
| Hot | None | Yes | Production systems |
| Warm | Low | Yes, but limited activity | Maintenance windows |
| Cold | Yes | Yes | Simple setups, very small applications |
In modern production systems you usually aim for hot backups.
Point-in-Time Recovery (PITR)
Sometimes a regular backup is not enough. Imagine this timeline:
- 12:00: Full backup.
- 15:00: Developer runs
DELETE FROM orders;withoutWHERE. - 16:00: You notice.
If you restore the 12:00 backup, you lose all data from 12:00 to 16:00.
If you have Point-in-Time Recovery, you can restore to 14:59:59 and lose almost nothing.
PITR is usually implemented by:
- A base full backup.
- Continuous archiving of transaction logs (for example WAL in PostgreSQL) to external storage.
- The ability to replay logs up to a specific time.
To achieve PITR, you must:
- Enable continuous log archiving.
- Store logs on separate, durable storage.
- Test restoring to a specific timestamp.
Backup Storage and Retention
Offsite and Off-system Storage
If you store backups on the same server as the database, one incident can destroy both.
Follow these rules:
- Store backups in a different system from the database server.
- Prefer a different physical location or region.
- Use object storage like S3, GCS, or Azure Blob, or a separate backup server.
- Protect storage with strict access control and encryption.
Retention Policies
You cannot keep every backup forever, it is too expensive. Define:
- How long to keep different backup types.
- When to delete old backups.
Example retention policy:
- Full backups: daily, keep 7 days.
- Incremental backups: every 15 minutes, keep 48 hours.
- Monthly full backups: keep 12 months.
- Critical log archives: 2 weeks.
Write this as a clear rule, for example:
Retention example:
- Keep daily full backups for 7 days.
- Keep log archives for 14 days.
- Keep monthly full backups for 12 months.
- Automatically delete older backups.
Then automate cleanup. Never rely on manual deletion.
Backup Encryption
Backups contain the same sensitive data as your production database, sometimes more.
Basic rules:
- Encrypt data at rest in backup storage.
- Encrypt data in transit when sending backups over the network.
- Use strong keys and rotate them.
- Limit who can access keys and backups.
A common pattern:
- Use server-side encryption in your cloud storage.
- For extra security, encrypt backup files before upload with a tool like GPG or built-in backup tool encryption.
Designing a Backup Strategy
Start from Requirements
Before choosing commands or tools, define:
- Business impact of data loss
- Can you reconstruct some data from logs or other systems?
- Are there legal rules about data retention?
- Traffic patterns
- When is traffic low? That is a good time for full backups.
- Is traffic constant? You need hot backups that avoid locks.
- Database size and growth
- A 1 GB DB can be backed up with a simple logical dump.
- A 2 TB DB probably needs physical backups and careful planning.
Combine Techniques
Typical production patterns:
Pattern 1: Simple app, small DB
- Daily logical full backup at night.
- RPO: 1 day. RTO: a few hours.
- Store backups in object storage.
- Weekly test of restore.
Pattern 2: Growing app, medium DB
- Weekly full physical backup.
- Hourly incremental or continuous WAL / log archiving.
- Daily logical dump for cross-check or reporting.
- RPO: 1 hour or less. RTO: 1 hour.
Pattern 3: Critical system, large DB
- Physical base backup plus continuous WAL / log archiving.
- Streaming replica that can be promoted if primary fails.
- Maybe logical backups for schema or migration safety.
- RPO: minutes. RTO: minutes.
Automate Everything
Manual backups are forgotten. Use:
- Cron jobs or systemd timers.
- Cloud scheduler services.
- Backup tools with built-in schedulers.
Each run should:
- Create the backup.
- Verify it at least at a basic level (file exists, non-zero size, checksum).
- Upload it to remote storage.
- Optionally, remove very old backups.
Backup Procedures in Practice
We will stay database-agnostic, but imagine a PostgreSQL-like system.
Example: Logical Backup Procedure
A minimal logical backup flow:
- Run a dump command.
- Compress the output.
- Upload to object storage.
- Log the result.
Pseudo-steps:
# 1. Dump database
pg_dump --format=custom --file=/backups/app_$(date +%F_%H-%M).dump app_db
# 2. Compress (if not already compressed)
gzip /backups/app_*.dump
# 3. Upload to object storage (example using AWS CLI)
aws s3 cp /backups/app_*.dump.gz s3://my-backups/app-db/
# 4. Clean up local backups older than 3 days
find /backups -type f -mtime +3 -deleteYou would put this script in a cron job:
0 3 * * * /usr/local/bin/backup_app_db.sh >> /var/log/backup.log 2>&1Example: Physical Backup with Log Archiving
High-level flow:
- Enable transaction log archiving on the database.
- Periodically take a physical base backup.
- Continuously ship logs to object storage.
For restore:
- Download base backup from date X.
- Download logs from after X up to your target time.
- Restore base backup.
- Configure database to replay logs up to a given timestamp.
The specific commands depend on your database and are usually covered in its own documentation.
Testing Restores
Why Restore Tests Are Critical
Many teams discover their backups are unusable during a crisis:
- Backup files are corrupted.
- Encryption keys are lost.
- Instructions are missing.
- The backup does not contain what they expected.
To avoid this, schedule regular restore tests.
Rule: For every backup strategy, you must have a documented, tested restore procedure.
No exceptions.
Types of Restore Tests
You do not need a full-scale drill every day. Mix several levels:
- Quick checks (frequent)
- Verify backup files exist and are not empty.
- Verify checksums or hashes.
- Partial restore (weekly or bi-weekly)
- Restore a small backup (for example, a smaller database) into a test environment.
- Run basic queries to ensure data looks correct.
- Full restore drill (monthly or quarterly)
- Restore a production-sized backup into a separate environment.
- Time how long it takes.
- Validate that:
- The right schema is present.
- Data counts match expectations.
- Application can connect and operate on restored DB.
- Test restoring to a specific point in time if you support PITR.
Document the Restore Procedure
Your documentation should be clear enough that another engineer can follow it without prior experience.
Include:
- Where backups are stored and how to access them.
- How to find the right backup for a given date and time.
- Step-by-step restore commands.
- How to switch the application to use the restored database.
- How to verify success.
Example outline:
- Identify incident time and target restore time.
- Choose base backup and log segment range.
- Provision a new database server.
- Download and extract backup files.
- Configure and start the database in recovery mode.
- Replay logs up to target time.
- Point staging app to this database and run checks.
- If promoting to production, update application configuration.
Common Pitfalls and How to Avoid Them
Backups on the Same Server
Pitfall:
- Backups stored in
/var/backupson the same machine as the database. - Disk failure, ransomware, or accidental
rm -rf /kills both.
Solution:
- Store backups on a different system or object storage.
- Optionally keep a local copy for quick restores, but always have a remote copy.
Incomplete Backups
Pitfall:
- You back up only the data directory but not logs or configuration.
- Restore fails because important files are missing.
Solution:
- Clearly document what must be backed up:
- Data.
- Transaction logs (for PITR).
- Configuration and authentication files.
- Use official tools or recommended backup approaches for your database.
Ignoring Schema and Migrations
Pitfall:
- You back up only raw data tables.
- During restore, schema or extensions are missing or incompatible.
Solution:
- For logical backups, ensure schema and data are both included.
- Keep your migration scripts (for example Alembic) in version control and stored separately.
- Consider occasional schema-only backups as well.
No Monitoring or Alerts
Pitfall:
- Your backup script fails silently for weeks.
- You realize when you need a restore and no recent backups exist.
Solution:
- Log every backup run.
- Use monitoring to alert on failures or missing backups.
- Watch for file size anomalies (for example, abnormally small backups).
Example Backup Strategy for a Typical Backend
Imagine a production application with:
- PostgreSQL database of 100 GB.
- Traffic mostly 9:00 to 18:00.
- Business wants:
- RPO: 15 minutes.
- RTO: 1 hour.
A reasonable plan:
| Requirement | Implementation |
|---|---|
| Daily full backup | Nightly physical or logical backup to object storage |
| RPO 15 minutes | Continuous WAL / log archiving to object storage |
| RTO 1 hour | Pre-documented restore steps, tested monthly |
| Offsite storage | Backups stored in S3 in a different region |
| Encryption | Server-side encryption in S3, limited IAM access |
| Retention | Daily backups for 7 days, weekly for 4 weeks, monthly 6 mo |
| Monitoring | Alerts if last backup is older than 26 hours or if failed |
| Testing | Weekly small restore, quarterly full disaster recovery drill |
This strategy is not perfect for every case, but it shows how to translate RPO / RTO into a concrete setup.
Checklists
Backup Checklist
Use this whenever you design or review backups:
- [ ] RPO defined and documented.
- [ ] RTO defined and documented.
- [ ] Backup type chosen (logical, physical, or both).
- [ ] Backup frequency defined for:
- [ ] Full backups.
- [ ] Incremental / log backups (if any).
- [ ] Backups stored off the database server.
- [ ] Backups encrypted at rest and in transit.
- [ ] Retention policy defined and automated.
- [ ] Backup process automated and monitored.
- [ ] Access to backups is controlled and audited.
Restore Checklist
Use this for drills and during incidents:
- [ ] Incident time and cause identified.
- [ ] Target restore time decided (including safety margin).
- [ ] Appropriate base backup located.
- [ ] Required logs / incremental backups identified.
- [ ] New environment prepared for restore.
- [ ] Restore steps followed exactly as documented.
- [ ] Application tested with restored database.
- [ ] Timing recorded for future RTO improvements.
- [ ] Root cause and any backup gaps analyzed after the event.
Summary
In production backend engineering, database backups are as important as the database itself.
Key ideas to remember:
- Define RPO and RTO first, then choose tools.
- Use the right mix of logical and physical backups.
- Combine full and incremental strategies to balance time and storage.
- Store backups offsite, encrypted, and with clear retention rules.
- Implement Point-in-Time Recovery if your RPO is strict.
- Automate both backups and verification.
- Most importantly, regularly test restores and document your procedures.
If you cannot confidently restore your database to a specific point in time, your backup strategy is not finished.
Views: 7
KAHIBARO