What is WAL?
What is WAL?
Write-Ahead Logging (WAL) is Postgres’s built-in mechanism for ensuring data integrity and enabling change data capture (CDC). Here’s how it works:
- Every database change is first written to the WAL
- The changes are then applied to the actual database files
- This approach ensures data durability and enables reliable replication
- Replication slot overflow
- Database storage exhaustion
- Potential database downtime
Why is WAL growth an issue only on RDS?
Why is WAL growth an issue only on RDS?
TL;DR: AWS RDS uses internal “heartbeats” that generate WAL entries every 5 minutes, which can cause significant storage issues on idle databases.Details:As explained by Gunnar Morling in his blog post, AWS RDS writes a heartbeat to an internal
rdsadmin table every 5 minutes. Here’s why this matters:- Each WAL segment is 64MB by default
- Each heartbeat creates a new WAL segment
- On idle databases, this means:
- 64MB of WAL growth every 5 minutes
- ~18.4GB of WAL growth per day
- Potential replication slot overflow if left unchecked
- Test databases
- Low-traffic environments
- Idle databases
Prevent WAL growth with heartbeats
This solution is specifically designed for low-traffic or idle databases. Active databases don’t need this feature as their WAL naturally resets with regular data changes.Set up
- Create and configure the heartbeat table:
- In your pipeline’s source settings, turn on Enable heartbeats under Postgres settings.
Troubleshooting
If you’re still experiencing WAL growth after enabling heartbeats, check these common issues:1
Table exists
Verify
test_heartbeat_table exists in your database2
Publication
3
Permissions
Confirm the service account has proper write permissions
4
Long-running queries
More safeguards
More safeguards
To further protect your RDS instance, implement these measures:
-
Monitoring
- Set up alerts for
free_storage_space - Monitor WAL growth rates
- Set up alerts for
-
Database configuration
- Set appropriate
statement_timeout - Configure
max_slot_wal_keep_size(default is -1 for unlimited) - Enable storage autoscaling (AWS guide)
- Set appropriate
Diagnostic queries
Diagnostic queries

