如何在 Hasura 上进行 PostgreSQL 数据备份

11

我想从 HasuraDB 中将我的数据 pg_dump 到本地机器,有什么推荐的方法吗?


请问您能否提供一下您已经查阅的资源的详细信息? - F_SO_K
1
请花点时间阅读帮助页面,特别是名为"我可以在这里问什么问题?""哪些类型的问题应该避免提问?"的部分。更重要的是,请阅读Stack Overflow问题清单。您还可以学习一下最小、完整和可验证示例 - Clijsters
3个回答

13

选项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

2
使用此命令时,我收到了“hasura”的“ms”未知命令 - 我需要从Hasura微服务/主机内部运行这些命令,而不是在本地运行吗? - user56reinstatemonica8

9

Hasura默认启用了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

我得到了一个curl:(7)无法连接到postgres端口443:操作超时的错误。 有什么线索吗? - Vaibhav Verma
3
我认为自发布以来文档已经稍作更新-现在有一些简短的示例(不是完整的curl示例)。请注意,此示例中的JSON无效,并且我在opts数组中未能成功传递-Fc选项(Hasura返回 { "path": "$", "error": "internal exception while executing pg_dump", "code": "unexpected" })。谢谢,ptim - ptim
我一段时间前提交了一个问题,但那里还没有任何进展:https://github.com/hasura/graphql-engine/issues/5671 - ptim
我也曾遇到过pgdump失败的情况,但是移除 -Fc / --format custom 后问题得到了解决。我猜测这是因为Hasura的PostgreSQL客户端安装版本与PostgreSQL数据库不同。为了让此选项正常工作,需要相匹配的主要版本。 - Lars Blumberg

6

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 添加了一个 JSON 格式的请求体给 pg_dump 和 Hasura 的端点处理程序中的选项 ("opts"):

{
  "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语句和注释,例如:

--
-- 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 控制台的 Data > SQL 标签页中并运行以导入已转储的数据。

参考/有用的链接

注释

我需要将 pg_dump 作为种子数据使用,当从旧实例迁移到新的 Hasura 实例时,用于应用 Hasura 迁移。但是,(在我的情况下)Hasura CLI 在旧实例上生成的初始迁移包括一堆 hdb_catalog 创建模式语句,这将确保在新的 Hasura 实例上应用迁移时失败。(hdb_catalog 模式/表已经存在于新/干净的 Hasura 安装中)

为了纠正这个问题,我需要在旧实例上重置迁移,然后重新执行迁移命令(如上述链接所示)。这个新的迁移输出不包括 hdb_catalog 模式,可以顺利地应用到新的 Hasura 实例。

然后我只需在新实例的 Hasura 控制台 SQL 标签页/窗口中运行 pg_dump 输出以重新填充我的表格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接