是否可以从 pg_dumpall 导入一个数据库

Is it possible to import one database from pg_dumpall

我想从 pg_dumpall 按名称获取数据库并将其导入我的本地 postgres。如果可能,我想在本地计算机上使用不同的数据库名称。这可能吗?

不,您需要从转储中提取相关部分。使用 pg_dump --format=custom 可以让您在恢复方面更加灵活,但我认为也无法恢复到不同的数据库。

编辑:实际上,您可以使用 pg_restore --dbname=foo

似乎 PostgreSQL 没有内置的方法来执行此操作,所以我将一个脚本放在一起可以为我处理这个问题。下面是我学到的,gist里面的评论比较多,但是概括一下:

pg_dumpall 包含几个 SQL 导入语句,一个用于服务器上的每个数据库。

您可以通过搜索这两个字符串轻松找到每个数据库的开始和结束:

\connect databasenamePostgreSQL database dump complete

这两个字符串之间的内容构成了每次导入。我从我创建的导出中省略了第一行。在脚本顶部使用 \connect databasename 意味着数据库必须已经存在。因此,如果您想以不同的名称导入数据库,您可以安全地删除第一行,然后 运行 您的导入方式如下:

psql new_databasename < databasename.sql

在大型数据库上 运行 这确实需要很长时间,所以我可能会在以后重构它以在需要时加快它的速度,但现在它可以工作。它还吐出一个 postgres.sql 导出,我还没有测试导入那个,但是如果你只想从 pg_dumpall 中提取一个数据库,这就可以了。

https://gist.github.com/brock/63830f11c0945f82f9ea

将此 gist 中的文件保存到您的 ~/bin 中作为 pg_extract,使其可执行,您可以通过传递原始 sql 转储的文件名来 运行 它: pg_extract postgresql_dump.sql。您将在当前目录的转储中为每个数据库创建一个 .sql 文件。

编辑:我现在更新了脚本,这样您就可以传递要提取的数据库的名称,它就会停在那里。例如:pg_extract postgresql_dump.sql databasename 输出单个 databasename.sql

这个小脚本就能做到。

    #!/bin/bash

    [ $# -lt 2 ] && { echo "Usage: [=10=] <postgresql dump> <dbname>"; exit 1; }

    sed  "/connect.*/,$!d"  | sed "/PostgreSQL database dump complete/,$d"

(它写入 STDOUT,您必须将其通过管道传输到文件。)