Вы находитесь на странице: 1из 1

КАК СТАТЬ АВТОРОМ Войти

Все потоки Разработка Администрирование Дизайн Менеджмент Маркетинг Научпоп

lesovsky 12 мая 2014 в 14:15

10 способов сделать резервную копию в PostgreSQL


5 мин 253K

Системное администрирование*, Администрирование баз данных*

Многие разговоры про бэкапы начинаются с присказки что люди делятся на две категории… так
вот я отношусь к тем людям которые делают бэкапы. Правильно настроенное резервное
копирование и проверка резервных копий укрепляет сон. А наличие заранее написаных и
проигранных инструкций по восстановлению вообще укрепляет пищеварение и иммунитет. Так
вот, за время работы с PostgreSQL мне довелось часто настраивать резервное копирование, при
этом условия и требования были самые разные. Однако при этом набор инструментов за редким
исключением оставался неизменным. В этой статье поделюсь своим опытом в деле, как можно
брать резервные копии PostgreSQL.

Если рассматривать резервное копирование как вполне конкретный процесс, то возникает два
простых вопроса:
1. откуда запускать резервное копирование?
2. какие инструменты следует использовать для резервного копирования?

На первый вопрос есть два варианта ответа: можно запускать задачу резервного копирования с
выделенного backup сервера, на мой взгляд это наиболее подходящий вариант. Либо запускать
задачу непосредственно с сервера БД, это в случае если нет выделенного сервера бэкапов.

С инструментами все гораздо интереснее. Здесь я выделяю две группы, основные инструменты и
вспомогательные. Основные это те, которые собственно и выполняют резервное копирование.
Вспомогательные это те которые добавляют что-то особенное к процессу резервного
копирования, например архивирование, шифрование, управление нагрузкой и т.д.

В комплекте PostgreSQL есть 2 утилиты которые позволяют делать резервные копии, это
pg_dump/pg_dumpall и pg_basebackup. Кроме того есть возможность использовать утилиты
файлового копирования, такие как rsync, tar, cp и т.п.
Итак, каким инструментом запускать бэкап?
pg_dump — подходит для случаев когда нужно сделать резервную копию таблицы, базы, схемы
или данных.
pg_basebackup — подходит для случаев когда нужно сделать резервную копию целиком всего
кластера БД или настроить hot standby реплику.
rsync/tar/cp — также используются для случаев копирования всего кластера.

Когда только случился релиз PostgreSQL 9.0 резервное копирование выполнялось с помощью
rsync, однако уже в 9.1 появился pg_basebackup, который имеет некоторыми преимуществами
перед rsync:

pg_basebackup не требует ssh доступа, но требует доступа к базе указанного в pg_hba.conf;


pg_basebackup богаче по функциональности (копирование WAL, создание recovery.conf,
встроенное сжатие gzip и пр.);
pg_basebackup не требует отдельного вызова функций pg_start_backup/pg_stop_backup как
это требуется при использовании rsync/tar/cp;
pg_basebackup выполняет копирование быстрее чем rsync за счет использования протокола
потоковой репликации.

но есть и некоторые недостатки:

pg_basebackup идет out-of-the-box, и соответственно требует установленного postgres;


pg_basebackup не имеет встроенных функций для ограничения скорости копирования
(обещают только в 9.4);
pg_basebackup требует включенных опций wal_level = hot_standby, max_wal_senders в
postgresql.conf.

Здесь я буду рассматривать pg_basebackup, хотя и pg_dump тоже может использоваться в


нижеперечисленных способах.

1. Простое и без изысков резервное копирование с backup сервера в каталог /backup (каталог
должен быть предварительно создан):

backup@backup ~ $ pg_basebackup -x -h db01.example.com -U backup -D /backup

2. Копирование с пониженным приоритетом IO операций с помощью ionice, для случаев когда


нужно уменьшить нагрузку на дисковый ввод-вывод от резервного копирования:

postgres@db01 ~ $ ionice -c 3 pg_basebackup -x -h db01.example.com -U backup -D /backup

3. Копирование с сжатием в bzip2, для случаев когда нужно использовать нестандартный для
pg_basebackup алгоритм сжатия (gzip). Здесь мы передаем данные через стандартный вывод
(stdout) на стандартный ввод (stdin) программе bzip2.

backup@backup ~ $ pg_basebackup -x --format=tar -h db01.example.com -U backup -D - |bzip2 -

4. Копирование с сжатием в несколько потоков (используем lbzip2 и задействуем 6 ядер). При


таком раскладе можно задействовать простаивающие ядра и ускорить процесс сжатия.

backup@backup ~ $ pg_basebackup -x --format=tar -h db01.example.com -U backup -D - |lbzip2

5. Здесь копирование запускается на сервере БД. Формируемая резервная копия отправляется


на удаленный сервер по ssh.

postgres@db01 ~ $ pg_basebackup -x --format=tar -h 127.0.0.1 -U backup -D - |ssh backup@bac

6. Здесь копирование также запускается на сервере БД и выполняется отправка на удаленный


сервер, но уже с архивированием в 6 потоков с помощью lbzip2.

backup@backup ~ $ pg_basebackup -x --format=tar -h 127.0.0.1 -U backup -D - |ssh backup@bac

7. Копирование на удаленный сервер с ограничением пропускной полосы до 10Мб с помощью pv


и последующее архивирование на удаленной стороне. Этот вариант для случаев когда нужно
передать не нагружая сеть.

backup@backup ~ $ pg_basebackup -x --format=tar -h 127.0.0.1 -U backup -D - |pv -r -b -L 10

