使用 Docker,触发 PANIC 的原因:无法找到有效的检查点记录

2024-02-22

我试图更好地理解 Docker,但在这样做的过程中,我似乎损坏了我的应用程序的 PostgreSQL 数据库。

我正在使用 Docker Swarm 启动我的应用程序,但在 PostgreSQL 容器中的循环中收到以下错误:

    2021-02-10 15:38:51.304 UTC 120 LOG:  database system was shut down at 2021-02-10 14:49:14 UTC
    2021-02-10 15:38:51.304 UTC 120 LOG:  invalid primary checkpoint record
    2021-02-10 15:38:51.304 UTC 120 LOG:  invalid secondary checkpoint record
    2021-02-10 15:38:51.304 UTC 120 PANIC:  could not locate a valid checkpoint record
    2021-02-10 15:38:51.447 UTC 1 LOG:  startup process (PID 120) was terminated by signal 6
    2021-02-10 15:38:51.447 UTC 1 LOG:  aborting startup due to startup process failure
    2021-02-10 15:38:51.455 UTC 1 LOG:  database system is shut down

最初,我试图修改pg_hba.conf通过转到 FS 中的挂载驱动器来将文件存储在容器中,该驱动器位于

 /var/lib/docker/volumes/postgres96-data-volume/_data

但是,每次我重新启动容器时,我都会更改为pg_hba.conf被恢复。所以今天早上我添加了一个名为的虚拟文件test在挂载文件夹中,并重新启动容器,希望删除该文件以获得视觉验证,重新启动容器会自动将该挂载中的所有内容替换为其原始格式。再次重新启动后,我开始收到这些错误消息,阻止我的应用程序启动。

我删除了test文件并再次重新启动容器,但错误消息仍然存在。

我阅读了许多有关如何修复它的解决方案,但我的问题更多的是了解为什么添加文件会导致这种情况?我的卷是否仅仅因为我在其中添加了文件而损坏了?

Thanks


WARNING

对于那些直接使用已接受答案中的解决方案的人来说,这是您的WARNING:

解决方案在接受的答案要求删除 docker 卷意思就是PostgreSQL实例中的所有数据都将丢失!!!

参考我的回答here https://stackoverflow.com/a/72640430/13248285如果您想保留数据库实例的数据。

我遇到同样错误的上下文

我还使用 docker swarm 来部署容器,最近在尝试扩展 postgres 数据库以创建 2 个副本时遇到了这个问题,两个副本都指向相同的物理卷(使用 docker 安装,使用 NFS 共享)。 这是为了使数据在两个副本之间保持同步所必需的。 但这导致我犯了和你一样的错误

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

我的发现

首先,数据库卷未损坏,只是事务 WAL 已损坏或失去了共识。我对此做了很多挖掘。我发现有两种情况可能会出现这个错误:

  1. 数据库正在执行实时事务,但由于某些错误而突然关闭。在这种情况下,WAL 告诉数据库当它意外关闭时它应该做什么。但是,如果 DB 在 WAL 更新期间关闭,WAL 可能会反映一些实际执行的事务,但具有不正确的执行信息。这会导致 DB 数据与 WAL 不一致,或者事务日志损坏,从而导致检查点错误。

  2. 您创建指向同一卷的数据库的多个副本。考虑一下我遇到的 2 个副本的情况。当两个副本同时尝试在同一数据库卷上执行事务时,事务 WAL 会失去共识,因为有两个同时检查点。数据库无法执行任何进一步的事务,因为它无法确定哪个检查点被视为正确的检查点。如果两个容器(不一定是副本)指向 PG_DATA 的相同安装路径,也可能会发生这种情况。

最终,数据库无法启动。容器不会启动,因为数据库抛出错误并关闭容器。

