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

时间:2015-07-20 20:27:16

标签: postgresql pg-dump

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

3 个答案:

答案 0 :(得分:9)

似乎PostgreSQL没有内置的方法来执行此操作,所以我将一个脚本放在一起,可以为我处理这个问题。这是我学到的东西,并且在要点中有更多的评论,但简而言之:

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

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

\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

答案 1 :(得分:0)

这个小脚本就可以了。

    #!/bin/bash

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

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

(它写入STDOUT,你必须将它传送到一个文件。)

答案 2 :(得分:-1)

不,您需要从转储中提取相关部分。使用pg_dump --format = custom可以为恢复提供更多的灵活性,但我不认为可以恢复到不同的数据库。

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