如何将来自PG_DUMP的输出还原为新的表名称



我正在倾倒一个大邮政表:

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

相关内容

  • 没有找到相关文章

最新更新