Бэкап дампа базы Postgresql и его восстановление на новом сервере

Описание создания, перемещения и восстановления экземпляра PostgreSQL.

2020-04-21

Создание дампа может занять продолжительное время, поэтому работы производим через screen, который позволит нам сохранить работающий сеанс на сервере, даже если мы отключимся случайно или по какой-то причине.

Работы на исходном сервере

Сбор сведений перед созданием дампа

На исходном сервере запоминаем версию postgresql:

# rpm -qa|grep sql
postgresql11-server-11.4-1PGDG.rhel7.x86_64
postgresql11-11.4-1PGDG.rhel7.x86_64
postgresql11-libs-11.4-1PGDG.rhel7.x86_64

Смотрим who и активные сетевые подключения через ss -tul, чтобы удостовериться в своём одиноком присутствии на сервере.

Ознакомимся со свободным местом на сервере, где увидим, что есть свободные 340G:

# df -h
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root  1.3T  906G  340G  73% /
devtmpfs                16G     0   16G   0% /dev
tmpfs                   16G  8.0K   16G   1% /dev/shm
tmpfs                   16G  353M   16G   3% /run
tmpfs                   16G     0   16G   0% /sys/fs/cgroup
/dev/sda1              950M  251M  700M  27% /boot
tmpfs                  3.2G     0  3.2G   0% /run/user/1000
tmpfs                  3.2G     0  3.2G   0% /run/user/1007

Ищем postgresql в обычном месте /var/lib и находим экземпляр в /var/lib/pgsql/11/data. Узнаём размер каталога:

# du -hs du -hs /var/lib/pgsql/11/data
895G    du -hs /var/lib/pgsql/11/data

Огромная база в 900 Гигабайт и свободное место на 340 Гигабайт. Интересуемся у ответственного лица о содержимом базы:

> Ещё вопрос, пожалуйста. Внутри базы postgres хорошо сжимаемые данные, типа текста, или что-нибудь несжимаемое, типа jpg?

< картинок нет точно. в основном это csvшки с данными

> отлично. Ещё раз спасибо.

Из вышеприведённого диалога понятно, что база заполнена хорошо сжимаемым содержимым. Опережая события сообщу, что база сжалась до 52G (за 1,5 часа?).

В противном случае нам пришлось бы сжимать базу с автоматическим разделением дампа на части, чтобы была возможность переносить готовые куски на новый сервер, освобождая место на старом сервере для следующих параллельно создаваемых частей. Или, в крайнем случае, останавливаем postgres и, за 10-20 часов, в зависимости от ширины канала, копируем содержимое /var/lib/pgsql/11/data на новый сервер.

Выбор места создания дампа

После знакомства со структурой каталогов на сервере, решаем попробовать задампиться в /var/lib/pgsql/11/backups. Мне кажется, что выбор этого места логичен в данном случае.

Создание полного дампа исходного экземпляра posgresql

Определяем количество ядер у процессора (через top, htop, cat /proc/cpuinfo) и запускаем создание дампа со сжатием через lbzip2, с указанием найденного количества ядер для ускорения работы (в данном случае восемь потоков):

sudo su
su - postgres
time pg_dumpall -v | lbzip2 -n 8 -9 > /var/lib/pgsql/11/backups/pgsql_dumpall_$(date -u +%Y%m%d-%H%M%S).bz2

Забегая вперёд покажу затраченное время:

real    88m17.100s
user    463m50.451s
sys     16m31.101s

Посмотреть на текущий, и всё увеличивающийся, размер базы можно через дополнительный "экран screen" (масло масляное :-).

Пока дамп создаётся, не теряем времени и заходим на новый сервер.

Подготовка нового сервера к поднятию копии postgesql

Стандартные действия после установки системы

На новом сервере произвёл:
- обновление системы yum update
- перезагрузка reboot
- подключение репо postgresql

Памятуя о версии на исходном сервере, производим установку конкретной версии posgresql:

# yum install postgresql11-server-11.4-1PGDG.rhel7.x86_64
...
=======================================================================================
 Package                        Arch       Version            Repository     Size
