【问题标题】:remove tablespaces from pg_dump从 pg_dump 中删除表空间
【发布时间】:2012-03-17 01:27:08
【问题描述】:

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

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

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

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

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

非常感谢!

【问题讨论】:

    标签: postgresql sed sh


    【解决方案1】:

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

    您也可以只删除它,然后使用任何编辑器从转储文件中删除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 .*;/;/' ... 从CREATE TABLECREATE INDEX 语句中修剪表空间子句(始终位于 pg_dump 输出的行尾)。

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

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

    查看a page like this 了解有关sed 的更多信息。

    【讨论】:

    • 是的,问题是我需要在脚本中包含它,因此删除表空间的 sed 命令将是最好的解决方案......虽然我不完全理解 sed 我不知道应该如何sed 命令将其删除
    • 我自己弄明白了,呵呵,用 sed s/TABLESPACE/;--TABLESPACE 之类的东西
    • @Killercode:也应该可以工作——除了CREATE TABLESPACESET default_tablespace,如果它们应该在那里的话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2011-11-15
    • 2019-12-10
    • 2013-05-12
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多