Postgresql数据库启动失败invalid primary checkpoint record
HDUZN

电脑可能自动更新重启了后,Postgresql的服务突然就不行了,启动不了了。我是用 Docker创建的postgresql的容器,一直在 Restarting。

然后看了下日志LOG,内容如下:

1
2
3
4
5
6
7
8
9
10
11
LOG:  starting PostgreSQL 12.17 on x86_64-pc-linux-musl, compiled by gcc (Alpine 13.2.1_git20231014) 13.2.1 20231014, 64-bit
2024-05-23 09:10:15 2024-05-23 01:10:15.368 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
2024-05-23 09:10:15 2024-05-23 01:10:15.368 UTC [1] LOG: listening on IPv6 address "::", port 5432
2024-05-23 09:10:15 2024-05-23 01:10:15.420 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2024-05-23 09:10:15 2024-05-23 01:10:15.591 UTC [22] LOG: database system was interrupted; last known up at 2024-05-22 07:06:03 UTC
2024-05-23 09:10:22 2024-05-23 01:10:22.387 UTC [22] LOG: invalid record length at 0/2475D98: wanted 24, got 0
2024-05-23 09:10:22 2024-05-23 01:10:22.387 UTC [22] LOG: invalid primary checkpoint record
2024-05-23 09:10:22 2024-05-23 01:10:22.387 UTC [22] PANIC: could not locate a valid checkpoint record
2024-05-23 09:10:22 2024-05-23 01:10:22.387 UTC [1] LOG: startup process (PID 22) was terminated by signal 6: Aborted
2024-05-23 09:10:22 2024-05-23 01:10:22.387 UTC [1] LOG: aborting startup due to startup process failure
2024-05-23 09:10:22 2024-05-23 01:10:22.389 UTC [1] LOG: database system is shut down

看到关键的应该是这句 invalid primary checkpoint record

然后先问了下AI助手,回答如下:

1
2
3
4
5
6
7
8
根据日志显示,PostgreSQL启动过程中出现了错误,具体是因为数据库系统中断导致无法定位有效的检查点记录。这可能是由于数据文件损坏或其他原因导致的数据库系统异常。

解决方法:
1. 尝试使用pg_resetwal命令来重置WAL日志文件,该命令可以修复一些WAL文件相关的问题。
2. 如果重置WAL文件无效,可以尝试使用pg_resetxlog命令来重置XLOG文件。
3. 如果以上方法都无效,可能需要考虑恢复数据库备份或者重新初始化数据库。

请注意,在尝试任何修复操作之前,请务必备份数据库文件,以免造成数据丢失。

感觉就是因为电脑自动重启导致的问题。于是网上去搜了下postgresql数据库启动失败 invalid primary checkpoint record

找到了解决方法。

步骤:

1.查看自己容器使用的docker镜像

1
docker images

结果关于postgres的关键信息如下,这里关注TAG是不是latest,我这里用的是 12.17-alpine3.19。

1
2
REPOSITORY                 TAG
postgres 12.17-alpine3.19

2.找到容器映射的目录

比如我的容器名是:postgres

1
docker inspect postgres

运行以上命令后,得到关键信息:

1
2
3
4
5
6
7
8
9
10
"Mounts": [
{
"Type": "bind",
"Source": "E:\\Docker\\PostgreSQL\\data",
"Destination": "/var/lib/postgresql/data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],

这里 Source 后面就是本地映射的目录(我这里是Windows系统,这个没有关系),Destination后面就是对应的容器中的目录。

3.停止当前容器

比如我的容器名是:postgres

1
docker stop postgres

4.重点解决过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1.进入新的docker容器
# -v 后面的参数是本地的映射目录:容器中的目录(通过docker inspect postgres得到的信息)
# postgres:12.17-alpine3.19 是镜像名:TAG,如果不写后面的,默认是latest
docker run -it -v E:\Docker\PostgreSQL\data:/var/lib/postgresql/data postgres:12.17-alpine3.19 /bin/bash

# 2.切换到postgres用户方法执行以下命令
su postgres

# 3.执行 pg_resetwal 命令
pg_resetwal -f /var/lib/postgresql/data

结果如下:
Write-ahead log reset
````

那就ok了!再启动容器,就没问题了!

PS.如果执行 pg_resetwal 报错如下:

pg_resetwal: error: lock file “postmaster.pid” exists
pg_resetwal: Is a server running? If not, delete the lock file and try again

1
2
3
4

那就先执行以下命令,再重新执行 pg_resetwal 命令。
```bash
rm /var/lib/postgresql/data/postmaster.pid
  • 本文标题:Postgresql数据库启动失败invalid primary checkpoint record
  • 本文作者:HDUZN
  • 创建时间:2024-05-23 15:20:54
  • 本文链接:http://hduzn.cn/2024/05/23/Postgresql数据库启动失败invalid-primary-checkpoint-record/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论