从 pg_dump 中删除表空间

Kil*_*ode 1 postgresql sed sh

我正在尝试编写一个脚本来从只接受 ssh 连接到本地机器的远程机器导入数据库模式。

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

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

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

有人能告诉我一种删除 sql 转储中所有表空间出现的方法吗?像 sed 什么的。

非常感谢!

Erw*_*ter 5

我曾经通过管道 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
Run Code Online (Sandbox Code Playgroud)
  • -e' /^CREATE TABLESPACE / d' ...删除以“CREATE TABLESPACE”开头的行。

  • -e 's/ *TABLESPACE .*;/;/'...从CREATE TABLEorCREATE INDEX语句中修剪表空间子句(总是在 pg_dump 输出的行尾)。

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

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

查看这样的页面以获取更多信息sed