Docs / Incremental replication
Incremental replication
After your first full send, keep your conduit in sync by transferring only what changed between two snapshots.
How it works
ZFS can compute the exact difference between two snapshots and send only
those blocks. Use
-i to send the change
between one snapshot and the next, or -I to
send every intermediate snapshot in the range. Incremental sends are
typically a tiny fraction of the full dataset.
1. Snapshot, then send the delta
Take a fresh snapshot, then send the change since your last replicated
snapshot. Replace the snapshot names and connection details with your own.
$ zfs snapshot tank/data@2026-01-02
$
zfs send
-i
tank/data@2026-01-01 tank/data@2026-01-02
\
The receiving side must still have the base snapshot
(
@2026-01-01) from your previous send — ZFS
uses it as the starting point.
2. Send a range with -I
If you take snapshots more often than you replicate, use
-I to send every snapshot between the base
and the latest in one stream, preserving the full history:
$
zfs send
-RwI
tank/data@2026-01-01 tank/data@2026-01-07
| ssh … zfs recv …
-R includes child datasets,
-w sends encrypted datasets raw (keys stay
with you), and -I includes all intermediate
snapshots.
Tips
- Use a consistent snapshot naming scheme (dates or sequential counters) so you always know your base.
- Add
-vto watch progress; the first incremental after a long gap can still be large. - Bookmarks (
zfs bookmark) let you free the local base snapshot while keeping an incremental source. - Keep an eye on your snapshot count — each plan has a snapshot limit.