rsync копирует не файлы целиком, а дельты — при повторном запуске на тот же адресат передаёт по сети только изменившиеся блоки. Это база большинства скриптовых бэкапов, где pg_probackup/pgBackRest — оверкилл, а tar каждый день целиком — слишком дорого по месту и трафику.

База — флаг -a (archive), который на самом деле сокращение сразу нескольких:

rsync -avz --delete -e ssh /srv/data/ user@backup-host:/srv/data/
  • -a — рекурсивно, с сохранением прав, времени модификации, симлинков, владельца/группы
  • -v — подробный вывод, что скопировано
  • -z — сжатие на лету (полезно на медленном канале, бессмысленно на гигабитной локалке между двумя дисками)
  • --delete — удалить на приёмнике файлы, которых больше нет в источнике (без этого флага бэкап только растёт, никогда не синхронизируется в обе стороны по составу)
  • -e ssh — транспорт, можно указать порт/ключ: -e "ssh -p 2222 -i /path/key"

Инкрементальные снапшоты без дифф-бэкапа — трюк с --link-dest:

rsync -a --link-dest=/backup/2026-09-30 /srv/data/ /backup/2026-10-01/

Файлы, которые не изменились с прошлого снапшота, не копируются заново — вместо этого в новой директории создаётся хардлинк на файл из --link-dest. Итог: /backup/2026-10-01/ выглядит как полная независимая копия (можно смонтировать, скопировать, удалить старые снапшоты не трогая новые), а место на диске расходуется только на реально изменившиеся файлы. Это тот же принцип, на котором строится rsnapshot, только без обёртки.

Частая ошибка — путь с завершающим слэшем и без:

rsync -a /srv/data  /backup/   # скопирует папку data/ ВНУТРЬ /backup/
rsync -a /srv/data/ /backup/   # скопирует СОДЕРЖИМОЕ data/ прямо в /backup/

Слэш после источника — “содержимое директории”, без слэша — “саму директорию как есть”. На бэкап-скрипте это разница между рабочей структурой каталогов и случайно продублированным уровнем вложенности.

#linux #backup #rsync