gpt4 book ai didi

postgresql - 从 pg_dump 中删除表空间

转载 作者:行者123 更新时间:2023-11-29 12:38:46 24 4
gpt4 key购买 nike

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

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

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

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

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

非常感谢!

最佳答案

我曾经通过 sed 管道 pg_dump 在安装之间切换表空间,我在其中更改了 TABLESPACE 子句。

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

我很早就开始使用可以使用 --no-tablespaces 选项的较新版本。根据您的设置,Linux 中的 shell 命令可能看起来像这样 - 从我的头顶开始,只粗略地测试过:

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 .*;/;/' ... 从 中删除表空间子句(总是在 pg_dump 输出的行尾) CREATE TABLECREATE INDEX 语句。

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

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

查看 a page like this 以获取有关 sed 的更多信息。

关于postgresql - 从 pg_dump 中删除表空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9467298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com