您可以重置 WAL 来解决此问题。当 WAL 重置时,您将丢失尚未在 DB 上执行的事务的数据。但是,已写入的数据和已处理的事务将被保留。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Docker,触发 PANIC 的原因:无法找到有效的检查点记录 的相关文章

  • 连接被拒绝:当uwsgi和nginx在不同容器中时

    我正在尝试设置两个 docker 容器 是的 无需 docker compose 分开 一个带有 nginx 另一个带有带有基本 Flask 应用程序的 uwsgi 我在 docker 内的同一网络中运行容器我的 nginx 配置已添加 链
  • 如何在 Django QuerySet 中将 DateField() + TimeField() 转换为本地时间?

    我的模型为这些字段 date models DateField 开始时间 models TimeField 结束时间 models TimeField 我想用以下方式注释查询集start datetime and end datetime
  • 使用 NLog .NET Core 将日志记录到 PostgreSQL DB

    我尝试将日志记录集成到 NET Core 中的数据库 我能够设置 NLog 并将消息记录到 SQL Server 这很容易 但是当我尝试将 DB 切换到 PostgreSQL 时 似乎没有记录任何内容 以下是startup cs中的代码 p
  • 将主机中的空文件夹挂载到 Docker 中的非空文件夹

    我正在使用的工具是在 Docker 映像中提供的 由于安装该工具非常复杂 存在大量依赖项 因此我想使用 IDE 在主机上工作 但在容器上运行它 因此 下载并加载图像后 我运行 sudo docker run it v home myself
  • 如何在Django项目中使用PostgreSQL的存储过程或函数

    我正在开发一个 Django 项目 我决定在 PostgreSQL 中编写逻辑代码 而不是用 Python 编写 因此 我在 PostgreSQL 中创建了一个存储过程 例如 存储过程如下所示 create or replace proce
  • 带有可变 WHERE 子句的批量 UPDATE 表

    我有一堆值对 foo1 bar1 foo2 bar2 我想做一堆更新 将 foo 列设置为 foo1 其中 bar 列为 bar1 我正在使用 psycopg2 在 Python 中执行此操作 我可以executemany与查询UPDATE
  • 使用 Docker 文件分配附加功能

    我需要部署 Docker 映像 但我只想使用 Docker run 命令而不使用其任何参数 我想在运行容器时分配特殊权限 这是我的 Docker 运行命令 docker run cap add SYS ADMIN cap add DAC R
  • 您可以将 Docker 映像直接拉入 IBM Cloud Kubernetes 集群吗?

    TL DR 抱歉 如果这是基础知识 我正在学习 Kubernetes 我尝试在 IBM Cloud 中创建 Kubernetes 部署 但失败了 该部署在我的本地 minikube 上运行良好 但在 IBM Cloud 中失败 我是否需要使
  • NSQ Docker Swarm

    我尝试在 Docker Swarm 中使用 NSQ 但没有成功 mhlg rpi nsq 是为 Raspberry Pi ARM7 板构建的 Docker 映像 如果作为普通 Docker 容器运行 我可以确认其工作正常 在 Docker
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • 适用于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
  • Nginx docker容器代理传递到另一个端口

    我想在 docker 容器中运行 Nginx 它监听端口 80 并且当 url 以 word 开头时 我希望它 proxy pass 到端口 8080api 我有一些网络应用程序侦听端口 8080 这在没有 docker 的情况下对我来说一
  • 无法初始化 NVML:几个小时后 Docker 中出现未知错误

    我遇到有趣而奇怪的问题 当我使用 GPU 启动 docker 容器时 它工作正常 并且我看到 docker 中的所有 GPU 然而 几个小时或几天后 我无法在docker中使用GPU 当我做nvidia smi在泊坞窗机器中 我看到这条消息
  • TimescaleDB 查询选择列值较上一行发生更改的行

    最近刚刚开始使用 TimescaleDB 和 Postgres 来处理大多数数据请求 然而 我遇到了一个问题 即我对时间序列数据的请求效率极低 它是一个可以是任意时间长度 具有特定整数值的数据系列 大多数时候 除非出现异常 否则该值将是相同
  • SELECT 在 PL/pgSQL 函数中引发异常

    我想在函数内实现循环 但收到此错误 ERROR 查询没有结果数据的目标 代码 CREATE OR REPLACE FUNCTION my function ill int ndx bigint RETURNS int AS DECLARE
  • 如何在 PostgreSQL 中返回不同时区的当前日期

    我正在开发一个使用东部时间并将数据库设置为太平洋时间的应用程序 这已经引起了一些问题 但我们被告知不可能有其他方式 所以我们只能解决它 不管怎样 我遇到的麻烦之一就是获取今天的约会 由于数据库位于太平洋 如果我使用以下命令询问今天的日期cu
  • 错误:无法满足的约束 - 在 php:7-fpm-alpine 上

    我正在考虑在 fpm alpine 容器上设置 laravel 遇到一个问题 下面的 Dockerfile 会产生一些错误 FROM php 7 fpm alpine install extensions needed for Larave
  • Django 独特的不工作

    我在从查询中过滤掉重复项时遇到问题 我正在使用 Django 1 4 和 Postgres 8 4 13 我在我的模型对象上使用这个查询 它是一个 jquery 自动完成 term request GET get term field re
  • JPA 支持查询 Postgres JSON 字段

    JPA 是否已经支持处理 JSON 字段的查询 如下所示 select from person where info gt gt age numeric 40 select from person where info gt gt firs

随机推荐