从pg_dump中删除表空间

时间:2012-02-27 15:09:54

标签: postgresql sed sh

我正在尝试编写一个脚本,以便从只接受与本地连接的ssh连接的远程计算机导入数据库模式。

我设法做任何事情,除了保持远程数据库的相同编码。

我发现解决方案是使用带有-C(创建)的pg_dump,这样我就能用相同的编码创建数据库,但是我遇到了问题...远程数据库中有一个表空间我不想导入它。

我知道psql的最新版本已经有了no-tablespace参数......但是不幸的是,我不允许升级postgres版本。

有人能告诉我一种方法来删除sql转储上的所有表空间事件吗?喜欢与sed或其他东西。

非常感谢!

1 个答案:

答案 0 :(得分:4)

我曾经通过管道pg_dump到sed在我更改TABLESPACE子句之间来切换安装之间的表空间。

您也可以删除它,并使用任何编辑器从转储文件中删除CREATE TABLESPACE ..并且您可以将其加载到另一个数据库集群。

我很久以前就转到了可以使用--no-tablespaces选项的新版本。 根据您的设置,shell命令在Linux中可能看起来像这样 - 从我的脑子里开始,只测试粗略的:

pgdump -h 123.456.7.89 -p 5432 mydb \
| sed \
 -e' /^CREATE TABLESPACE /  d' \
 -e 's/ *TABLESPACE .*;/;/' \
 -e 's/SET default_tablespace = .*;/SET default_tablespace = '';/'
| psql -p5432 mylocaldb
  • -e' /^CREATE TABLESPACE / d' ...删除以“CREATE TABLESPACE”开头的行。

  • -e 's/ *TABLESPACE .*;/;/' ...从CREATE TABLECREATE INDEX语句修剪tablespace子句(始终位于pg_dump输出行的末尾)。

  • -e "s/SET default_tablespace = .*;/SET default_tablespace = '';" ..取消除空字符串之外的任何其他默认表空间 - 表示当前数据库的默认表空间。请注意使用双引号",因此我可以轻松输入单引号'

如果您知道所涉及的表空间的名称,可以缩小范围。理论上有可能数据线可以像搜索术语之一那样开始。不过,我自己从未遇到过问题。

有关sed的详细信息,请查看a page like this