没有模式名称的postgresql pg_dump

问题描述 投票:0回答:6

pg_dump 版本 10.3 开始将模式名称显式添加到表名称中。那么以前是怎样的

INSERT INTO table (id) VALUES (1);

现在

INSERT INTO public.table (id) VALUES (1);

如何将其关闭?我的问题是,我将其转储到没有模式名称的 mariadb 中。

postgresql pg-dump pg-restore postgresql-10
6个回答
2
投票

如果您像我一样只关心 INSERT 语句,那么我相信这是安全的,并且会从您的表中删除“公共”模式。

sed -i -e 's/^INSERT INTO public\./INSERT INTO /' <filename.sql>

它会就地修改文件,所以要小心。


1
投票

我也搜索过这个切换器,但它不存在。 添加此行为的原因是 - https://wiki.postgresql.org/wiki/A_Guide_to_CVE-2018-1058:_Protect_Your_Search_Path

在我的工作中,我现在使用转储的新变体,并在事务中重命名模式。


0
投票

通过对 pg_dump 源进行一些

修改
,您可以恢复以前的行为,使得
INSERT
语句不包含架构名称。

要使用这些更改构建 Docker 映像,请创建一个包含以下内容的

Dockerfile

FROM alpine:latest

WORKDIR /usr/src/postgresql

RUN apk add --no-cache \
    alpine-sdk \
    perl \
    readline-dev \
    zlib-dev \
    bison \
    flex \
    git \
    coreutils \
    linux-headers \
    util-linux-dev

RUN git clone \
    --depth 1 \
    --branch feat/schema-less-pg-dump-11 \
    https://github.com/tindzk/postgres.git .

RUN ./configure && make

RUN cp src/bin/pg_dump/pg_dump /usr/bin/ && \
    cp ./src/interfaces/libpq/libpq.so* /usr/lib/

RUN apk del alpine-sdk \
    && rm -rf /var/cache/apk/* /usr/src/postgresql

CMD ["pg_dump"]

然后,按如下方式使用:

docker build -t pgdump-11 .

docker run \
  -e PGPASSWORD=$db_password \
  -v "$(pwd)":/data/ \
  pgdump-11 \
  pg_dump \
  --verbose \
  "postgres://$db_user@$db_host:$db_port/$db_name" \
  --schema $db_schema \
  --file /data/dump.sql

这种方法比模式匹配更稳健,并且避免了误报的风险。


-3
投票

当然这只是linux的决定(不是postgres),但我想它对你有帮助

sed -i 's/public.//g' your_dmp_file

P.s.我没有检查这个,也许你应该修复它


-3
投票

如果你安装了 Docker,你可以做一个技巧:

docker run -it postgres:10.2 pg_dump postgresql://user:pass@host/database

-4
投票

在 postgresql 控制台(连接到数据库)中执行此命令:

set search_path to public;
© www.soinside.com 2019 - 2024. All rights reserved.