Docker postgres 无效的主检查点记录

2024-02-08

我一直在尝试让 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,所以我很可能在这里遗漏了一些简单的东西。


The 接受的答案 in 这个相关帖子 https://stackoverflow.com/a/66551286/13248285要求删除 docker 卷意思就是PostgreSQL实例中的所有数据都将丢失!!!

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

我碰到这个答案 https://stackoverflow.com/a/8812934/13248285它要求重置事务预写日志(WAL)。这适用于数据库作为应用程序安装而不是作为容器运行的场景。但是,对于 docker,容器本身由于以下错误而无法部署

PANIC:无法找到有效的检查点记录

Solution

这种情况下的解决方案是使用docker run命令与 postgres 映像并在正确的 PGDATA 路径(您之前配置的)上安装相同的物理卷,然后直接登录到 bash shell。

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

The <PGDATA_path> is /var/lib/postgresql/data如果您没有更改,则默认。 如果您使用的是 docker 卷,则需要从卷列表中找出 docker 卷名称:docker volume ls。获取卷名然后使用docker run像下面这样。

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

获得容器的 shell 后,您现在可以使用以下命令重置 WAL

# Postgres >= 10
pg_resetwal <PGDATA_path>

# Postgres < 10
pg_resetxlog <PGDATA_path>

Use the -f选项(如果需要)。参考PostgreSQL 文档pg_resetwal https://www.postgresql.org/docs/14/app-pgresetwal.html有关同一内容的更多详细信息。

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

Notes

  1. 一些数据仍然可能会丢失,特别是在WAL没有达成共识的地方。
  2. 一些依赖于数据库的应用程序可能会引发进一步的错误,例如“数据库日志已重置,未找到插入的数据”。在这种情况下,您将必须重置这些应用程序的写入头。
  3. 访问我的回答here https://stackoverflow.com/a/72640402/13248285了解这种情况何时/为何发生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker postgres 无效的主检查点记录 的相关文章

  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 无法访问本地 Docker 容器上的 Asp.Net Core

    我在 asp net core 中创建了一个应用程序 并创建了一个 dockerfile 来生成本地映像并运行它 FROM microsoft dotnet latest COPY app WORKDIR app RUN dotnet re
  • docker 容器无法启动,因为现有的 pid 文件

    当我启动 docker 容器时 它会失败 因为现有的 pid 文件 root newhope sergio docker logs sharp shockley httpd pid 1 already running httpd pid 1
  • 带有可变 WHERE 子句的批量 UPDATE 表

    我有一堆值对 foo1 bar1 foo2 bar2 我想做一堆更新 将 foo 列设置为 foo1 其中 bar 列为 bar1 我正在使用 psycopg2 在 Python 中执行此操作 我可以executemany与查询UPDATE
  • 在 Postgres 中存储加密数据 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要在 Postgres 中以加密形式存储某些数据 显然 我需要对其进行加密 存储 并且能够读取和解密 做这个的最好方式是什么 The bes
  • 使用 Docker 文件分配附加功能

    我需要部署 Docker 映像 但我只想使用 Docker run 命令而不使用其任何参数 我想在运行容器时分配特殊权限 这是我的 Docker 运行命令 docker run cap add SYS ADMIN cap add DAC R
  • NSQ Docker Swarm

    我尝试在 Docker Swarm 中使用 NSQ 但没有成功 mhlg rpi nsq 是为 Raspberry Pi ARM7 板构建的 Docker 映像 如果作为普通 Docker 容器运行 我可以确认其工作正常 在 Docker
  • 使用 PostGIS 拥有通用 GEOGRAPHY 列

    在 PostgreSQL 9 PostGIS 1 5 中 有没有办法创建 通用 GEOGRAPHY 列 我指的是接受 POINT 以及 POLYGON LINESTRING 等的列 到目前为止 我只在 Internet 上看到过像 GEOG
  • 适用于elasticsearch 7.0.1 和 kibana 7.0.1 的 docker-compose.yml

    我在 Windows 10 上将 Docker Desktop 与 Linux 容器结合使用 并希望通过 docker compose 文件启动最新版本的 elasticsearch 和 kibana 容器 使用 6 2 4 等旧版本时一切
  • 如何判断我是否通过脚本登录到私有 Docker 注册表?

    如何判断我是否通过脚本登录到私有 Docker 注册表服务器 换句话说 有docker login some registry com已成功运行 并且仍然有效 注意 我问的是任意私有注册表 而不是docker io注册表 如果 docker
  • PostgreSQL - 致命:用户“myuser”身份验证失败[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我刚刚在我的 Ubuntu Box 中安装了 PostGreSQL 我想做的第一件事就是创建一个数据库 我读了文档 http www postgres
  • SQL查询查找具有特定数量关联的行

    使用 Postgres 我有一个架构conversations and conversationUsers Each conversation有很多conversationUsers 我希望能够找到具有确切指定数量的对话conversati
  • Docker 教程入门第 4 部分连接被拒绝

    我不明白我错过了什么 docker compose yml version 3 services web replace username repo tag with your name and image details image sv
  • FreeBSD 可以在 Docker 中运行吗?

    我一直在寻找一个Docker的图像FreeBSD但找不到 FreeBSD可以在docker中运行吗 如果没有 为什么不呢 从未来编辑 不 你不能 以下项目都没有超越原型 从技术上讲是可以的 但是你需要一个 FreeBSD 主机来完成它 而
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • PHP-docker容器中的环境变量

    我想在我的 docker 容器中显示一个环境变量 PHP 脚本如下所示 我使用 OpenShift 来启动容器 PHP 容器显示 env is 现在我更改容器的 dc 配置 oc env dc envar USER Pieter deplo
  • Django 独特的不工作

    我在从查询中过滤掉重复项时遇到问题 我正在使用 Django 1 4 和 Postgres 8 4 13 我在我的模型对象上使用这个查询 它是一个 jquery 自动完成 term request GET get term field re
  • Composer 文件中的 Docker 健康检查

    我尝试将新的健康检查集成到我的 docker 系统中 但我真的不知道如何以正确的方式进行 问题是 我的数据库容器需要比启动主应用程序的容器更多的时间来启动和初始化数据库 结果 主容器无法正确启动 导致数据库连接丢失 我编写了一个 healt
  • 在 plpgsql 函数中使用 quote_ident()

    我是创建 plpgsql 函数的新手 我需要一些有关在函数内部执行的动态命令上使用 quote ident 甚至 quote literal 的说明 希望有人能给我一个关于它们如何在函数内部工作的具体解释 TIA 这是一个例子 EXECUT
  • Rails 的多个数据库不适用于远程数据库

    我有一个远程只读 postgres 数据库 它是通过 docker 实例维护的卡尔达诺数据库同步 https github com input output hk cardano db sync 我设法将开发数据库连接到它 它工作正常 但由

随机推荐