如何将二进制的pgdump(压缩)转换为纯SQL文件?

78

我想在数据库转储文件中搜索一些数据,但这些转储文件使用了二进制压缩格式(PGDMP头)。

如何在不还原转储文件的情况下将其转换为SQL?

3个回答

133

pg_restore在没有数据库名称的情况下,会将文本转储输出到标准输出(stdout),您可以通过-f或I/O重定向将其发送到其他位置。

pg_restore -f mydatabase.sql mydatabase.dump 

请注意,您必须确保没有设置PGDATABASE环境变量,否则它将尝试连接到该数据库。


1
当我尝试这样做时,我会得到 pg_restore: [archiver] input file does not appear to be a valid archive。我可以向您保证,这些转储文件是使用相同版本的postgresql 8.4.17制作的。 - sorin
1
抱歉,我刚刚发现那个制作备份的人,在使用 -Fc 后将它们压缩成了 gzip 格式?!而且 mc view 在文件查看时显示的是未压缩的内容... - sorin
这非常有帮助! - Stian Håklev
@sorin,你解决了这个问题吗?我现在也遇到了同样的问题。 - kripindas
1
@kripindas在2014年发布了这篇帖子,我不确定他们是否还记得或看到了这个问题。建议您发布一个新的问题。但是,在此之前,请使用“file the-archive-file-name”命令查找文件类型。 - Craig Ringer
这对我有用。我的文件是一个.dump文件。 - Promise Preston

26

我使用过的最快方法是:

pg_restore -f mybinaryfile.backup > mysqlfile.sql

没有特殊的标志,因为pg_restore只是将其输出到标准输出(stdout)。


7
我必须这样添加 -fpg_restore -f mybinaryfile.backup > mysqlfile.sql - Alex
2
我必须添加“-f”,而我只想恢复一个表,所以最终得到了这个命令:pg_restore -f - --table=users my-backup.dump > users.sql - psmith
更新了答案,谢谢你们两位。 - knownasilya

2
请注意,如果您运行多个集群,则还原命令可能不喜欢默认版本... pg_restore:[archiver]文件头中的不支持的版本(1.12)
在这种情况下,您必须指定版本、主机和端口,如下所示:
pg_restore --cluster 9.1/localhost:5433 -f db.sql db.pgsql

(请注意,使用 -f 选项时将忽略主机:端口信息。)
可以使用 pgsql 命令确定端口号(5433),如下所示:
pgsql --port 5433 template1

pgsql 连接时,它会写入一个注释,例如:

psql (9.3.6, server 9.1.13)

这意味着您正在运行 pgsql 9.3.6,并且端口 5433 引用服务器 9.1.13。
如果您不确定当前使用哪些端口,则可以使用 netstat 命令,例如:
sudo netstat -a64np | grep LISTEN | grep postgres

需要使用sudo命令才能使用-p选项来打印进程名称,从而获得端口列表(通常是TCP和UDP端口)。
最后,在Debian/Ubuntu系统上,您可以使用dpkg -l命令获取已安装的集群列表,如下所示:
dpkg -l '*postgres*'

以 "ii" 开头的条目(最左列)是当前已安装的。当然,您也可以使用其他Unix命令来帮助确定已安装的版本。


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