Как сделать резервную копию данных 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 и запустить для импорта данных дампа.

Ссылки/Полезные ссылки

Заметки

Мне понадобился pg_dump в качестве начальных данных для использования при переносе Hasura из старого экземпляра в новый экземпляр Hasura. Но (в моем случае) первоначальный результат миграции Hasura CLI на старом экземпляре включал кучу hdb_catalogсоздать операторы схемы, которые обеспечат сбой при переносе на новый экземпляр Hasura. (Схема/таблицы hdb_catalog уже существуют в новой/свежей установке Hasura)

Чтобы исправить это, мне нужно было сбросить миграции на старом экземпляре и повторить команды миграции (как показано в вышеупомянутой ссылке). Эти новые выходные данные миграции не включали схему hdb_catalog и могли быть успешно применены к новому экземпляру Hasura.

Затем я мог бы просто запустить вывод pg_dump на вкладке/окне SQL консоли Hasura в новом экземпляре, чтобы повторно заполнить мои таблицы.

Другие вопросы по тегам