Тут стоит отметить что c 9.4 в pg_basebackup уже есть возможность ограничения скорости
передачи (-r, --max-rate).
8. Копирование запускается на backup сервере, а далее происходит раздваивание потока на две
части. Один поток сжимается с bzip2 (сам бэкап) и второй поток через tar копируется во
временный каталог для последующей валидации. Способ редкоиспользуемый, но тут интересна
сама реализация.

backup@backup ~ $ pg_basebackup -x --format=tar -h db01.example.com -U backup -D - |tee >(b

9. Копирование с задействование lbzip2 на обоих узлах, для случаев когда у сети маленькая
пропускная способность, сначала поток сжимается, затем передается по сети и затем
расжимается на удаленной стороне. Здесь используется tar и требуется выполнение
pg_start_backup('label_name') на стороне postgres.

postgres@master # cd /var/lib/pgsql/9.3/data
postgres@master # tar cfO - ./ |lbzip2 -n 2 -5 |ssh postgres@standby "lbunzip2 -c -n 2 |tar

10. бэкапирование с шифрованием через GPG, для случаев когда нужно зашифровать резервную
копию. Предварительно следует создать ключи через gpg --gen-key (в моем случае ключи
созданы с именем backup)

backup@backup ~ $ pg_basebackup -x --format=tar -h db01.example.com -U backup -D - |gpg -r

Для расшифровки резервной копии следует выполнить такую команду

backup@backup ~ $ bzcat /backup/backup-09-May-2014.tar.bz2 |gpg -r backup -d |tar xf - -C /

На этом все, подведем итоги по инструментам:

pg_basebackup — утилита для создания резервных копий postgres;


lbzip2 — bzip2 сжатие с использованием несокльких ядер — если нужно запаковать быстрее
(аналоги: pbzip2, pigz);
ionice — регулировка класса и приоритета для планировщика ввода-вывода (также можно
использовать nice для регулировки приоритета процессов для CPU планировщика);

pv — контролируем объем передаваемых данных через pipe и т.о. используем для


ограничения объема передаваемых данных в единицу времени (аналог — throttle);
tar — утилита архивирования, нужна для вспомогательных целей когда неиспользуется
сжатие bzip2/gzip;
tee — чтение с stdin c записью в stdout и другие файлы (является частью coreutils);

gpg — решает задачи по шифрованию.

Всем спасибо за внимание!

Теги: postgresql, backup

Хабы: Системное администрирование, Администрирование баз данных

Редакторский дайджест
Присылаем лучшие статьи раз в месяц

Электропочта

115 0
Карма Рейтинг

Алексей @lesovsky
PostgreSQL DBA

Github

Комментарии 18

Публикации

ЛУЧШИЕ ЗА СУТКИ ПОХОЖИЕ

anton-artemenko 10 часов назад

Сложный пациент с Хабра: разработчик из Швеции, 23 года без


стоматологов
21 мин 5.4K

+43 19 11 +11

Spiralhead 10 часов назад

Как мы научили заводчан строить красивые инженерные отчеты из


Jupyter Notebook на Python
14 мин 4.3K

+43 50 3 +3

dmitriyrudnev 8 часов назад

Проект «Селенит». Часть 4: Квадратурный гетеродин


Средний 7 мин 1.2K

Обзор

+30 10 2 +2

sssrgei 19 часов назад

Криптоотопление на кибердаче
Простой 5 мин 5.4K

Кейс

+29 22 42 +42

BabayMazay 4 часа назад

Простая, недорогая, точная высокотемпературная электропечь своими


руками
Средний 7 мин 1.5K

Кейс

+27 22 10 +10

MaFrance351 9 часов назад

Оживляем блоки индикации из кабины «Боинга»


Средний 6 мин 2.7K

Обзор

+25 8 6 +6

secm3n 7 часов назад

LAN-party для пентестеров: прорываемся к домен контроллеру через


розетку
Средний 7 мин 2.2K

Кейс

+24 30 2 +2

avpuser 10 часов назад

Интернационализация от i до n: как мы переводим интерфейсы в


Фантехе Яндекса
Средний 7 мин 648

+18 15 3 +3

7 часов назад

Карьерные боли девопсов: какие они бывают и как специалисту их


закрыть
1 мин 1.6K

+16 11 2 +2

vasilisa_b 10 часов назад

Манса Муса и инфляция в Египте: как один человек сумел обрушить


экономику целой страны
8 мин 3.5K

+16 12 19 +19

Я всё вижу: как нейросеть видит дефекты в металлопроизводстве


Турбо

Показать еще

ИСТОРИИ

DIY is FUN: лучшие Как создать Путешествие в Как стать Как прокачать Перевернут
самоделки за год компанию на Хабр мир AI супергероем английский календарь
Карьере Росатома добавить с

КУРСЫ

DevOps-инженер с нуля
20 декабря 2023 · 23 месяца · 162 800 ₽

DevOps-инженер с нуля
20 декабря 2023 · 23 месяца · 162 800 ₽

Фронтенд-разработчик
12 декабря 2023 · 15 месяцев · 169 000 ₽

Старт в программировании
12 декабря 2023 · 3 недели · 347 ₽

Фронтенд-разработчик
12 декабря 2023 · 15 месяцев · 169 000 ₽

Больше курсов на Хабр Карьере

МИНУТОЧКУ ВНИМАНИЯ

Промо Турбо Интересно

Чёрная пятница станет вечной: Будущее рекламы на Глупым вопросам и ошибкам —


промокодус поймал скидки маркетплейсах: анализ от НРФ быть! IT-менторство на ХК

РАБОТА

Администратор баз данных


104 вакансии

DevOps инженер
40 вакансий

Системный администратор
96 вакансий

Все вакансии

Настройка языка

Техническая поддержка

© 2006–2023, Habr

Вам также может понравиться