如何删除以前由devcontainer创建的PostgreSQL数据库?

7uzetpgm  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(134)

我最近不得不删除系统上的所有Docker容器,当VSCode用PostgreSQL重建我的Java devcontainer时,它无法启动。我在日志中得到以下错误:

PostgreSQL Database directory appears to contain a database; Skipping initialization

2023-11-07 20:27:40.074 UTC [1] FATAL:  database files are incompatible with server
2023-11-07 20:27:40.074 UTC [1] DETAIL:  The data directory was initialized by PostgreSQL version 15, which is not compatible with this version 16.0 (Debian 16.0-1.pgdg120+1).

字符串
我假设这是因为新映像使用了旧映像的数据库。这个数据库到底存储在哪里,如果它在docker system prune --all --force --volumes之后仍然存在,我该如何删除它?

h7appiyu

h7appiyu1#

似乎您有一个卷,其中包含与v. 15兼容的PostgreSQL示例,但您试图用postgres:16映像加载它。这是不可能的,因为数据目录与较新版本的Postgres不立即兼容。即使没有Docker,从较旧的数据库示例/集群移动到较新的数据库二进制文件需要1)dump/reload或2)使用pg_upgrade。下面是一些选项:

选项0:查找并删除数据集群

您提到您有3个.yml文件-您需要在对应于postgres:##的服务的volumes:部分下查找。如果不知道实际的目录Map,我不能100%帮助您。但是,由于我们知道您执行了docker system prune --all --force --volumes,并且数据仍然存在,那么我们就知道你试图覆盖的数据不在Docker卷中,而可能是Map到你的主机的某个目录。一旦你确定了是哪个目录,您可以1)从.yml文件中删除Map,或者2)删除Map文件夹的内容

选项1:坚持使用Postgres 15

快速解决此问题,只需在docker-compose.yml文件中从使用postgres:16图像更改为使用postgres:15图像

选项2:使用Postgres 15转储,然后重新加载到Postgres 16

使用postgres:15映像对数据库集群调用pg_dump将导致数据库的逻辑/明文转储。使用此转储,您可以使用新的Docker卷启动postgres:16映像,然后使用psql将转储的内容复制到新数据库中

选项3:使用pg_upgrade对集群进行升级

注意:这要复杂得多,需要一些关于容器如何工作的高级知识。
要使用pg_upgrade,您需要使用postgres:15镜像(最好在Debian/Ubuntu底层操作系统上运行)。您需要使用apt安装Postgres 16,然后使用pg_upgrade升级数据目录。之后,您可以拆除容器,并使用postgres:16容器访问和提供现已更新的数据集群。

相关问题