postgresql错误PANIC:找不到有效的检查点记录

nat*_*ott 50 postgresql postgresql-9.0

当我加载postgres服务器(v9.0.1)时,我得到一个恐慌,阻止它启动:

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

我怎样才能解决这个问题?

Erw*_*ter 87

它正在事务日志中查找可能不存在或已损坏的检查点记录.您可以通过运行来确定是否是这种情况:

# Postgres < 10.0
pg_resetxlog DATADIR

# Postgres >= 10.0
pg_resetwal DATADIR
Run Code Online (Sandbox Code Playgroud)

如果事务日志已损坏,您将看到如下消息:

数据库服务器没有干净地关闭.重置事务日志可能会导致数据丢失.如果您仍想继续,请使用-f强制重置.

然后,您可以按照说明运行-f以强制更新:

# Postgres < 10.0
pg_resetxlog -f DATADIR 

# Postgres >= 10.0
pg_resetwal -f DATADIR
Run Code Online (Sandbox Code Playgroud)

这应该重置事务日志,但它可能使您的数据库处于不确定状态,如PostgreSQL文档 pg_resetxlog中所述:

如果pg_resetxlog抱怨它无法确定pg_control的有效数据,则可以通过指定-f(强制)开关强制它继续进行.在这种情况下,合理的值将代替缺失的数据.可以预期大多数字段匹配,但是下一个OID,下一个事务ID和纪元,下一个多事务ID和偏移以及WAL起始地址字段可能需要手动帮助.可以使用下面讨论的开关设置这些字段.如果您无法确定所有这些字段的正确值,-f仍然可以使用,但恢复的数据库必须比平时更加​​怀疑:立即转储和重新加载是必要的.在转储之前不要在数据库中执行任何数据修改操作,因为任何此类操作都可能使损坏更严重.

  • 谢谢。docker 的 `pg_resetwal $PGDATA`。只需在执行前运行 `su postgres` (4认同)
  • 通过 `pg_resetwal /usr/local/var/postgres/` 重置,然后像 `postgres -D /usr/local/var/postgres` 一样运行 postgres 对我有用。 (2认同)
  • 如果`pg_resetwal /var/lib/postgresql/data/`得到一个错误`pg_resetwal: error: Cannot beexecute by "root"`,那么你必须使用命令`su postgres`成为用户`postgres`通常是该文件夹的所有者。如果您想查看谁是该文件夹的所有者,请使用“ls -l /var/lib/postgresql/data/”。 (2认同)

sha*_*359 28

如果是码头工人,

此错误将导致容器不断被终止并重新启动。第一步是启动并运行容器,以便我们可以执行到容器中并运行 pg_resetwal 或 pg_resetxlog 。在postgres docker层信息中,我们可以看到

ENTRYPOINT是 ["docker-entrypoint.sh"],CMD是 ["postgres"]

docker-entrypoint.sh 脚本将运行作为参数传递的任何 Linux 命令。

如果你在 docker 上,那么传递/bin/bash将覆盖默认的 CMD 并让你访问容器 shell,

docker run -it -v /my_data:/var/lib/postgresql/data postgres:9.6.22 /bin/bash
Run Code Online (Sandbox Code Playgroud)

这里/var/lib/postgresql/data是容器内的 postgres 数据目录。

进入容器后,根据您的 postgres 版本运行以下命令。这将重置事务日志 (WAL)

在 postgres >= 10 上

pg_resetwal /var/lib/postgresql/data
Run Code Online (Sandbox Code Playgroud)

在 postgres < 10

pg_resetxlog /var/lib/postgresql/data
Run Code Online (Sandbox Code Playgroud)

此线程上评分最高的答案解释了有关 pg_resetwal 命令的更多信息。

最后,您可以退出此容器并使用其原始 CMD 启动 postgres DB 容器。


一些附加信息

如果您看到以下错误,可能是因为您在上面指定的数据目录可能不正确。

pg_resetxlog:无法打开文件“PG_VERSION”进行读取:没有这样的文件或目录

您可以检查 PGDATA 环境变量以获得正确的路径。

root@4650984c476b:/# printenv | grep PGDATA
PGDATA=/var/lib/postgresql/data
Run Code Online (Sandbox Code Playgroud)

使用旧版本的 postgres 可能会出现以下错误。

pg_resetxlog:无法由“root”执行

这可以通过运行以下命令来解决

gosu postgres pg_resetxlog /var/lib/postgresql/data
Run Code Online (Sandbox Code Playgroud)

对于像kubernetes、rancher v1 这样的任何容器编排器(因为我们无法直接运行 docker 命令),我们必须使用 sleep 之类的进程来启动容器。在您的 Orchestrator清单中将以下内容作为 cmd 或 args 传递。

sleep infinity
Run Code Online (Sandbox Code Playgroud)

或者

sh -c 'while sleep 3600; do :; done'
Run Code Online (Sandbox Code Playgroud)

然后使用kubectl exec等工具进入容器。一旦进入内部,就可以运行 pg_resetwal/pg_resetxlog 命令。


小智 19

我正在运行9.1.7,我发现成功运行了以下内容:

/usr/lib/postgresql/9.1/bin/pg_resetxlog -f /var/lib/postgresql/9.1/main
Run Code Online (Sandbox Code Playgroud)

pg_resetxlog命令的最后一个参数应该是postgres存储数据库数据的磁盘上的位置.


Jer*_*ome 8

如此处所示,不应运行pg_resetxlog.提到这个问题的答案是不好的建议.假设在复制/复制实例的上下文中发生错误,该链接提供了一种更简洁的复制/复制方式pg_basebackup