Базы данных — замечательный инструмент, без которого сложно представить современное приложение. И как бы сильно я ни любил использовать БД, я просто ненавижу писать SQL-запросы. Поэтому однажды задался вопросом, кто мог бы делать это за меня, при этом несильно теряя в качестве.
— Для начала рассмотрим несколько CLI-инструментов, которые позволят нам работать с резервными копиями
pg_dump <название БД>
Стандартная утилита для создания копий. Для лучшего понимания предлагаю вкратце ознакомиться с тем, как она реализована. Рассмотрим шаги внутренней работы:
Подключение к БД: авторизация такая же, как и у обычного клиента, используется библиотека С — libpq.
Чтение схемы: посредством запросов SELECT * FROM ...
Создание структуры: строится дерево объектов, которое затем преобразуется в соответствующий формат.
Сохранение данных: отдельно сохраняются данные из БД.
Запись в конечный файл: в зависимости от типа резервной копии сохраняется либо в бинарник, либо в текстовый файл всю копию, включающую структуру и данные.
Ключи:
-U имя пользователя-h хост-p порт-F формат дампа: p (plain), c (custom), d (directory), t (tar)-f путь к файлу вывода-d название базы данных--table=имя снять дамп только одной таблицы--schema=имя только определённая схема-v подробный вывод--data-only только данные, без схемы--schema-only только схема, без данных--inserts использовать INSERT вместо COPYpg_dumpall
По сути тот же pg_dump, но делает дамп сразу всего кластера. Однако отметим сразу, что данная утилита не поддерживает указание форматов, копия создаётся только в формате SQL. Давайте начнём также с реализации:
Подключение к БД: аналогично pg_dump.
Получение имён всех БД: посредством запросов SELECT datname FROM pg_database WHERE datallowconn.
Сохранение всех глобальных объектов.
Получение списка БД: вызывается команда pg_dump для каждой базы.
Создание общего файла дампа: все дампы объединяются в один поток вывода и записываются в файл аналогично pg_dump.
Ключи:
-U имя пользователя-h хост-p порт-f файл вывода-v подробный вывод--globals-only только роли и настройки--roles-only только роли--data-only только данныеpg_restore <путь к дампу>
Инструмент для восстановления БД из дампа. Под капотом всё просто:
Чтение копии: считывается TOC (table of contents), определяется, в каком порядке необходимо восстанавливать данные.
Фильтрация: происходит по определённым параметрам, которые задаются при запуске утилиты.
Соединение с БД: посредством знакомой нам уже libpq. Также, если выбран многопоточный режим, то для каждого потока будет отдельное соединение.
Восстановление: исполнение SQL-команд.
Ключи:
-U имя пользователя-h хост-p порт-d целевая база данных-F формат (обычно не нужен — определяется автоматически)-v подробный вывод-c удалить объекты перед созданием-C создать базу перед восстановлением-j N параллельное восстановление (N — число потоков)--list показать содержимое дампа--schema восстановить только указанную схему--table восстановить только указанную таблицуВ этом посте мы разобрались с CLI-инструментами, в следующем посте перейдём к формату дампов, поддержите реакцией.
@postgresql | 😊 @iscode