DevOps-им по-взрослому
167 subscribers
79 photos
32 files
58 links
Download Telegram
#postgresql, #backups

👩‍💻 Администрируем PostgreSQL. Часть I: Бэкапы via built-in tools

Я люблю DBaaS. Они просты в настройке и эксплуатации, так как облачный провайдер берёт на себя большую часть ответственности, например задачи по репликации на Replica-хосты, созданию резервных копий или соответствию законам.

🤔 Но представьте, что вам неожиданно дадут чистую ВМ и скажут: "Выкатывай в продакшен!" Страшно? Ну что же, го.

Запускаем слоника через docker compose (на проде так не делаем, т.к запускать StateFull приложения в контейнере - плохая затея)

https://pastebin.com/tMAH1pQ5

docker compose up -d


Подключаемся, создаём таблицу и заполняем её:
https://pastebin.com/tp6rVjPV

Теперь рассмотрим возможности для создания резервных копии.

1) SQL-дампы: pg_dump & pg_dumpall

При помощи pg_dump мы можем создать SQL-дамп для конкретной БД, тогда как с pg_dumpall - для всего кластера:

pg_dump \   
--host=localhost \
--port=5432 \
--username=dev_user \
--password \
users > users_dump.sql


users_dump.sql будет содержать все команды, необходимые для восстановления базы данных.

❗️ Но тут не всё так идеально. Хотя база данных в момент создания дампа не блокируется, для достаточно "жирных" баз операции создания и восстановления из такого дампа могут занять достаточно большое время.

Восстановим базу данных на другом кластере:

psql \
--host=localhost \
--port=5433 \
--username=dev_user \
--password \
users < users_dump.sql

users=# select count(*) from users;
count
-------
14
(1 row)


⚙️ 2) Физический бэкап: pg_basebackup

🤓 pg_dump называют логическим бэкапом, так как он содержит SQL-команды. Для физического бэкапирования используется утилита pg_basebackup. Преимущество таких бэкапов над дампами в том, что создание через pg_basebackup будет в разы быстрее для большого кластера, чем через pg_dumpall.

🤠 Добавим базу данных replication и назначим dev_user все права:

users=# create database replication;
CREATE DATABASE
users=# grant all privileges on database replication to dev_user;
GRANT


🧐 Добавим в pg_hba.conf строчку, которая позволит подключаться к базе данных для создания резервной копии:

host    replication           dev_user        0.0.0.0/0               password


Создадим физический бэкап:

pg_basebackup --host=localhost --port=5432 --username=dev_user -D ./main-postgres-data


👣 Теперь пробросим только что созданный бэкап в restored контейнер:

services:
main:
[...]

restored:
[...]
volumes:
- ./main-postgres-data:/var/lib/postgresql/data


🎩 Подключимся по psql к restored контейнеру и убедимся, что данные были восстановлены успешно:

psql \
--host=localhost \
--port=5433 \
--username=dev_user \
--password \
users
Password:
psql (14.11 (Ubuntu 14.11-0ubuntu0.22.04.1), server 14.1)
Type "help" for help.

users=# select count(*) from users;
count
-------
14
(1 row)


Таким образом, PostgreSQL обладает огромным количеством утилит для создания резервных копии. Мы рассмотрели команды, идущие "из коробки". Но их хватает не всегда: про другие инструменты бэкапирования я напишу в следующем посте. Замечательных выходных! 🤟
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳3👍1