Update: Check out Barman for an easier way to set up WAL archiving for backup.
You can use PostgreSQL’s continuous WAL archiving method. First you need to set wal_level=archive, then do a full filesystem-level backup (between issuing pg_start_backup() and pg_stop_backup() commands) and then just copy over newer WAL files by configuring the archive_command option.
Advantages:
- Incremental, the WAL archives include everything necessary to restore the current state of the database
- Almost no overhead, copying WAL files is cheap
- You can restore the database at any point in time (this feature is called PITR, or point-in-time recovery)
Disadvantages:
- More complicated to set up than pg_dump
- The full backup will be much larger than a pg_dump because all internal table structures and indexes are included
- Does not work well for write-heavy databases, since recovery will take a long time.
There are some tools such as pitrtools and omnipitr that can simplify setting up and restoring these configurations. But I haven’t used them myself.