=======================================================================================
Installing:
 postgresql11-server            x86_64     11.4-1PGDG.rhel7   postgres11     4.7 M
Installing for dependencies:
 postgresql11                   x86_64     11.4-1PGDG.rhel7   postgres11     1.6 M
 postgresql11-libs              x86_64     11.4-1PGDG.rhel7   postgres11     361 k
...

Устанавливаем пакет yum-plugin-versionlock для возможности блокировки пакетов от апгрейда и выполняем блокировку пакетов postgresql11*:

# yum install yum-plugin-versionlock
# yum versionlock postgresql11*
Loaded plugins: product-id, rhnplugin, search-disabled-repos, versionlock
This system is receiving updates from RHN Classic or Red Hat Satellite.
Adding versionlock on: 0:postgresql11-libs-11.4-1PGDG.rhel7
Adding versionlock on: 0:postgresql11-server-11.4-1PGDG.rhel7
Adding versionlock on: 0:postgresql11-11.4-1PGDG.rhel7
versionlock added: 3

При необходимости, актуальный список залоченных пакетов смотрим здесь cat /etc/yum/pluginconf.d/versionlock.list.

Монтирование большого раздела к /var/lib/pgsql

На новом сервер наблюдаем отдельный большой раздел 1.5TB подмонтрованный к /data. Создадим на нём каталог pgsql и прочее:

mkdir -p /data/pgsql/11/{data,backup}
chown postgres:postgres /data/pgsql -R
chmod 700 /data/pgsql -R
cp /var/lib/pgsql/.bash_profile /data/pgsql

Добавим в /etc/fstab следующую строку для автоматического биндинга /data/pgsql к /var/lib/pgsql:

/data/pgsql /var/lib/pgsql none defaults,bind 0 0

Важно!!! Если после последней строки в файле /etc/fstab не будет добавлена пустая строка, то сервер зависнет на этапе загрузки системы. Не помню причины этого явления, поэтому примите на веру, если не знали.

Инициализация и запуск

/usr/pgsql-11/bin/postgresql-11-setup initdb
systemctl start postgresql-11

Завершающие действия

Копирование дампа на новый сервер

В нашем случае прямое ssh-соединение между серверами отсутствует, поэтому скопируем полученный дамп через форпост, который доступен из обоих сегментов сети.

Сейчас мы находимся на промежуточном сервере. Сначала подключаемся по ssh к одному из серверов, на каковом сервере открывается локальный порт 50000, который связывается с портом 22 другого сервера (через промежуточный сервер!):

# ssh -R 127.0.0.1:50000:10.0.0.2:22 [email protected]
[[email protected]]# _

Теперь, находясь на сервере 10.0.0.1 (что видно по приглашению командной строки) помним, что постучавшись на локальный порт 127.0.0.1:50000, мы, на самом деле, стучимся на 10.0.0.2:22, но не на прямую, а через промежуточный сервер.

Поэтому здесь же запускаем процесс копирования с докачкой и проверкой. Копируем дамп и файлы настроек:

rsync -avP -e "ssh -p50000" /var/lib/pgsql/11/backup/pgsql_dumpall_20200421-103341.bz2 127.0.0.1:/data/pgsql/11/backup/
rsync -vP -e "ssh -p50000" /var/lib/pgsql/11/data/* 127.0.0.1:/data/pgsql/11/backup/data

В результате этой команды, наш дамп, через промежуточный сервер, будет залит на новый сервер.

Восстановление дампа на новом сервере

sudo su
su - postgres
lbzip2 -c -d /data/pgsql/11/backup/psql_dumpall_20200421-103341.bz2 | psql postgres

Восстановление настроек экземпляра postresgql

cp /data/pgsql/11/backup/data/* /data/pgsql/11/data/

Настройка атозапуска postgesql

systemctl enable postgresql-11

Перезагрузка для проверки

reboot

Использованный материал:
How to restrict yum to install or upgrade a package to a fixed specific package version?
25.1. SQL Dump Chapter 25. Backup and Restore