【问题标题】:How do I take a postgres data backup on Hasura如何在 Hasura 上进行 postgres 数据备份
【发布时间】:2018-07-17 14:15:21
【问题描述】:

我想将我的数据的 pg_dump 从 HasuraDB 带到我的本地机器。推荐的方法是什么?

【问题讨论】:

标签: postgresql pg-dump hasura


【解决方案1】:

2022:Hasura v.2.1.1

要从 postgres/Hasura 实例导出数据,我们需要使用 Postman 或 curl 客户端对隐藏的 Hasura 端点 /v1alpha1/pg_dump 发出 http POST 请求,如下所示:

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 为 pg_dump 和 Hasura 的端点处理程序添加了一个带有选项(“opts”)的 JSON 正文:

{
  "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 迁移/元数据相关记录,只有我们的数据

clean_output 键/值从转储输出中删除一堆 SET 语句和 cmets,例如:

--
-- 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 语句。

这可以直接复制/粘贴到 Hasura 控制台的数据 > SQL 选项卡并运行以导入转储的数据。

参考/有用的链接

注意事项

我需要 pg_dump 作为种子数据,以便在 applying a Hasura migration 从旧实例到新 Hasura 实例时使用。但是(在我的例子中)Hasura CLI 在旧实例上的初始迁移输出包括一堆hdb_catalog create schema 语句,这将确保在将迁移应用到新的 Hasura 实例时失败。 (hdb_catalog 模式/表已经存在于新的/全新的 Hasura 安装中)

为了纠正这个问题,我需要在旧实例上 reset migrations 并重做迁移命令(如上述链接所示)。这个新的迁移输出不包括 hdb_catalog 架构,可以正常应用到新的 Hasura 实例。

然后我可以在新实例的 Hasura 控制台 SQL 选项卡/窗口中运行 pg_dump 输出来重新填充我的表。

【讨论】:

    【解决方案2】:

    选项 1:

    在 Postgres 容器上执行 pg_dump 命令:

    pg_dump -U username -d dbname > data.sql
    

    实际上,您可能只需要数据而不是 hasura 元数据或 schema_migration 信息。这是一个更好的“数据导出”类型命令:

    pg_dump -U username -d dbname --data-only --schema public > data.sql
    

    选项 2:

    如果 Postgres 作为 Docker 容器运行:

    # Exec into the postgres container
    $ docker exec -ti <postgres-id> -- /bin/bash
    # Run pg_dump
    root@postgres-3391217220-t7bbc:/$ pg_dump -U postgres -d postgres --data-only --schema public > db.sql
    ^D
    
    # Back on your local machine, copy the dump
    $ docker cp <postgres-id>:/db.sql db.sql
    

    【讨论】:

    • 我得到 "unknown command "ms" for "hasura" - 我是否需要从 Hasura 微服务/主机中的 SSH 之类的东西运行这些命令,而不是本地?
    【解决方案3】:

    Hasura 有一个pgdump API 命令,默认启用。以下是文档:https://docs.hasura.io/1.0/graphql/manual/api-reference/pgdump.html

    文档目前缺少的只是一个示例。这是我用来转储 Hasura 数据的示例,而不是模式(来自迁移),以便将其导入我本地托管的 dev 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
    

    【讨论】:

    • 我得到一个 curl:(7)无法连接到 postgres 端口 443:操作超时错误。任何线索为什么?
    • 我认为文档自发布以来已略有更新 - 现在有一些简短示例(不是完整的 curl 示例)。请注意,此示例中的 JSON 无效,并且我在 opts 数组中传递 -Fc 没有成功(Hasura 返回 { "path": "$", "error": "internal exception while executing pg_dump", "code": "unexpected" })。 Tx, ptim
    • 我不久前提交了一个问题,但那里还没有动静:github.com/hasura/graphql-engine/issues/5671
    • 我也有 pgdump 失败并删除 -Fc / --format custom 修复了它。我认为这是因为 hasura 的 postgres 客户端安装与 postgresql 数据库的版本不同。此选项需要匹配的主要版本才能工作。
    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 2017-07-10
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2019-09-21
    相关资源
    最近更新 更多