我想从pg_dumpall中获取一个指定名称的数据库,并将其导入到我的本地postgres。如果可能,我希望在我的本地机器上使用不同的数据库名称。是否可行?
我想从pg_dumpall中获取一个指定名称的数据库,并将其导入到我的本地postgres。如果可能,我希望在我的本地机器上使用不同的数据库名称。是否可行?
pg_dumpall
包含多个SQL导入语句,每个语句对应服务器上的一个数据库。\connect databasename
和PostgreSQL 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 dump文件的文件名来运行它:pg_extract postgresql_dump.sql
。您将在当前目录中找到每个数据库的.sql
文件。
编辑:我现在已经更新了脚本,以便您可以传递要提取的数据库名称,并在那里停止。例如:pg_extract postgresql_dump.sql databasename
会输出一个单独的databasename.sql文件。
#!/bin/bash
[ $# -lt 2 ] && { echo "Usage: $0 <postgresql dump> <dbname>"; exit 1; }
sed "/connect.*$2/,\$!d" $1 | sed "/PostgreSQL database dump complete/,\$d"
sed
使用。谢谢! - workflowsed --regexp-extended "/\\\\connect\\s+$1/,\$!d" "$2" | sed "/PostgreSQL database dump complete/,\$d"
- KeKrupg_restore:[归档程序] 输入文件似乎是文本格式的转储。请使用psql。
- Simon Woodside
initdb
初始化操作,然后将pg_dumpall
输出还原到该实例上,并仅使用pg_dump -Fc
命令备份所需的数据库以便于后续pg_restore
操作。 - Craig Ringer