Postgres无法启动,出现以下错误:
PANIC could not locate a valid checkpoint record
在谷歌上有很多解决方案,但是所有的解决方案都需要连接pod来执行一些pg命令。
但是,由于我使用K8S,我的pod陷入状态:
CrashLoopBackOff
,所以我无法再连接到我的pod。我该怎么做来修复我的postgres数据库?
编辑:
我已经尝试运行以下命令:
pg_resetwal /var/lib/postgresql/data
使用:
...
spec:
containers:
- args:
- pg_resetwal
- /var/lib/postgresql/data
但是我得到了:
pg_resetwal: cannot be executed by "root"
You must run pg_resetwal as the PostgreSQL superuser.
能够进一步...
编辑2:
我尝试使用相同的挂载卷和相同的postgresql容器运行新的pod,但将命令更改为:pg_resetwal /var/lib/postgresql/data
我还添加了:
securityContext:
runAsUser: 0
这是部署的yaml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
reloader.stakater.com/auto: "true"
labels:
app: metadata-postgres-fix
name: metadata-postgres-fix
namespace: metadata
spec:
selector:
matchLabels:
app: metadata-postgres-fix
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: metadata-postgres-fix
spec:
containers:
- args:
- pg_resetwal
- /var/lib/postgresql/data
envFrom:
- secretRef:
name: metadata-env
image: postgres:11.3
name: metadata-postgres-fix
securityContext:
runAsUser: 0
ports:
- containerPort: 5432
imagePullPolicy: Always
volumeMounts:
- mountPath: /etc/postgresql/postgresql.conf
name: metadata-postgres-data
subPath: postgres.conf
- mountPath: /docker-entrypoint-initdb.d/init.sh
name: metadata-postgres-data
subPath: init.sh
- mountPath: /var/lib/postgresql/data
name: metadata-postgres-claim
subPath: postgres
restartPolicy: Always
volumes:
- name: metadata-postgres-data
configMap:
name: cfgmap-metadata-postgres
- name: metadata-postgres-claim
persistentVolumeClaim:
claimName: metadata-postgres-claim
nodeSelector:
kops.k8s.io/instancegroup: nodes
StatefulSet
?事件中还有其他内容吗?您可以使用安全上下文以特定用户身份运行您的 Pod。 - marioStatefulSet
,我已经使用了安全上下文。但是pg_resetwal /var/lib/postgresql/data
没有起到任何作用。对于第二个问题也是否定的。 - JuliatzinrunAsUser: 0
不会像所述的PostgreSQL 超级用户
一样运行它,而是作为 root 运行,并且您已经在错误消息中明确说明它不能由 "root" 执行
。此外,由于 db 是一个有状态的应用程序,您应该考虑将其作为StatefulSet
而不是Deployment
运行。 - mario