我正在倾倒一个大邮政表:
pg_dump -h myserver -U mt_user --table=mytable -Fc -Z 9 --file mytable.dump mydb
以上创建mytable.dump
文件。我现在想将此转储还原到一个名为mytable_restored
的新表中。
如何使用pg_restore
命令来执行此操作?
没有pg_restore
重命名表的选项。
我会这样做:
-- create a table that is defined like the original
CREATE TABLE mytable_restored (LIKE mytable INCLUDING ALL);
-- copy the table contents
COPY mytable TO '/tmp/mytable.dmp';
COPY mytable_restored FROM '/tmp/mytable.dmp';
您可以将sed添加到pg_dump上,以便当pg_dump输出表名称时,SED将其替换为正确的。
pg_dump mytable mydb | sed 's/mytable/mytable_restored/g' > mytable_restored.dump
我的答案可能不是问题的确切答案,而是我的案件(带有许多表格的目录转储(,我改善了劳伦兹的答案,这可能很有用。
就我而言,我只需要两个表即可恢复到另一个位置。首先,我在新位置创建了表。我在toc.dat文件中找到了表数据。
pg_restore -Fd <dir_name> -l | grep <table_name>
这可能会返回比单行更多。然后,我们寻找"表数据"行。获取[file_number] .dat.gz文件并在psql中的copy命令中使用它。
COPY <table_name> from PROGRAM 'zcat /<path>/<file_number>.dat.gz'
从PG-13开始,没有内置的方式,但是如果您使用Unix-ish系统和Perl安装,我在下面有简单的解决方案桌子名称不包含空格。
进入您的转储目录并运行
pg_restore -l -Fd . |
perl -ln -e '$Z=".gz";' -e 'print qq(mv "$1.dat$Z" "$3.sql$Z") if /^(d+);.* TABLE DATA (S+) (S+) (S+)$/'
相应地更改"$Z=".gz"
,具体取决于系统的压缩文件名延伸(或用--compress=0
转储时设置为空字符串(。
如果结果看起来还不错,请再次运行,然后将整个物件通过外壳进行管道,即| /bin/sh
。