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
- 一些数据仍然可能会丢失,特别是在WAL没有达成共识的地方。
- 一些依赖于数据库的应用程序可能会引发进一步的错误,例如“数据库日志已重置,未找到插入的数据”。在这种情况下,您将必须重置这些应用程序的写入头。
- 访问我的回答here https://stackoverflow.com/a/72640402/13248285了解这种情况何时/为何发生。