我正在转储一个大的 Postgres 表,如下所示:
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>
这可能会返回不止一行。然后我们寻找“TABLE DATA”行。获取 [file_number].dat.gz 文件并在 psql 中的复制命令中使用它后,如下所示。
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
转储时设置为空字符串)。
如果结果看起来不错,请再次运行,并将整个过程通过 shell 进行管道传输,即
| /bin/sh
。
好吧,如果您不需要保持当前的
DB.mytable
在线 - 您可以:
ALTER TABLE
为 mytable_live_tmp
,mytable
并将其重命名为mytable_restored
,mytable_live_tmp
重命名为 mytable
。