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仍然可以使用,但恢复的数据库必须比平时更加怀疑:立即转储和重新加载是必要的.在转储之前不要在数据库中执行任何数据修改操作,因为任何此类操作都可能使损坏更严重.
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存储数据库数据的磁盘上的位置.