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

bro*_*ock 4 postgresql pg-dump

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

bro*_*ock 10

看起来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


小智 6

这个小脚本可以做到。

    #!/bin/bash

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

    sed  "/connect.*$2/,\$!d" $1 | sed "/PostgreSQL database dump complete/,\$d"
Run Code Online (Sandbox Code Playgroud)

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