gpt4 book ai didi

postgresql - Docker postgres 无效的主检查点记录

转载 作者:行者123 更新时间:2023-11-29 13:16:28 25 4
gpt4 key购买 nike

我一直在尝试让 postgres 在 Docker(在 Windows 上)中运行并具有持久数据存储,并认为我终于拥有了它,但现在当我尝试启动我的容器时,我收到以下错误:

LOG:  invalid primary checkpoint record
LOG: invalid secondary checkpoint record
PANIC: could not locate a valid checkpoint record

这是我启动并运行容器的方法:

docker volume create ct_data
docker run --name postgres_ct -v ct_data:/var/lib/postgresql/data -p 5432:5432 postgres

然后我使用 pgAdmin 连接到它,创建了一个新表,并使用恢复选项导入了一个 postgres 转储文件。数据加载没有问题。我启动了第二个容器,使用与上面相同的卷,但使用不同的名称和端口号来测试它,我能够连接,所以我将其关闭。

现在,一个小时后,我发现我原来的容器自动停止了,所以我尝试重新启动它,但出现了上述错误。这是我第一次尝试使用 Docker,所以我很可能在这里遗漏了一些简单的东西。

最佳答案

this related post 中的接受的答案要求删除 docker volume 这意味着 PostgreSQL 实例中的所有数据都将丢失!!!

我最近在一个存储了数月数据的环境中遇到了同样的问题。因此,移除/删除卷是(非常非常)最后的手段。

我遇到了 this answer它要求重置事务预写日志 (WAL)。这适用于数据库作为应用程序安装而不作为容器运行的场景。然而,在 docker 的情况下,容器本身由于以下错误而无法部署

PANIC: could not locate a valid checkpoint record

解决方案

这种情况下的解决方案是使用docker run使用 postgres 镜像执行命令并将相同的物理卷挂载到正确的 PGDATA 路径(您之前已配置)并直接登录到 bash shell。

docker run -it -v /data/postgres_data:<PGDATA_path> postgres:14 /bin/bash

<PGDATA_path>/var/lib/postgresql/data默认情况下,如果你没有改变它。如果您使用的是 docker 卷,则需要从卷列表中找出您的 docker 卷名称:docker volume ls .获取卷名,然后使用 docker run如下所示。

docker run -it -v <docker_volume_name>:<PGDATA_path> postgres:14 /bin/bash

一旦你有了容器的外壳,你现在可以使用重置 WAL

# Postgres >= 10
pg_resetwal <PGDATA_path>

# Postgres < 10
pg_resetxlog <PGDATA_path>

使用 -f如果需要选项。引用PostgreSQL Documentation on pg_resetwal 了解更多详情。

现在,退出容器的 shell 并使用 docker-compose 重新部署容器/docker stack ,无论您使用哪个,您都将在保留所有数据的同时成功恢复您的数据库。

注意事项

  1. 一些数据可能仍然会丢失,尤其是在 WAL 没有达成共识的地方。
  2. 一些依赖数据库的应用程序可能会抛出更多错误,例如“数据库日志已重置,未找到插入的数据”。在这种情况下,您将不得不重置这些应用程序的写入头。
  3. 访问我的答案 here了解发生这种情况的时间/原因。

关于postgresql - Docker postgres 无效的主检查点记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48197579/

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