Как сделать резервную копию данных postgres на Hasura
Я хочу перенести pg_dump моих данных из HasuraDB на мою локальную машину. Каков рекомендуемый способ сделать это?
3 ответа
Кластер Hasura - это кластер kubernetes, поэтому процесс аналогичен тому, что вы сделали с kubectl
,
Опция 1:
Exec A pg_dump
команда на вашем контейнере:
hasura ms exec -n hasura postgres -- pg_dump -U admin -d hasuradb > public_data.sql
На практике вам, вероятно, нужны только данные, а не метаданные hasura или информация о schema_migration. Это лучшая команда типа "экспорт данных":
hasura ms exec -n hasura postgres -- pg_dump -U admin -d hasuradb --data-only -n public -T schema_migrations > public_data.sql
Вариант 2:
Это более длинная версия вышеуказанного варианта. pg_dump
в кластере и обратно на ваш локальный компьютер
# Exec into the postgres container
$ hasura ms exec -ti -n hasura postgres -- /bin/bash
# Run pg_dump
root@postgres-3391217220-t7bbc:/$ pg_dump -U admin -d hasuradb > hasuradb.sql
^D
#Back on your local machine, copy the dump
$ hasura ms cp hasura/postgres:/hasuradb.sql hasuradb.sql
Вариант 3:
Запустите pg_dump с вашего локального компьютера, предполагая, что на вашем компьютере установлен pg_dump. Минусы: это значительно медленнее, даже для крошечных баз данных. Потому что RTT.
Сначала запустите переадресацию порта для подключения к postgres:
$ hasura ms port-forward -n hasura postgres --local-port 5432
Затем запустите pg_dump с паролем postgres:
$ hasura secrets list
...
postgres.password-------------|xxx-xxx-xxx-xxx
...
$ POSTGRES_PASSWORD=xxx-xxx-xxx-xxx pg_dump -U admin -d hasuradb -h localhost -p 5432 -v > hasuradb.sql
Хасура имеет pgdump
Команда API включена по умолчанию. Вот документы: https://docs.hasura.io/1.0/graphql/manual/api-reference/pgdump.html
Чего в настоящее время не хватает документации, так это примера. Вот пример, который я использую для сброса данных Hasura, но не схемы (которая получена в результате миграции), чтобы импортировать ее в мою локально размещенную хасуру разработчика (вставьте свою собственнуюhasura-admin-secret
(при условии, что вы используете один или при необходимости замените другими заголовками):
HASURA_SECRET=som3_Secr3t_Her3
curl -d '{"-Fc", "opts": ["--data-only"]}' -H "x-hasura-admin-secret: $HASURA_SECRET" https://your-host-url.com/v1alpha1/pg_dump > dumpfile
2022: Хасура v.2.1.1
Чтобы экспортировать данные из экземпляра postgres/Hasura, нам нужно использовать Postman или клиент curl, чтобы сделать HTTP-запрос POST к скрытой конечной точке Hasura.
/v1alpha1/pg_dump
вот так:
http://<your-hasura-host>/v1alpha1/pg_dump
Пример
curl
команда:
curl -d '{"opts": ["-a", "-O", "-x", "--inserts", "--exclude-schema=hdb_catalog"], "clean_output": true, "source": "default"}' -H "x-hasura-admin-secret:your-admin-secret-here" http://your-hasura-host/v1alpha1/pg_dump
Вышеприведенный код добавляет заголовок для указания секрета администратора Hasura:
x-hasura-admin-secret:<your admin secret key>
И
-d
добавляет тело JSON с параметрами ("opts") для обработчика конечной точки pg_dump и Hasura:
{
"opts": ["-a", "-O", "-x", "--inserts", "--exclude-schema=hdb_catalog"],
"clean_output": true,
"source": "default"
}
Параметры pg_dump ("opts") выше:
-
-a
: только данные, а не схемы -
-O
: нет заявлений о праве собственности -
-x
: нет заявлений о привилегиях доступа -
--inserts
: используйте операторы SQL, а не команды psql -
--exclude-schema=hdb_catalog
: нет записей, связанных с миграцией/метаданными Hasura, только наши данные
The
clean_output
ключ/значение удаляет кучу операторов SET и комментариев из вывода дампа, таких как:
--
-- PostgreSQL database dump
--
-- Dumped from database version 12.4 (Debian 12.4-1.pgdg100+1)
-- Dumped by pg_dump version 13.4 (Debian 13.4-4.pgdg100+1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
source
указывает имя базы данных для дампа. Обычно это было бы
default
если вы не изменили его при настройке Hasura.
Результат, который вы получите, должен быть один
SET
заявление, сопровождаемое кучей
INSERT INTO
заявления.
Его можно скопировать/вставить непосредственно на вкладку Данные > SQL консоли Hasura и запустить для импорта данных дампа.
Ссылки/Полезные ссылки
- https://www.postgresql.org/docs/13/app-pgdump.html
- https://hasura.io/docs/latest/graphql/core/api-reference/pgdump.html
- https://hasura.io/docs/latest/graphql/core/migrations/advanced/seed-data-migration.html
Заметки
Мне понадобился pg_dump в качестве начальных данных для использования при переносе Hasura из старого экземпляра в новый экземпляр Hasura. Но (в моем случае) первоначальный результат миграции Hasura CLI на старом экземпляре включал кучу
hdb_catalog
создать операторы схемы, которые обеспечат сбой при переносе на новый экземпляр Hasura. (Схема/таблицы hdb_catalog уже существуют в новой/свежей установке Hasura)
Чтобы исправить это, мне нужно было сбросить миграции на старом экземпляре и повторить команды миграции (как показано в вышеупомянутой ссылке). Эти новые выходные данные миграции не включали схему hdb_catalog и могли быть успешно применены к новому экземпляру Hasura.
Затем я мог бы просто запустить вывод pg_dump на вкладке/окне SQL консоли Hasura в новом экземпляре, чтобы повторно заполнить мои таблицы.