Postgresql 如何将docker postgres image 10.3中的pg_还原升级到10.5

Postgresql 如何将docker postgres image 10.3中的pg_还原升级到10.5,postgresql,docker,pg-restore,table-plus,Postgresql,Docker,Pg Restore,Table Plus,我使用tableplus作为我的一般管理员 目前正在使用docker postgres映像10.3进行生产和本地主机开发 因为tableplus将他们的postgres 10驱动程序升级到了10.5,所以我不能再使用pg_restore来恢复使用10.5--format=custom转储的备份文件 有关如何使用tableplus进行备份的信息,请参见图。以及如何使用10.5驱动程序 我收到的错误消息是pg_restore:[archiver]文件头中不支持的版本(1.14) 我试过的 我试图在

我使用tableplus作为我的一般管理员

目前正在使用docker postgres映像10.3进行生产和本地主机开发

因为tableplus将他们的postgres 10驱动程序升级到了10.5,所以我不能再使用pg_restore来恢复使用10.5
--format=custom
转储的备份文件

有关如何使用tableplus进行备份的信息,请参见图。以及如何使用10.5驱动程序

我收到的错误消息是
pg_restore:[archiver]文件头中不支持的版本(1.14)

我试过的 我试图在localhost中简单地将dockerfile中postgres的标记从10.3更改为10.5,但没有成功

原始dockerfile

FROM postgres:10.3

COPY ./maintenance /usr/local/bin/maintenance
RUN chmod +x /usr/local/bin/maintenance/*
RUN mv /usr/local/bin/maintenance/* /usr/local/bin \
    && rmdir /usr/local/bin/maintenance

我的开发主机系统是macOS

我的开发docker postgres中有许多现有的数据库和模式。因此,如何在不破坏旧数据的情况下安全升级,我目前感到困惑

你能提出建议吗

此外,我认为一个长期的目标是找出如何在docker之外(即在我的主机系统内)拥有数据文件,以便每次我想升级我的postgres docker映像时,我都可以安全地做到这一点,而不必担心


我也想问一下如何切换到这样的设置。

如果我理解正确,您希望将10.5中的自定义格式转储恢复到10.3数据库中

如果存档格式在10.3和10.5之间更改,则不可能实现此功能

作为一种解决方法,您可以使用没有“存档版本”的“普通格式”转储(选项
--format=plain
)。但恢复过程中的任何问题都由您来处理,因为不支持降级PostgreSQL

开发和生产应始终使用相同的版本,并且应始终使用最新的次要版本(当前为10.13)。其他一切都在自找麻烦

  • 以纯文本形式备份,如下所示:警告!文件将是巨大的。大约是常规自定义格式的17倍。我典型的90mb现在是1.75Gb
  • 将备份文件复制到postgres容器
    docker cp~/path/to/dump/in host system/2020-07-08-1.dump:/backups
  • 转到postgres容器的bash
    docker exec-it bash
  • 在postgres容器的bash中:
    psql-U username-d dbname

  • 那会有用的

    是不是输入错误:“使用10.5转储的备份文件”?您是说“10.3”吗?对于基于主机的数据文件,您可以在容器中使用自定义pg_数据文件夹,并将其读写绑定装载到主机文件夹。请记住,如果您有许多IO任务,Docker文件IO并没有那么好。您还可以有一个计划的pg_dumpall命令,只需定期在外部对其进行docker cp即可。@LaurenzAlbe我的意思是10.5。我使用tableplus备份文件,tableplus本身使用10.5驱动程序。查看更新后的问题,请参阅image@VikingPingvin哦嗯,那好的做法是什么呢?更好的做法是将数据文件保存在docker中?在生产中,我们只使用简单的命名卷在postgres容器中存储数据。它位于具有每日备份的VM中。我会把数据文件放在里面,并定期备份以防万一。将它们保存在卷(或绑定装载)中意味着即使pg容器出现故障,它也可以轻松重启,卷也会在那里。请不要意外删除卷。对不起,什么是“没有“存档版本”的纯格式转储?”?只需省略
    --format=custom
    。你可以用psql来恢复它。哦,天哪,它真的起作用了。哈哈哈。我会用更多的笔记更新你的答案,并将其标记为correct@VikingPingvin自定义格式要好得多。1) 数据被压缩2)您可以有选择地提取转储文件的一部分3)您可以使用
    -j
    选项并行恢复转储文件。@b删除您可能是对的。也许OP根本没有试图降级。
    FROM postgres:10.5
    
    COPY ./maintenance /usr/local/bin/maintenance
    RUN chmod +x /usr/local/bin/maintenance/*
    RUN mv /usr/local/bin/maintenance/* /usr/local/bin \
        && rmdir /usr/local/bin/maintenance