如何将 pg_dump 的输出恢复到新的表名中

问题描述 投票:0回答:5

我正在转储一个大的 Postgres 表,如下所示:

pg_dump -h myserver  -U mt_user --table=mytable  -Fc -Z 9 --file mytable.dump mydb

上面创建了一个

mytable.dump
文件。我现在想将此转储恢复到一个名为
mytable_restored
的新表中。

如何使用

pg_restore
命令来执行此操作?

postgresql pg-restore
5个回答
14
投票

没有

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';

1
投票

您可以将 sed 附加到 pg_dump 中,这样当 pg_dump 输出表名时,sed 会将其替换为正确的名称。

pg_dump mytable mydb | sed 's/mytable/mytable_restored/g' > mytable_restored.dump

0
投票

我的答案可能不是问题的确切答案,但对于我的情况(具有许多表的目录转储),我改进了劳伦斯的答案,它可能有用。
就我而言,我只需要两个表即可恢复到另一个位置。 首先,我在新位置创建了表。 我在 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'

0
投票

从 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


0
投票

好吧,如果您不需要保持当前的

DB.mytable
在线 - 您可以:

  1. 将其重命名为
    ALTER TABLE
    mytable_live_tmp
    ,
  2. 导入转储
    mytable
    并将其重命名为
    mytable_restored
    ,
  3. 然后将
    mytable_live_tmp
    重命名为
    mytable
© www.soinside.com 2019 - 2024. All rights reserved.