Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >运行在容器中Postgres数据库数据损坏后如何恢复?

运行在容器中Postgres数据库数据损坏后如何恢复?

作者头像
东风微鸣
发布于 2023-09-30 06:17:20
发布于 2023-09-30 06:17:20
44800
代码可运行
举报
运行总次数:0
代码可运行

前言

在使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss[1], 我介绍了将 RssHub + Tiny Tiny RSS 部署到 K8s 集群中的方案. 其中 TTRSS 会用到 Postgres 存储数据, 也一并部署到 K8s 容器中.

但是最近, 由于一次错误操作, 导致 Postgres 数据库的 WAL 损坏, Postgres 的 Pod 频繁 CrashBackoffLoop. 具体报错如下:

Postgres shutdown exit code 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2023-09-27 02:32:17.127 UTC [1] LOG:  received fast shutdown request
2023-09-27 02:32:17.181 UTC [1] LOG:  aborting any active transactions
2023-09-27 02:32:17.434 UTC [1] LOG:  background worker "logical replication launcher" (PID 26) exited with exit code 1
2023-09-27 02:32:17.481 UTC [21] LOG:  shutting down
2023-09-27 02:32:17.880 UTC [1] LOG:  database system is shut down

Postgres "invalid resource manager ID in primary checkpoint record" and "could not locate a valid checkpoint record"

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2023-09-27 02:33:23.189 UTC [1] LOG:  starting PostgreSQL 13.5 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.3.1_git20211027) 10.3.1 20211027, 64-bit
2023-09-27 02:33:23.190 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2023-09-27 02:33:23.190 UTC [1] LOG:  listening on IPv6 address "::", port 5432
2023-09-27 02:33:23.199 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2023-09-27 02:33:23.210 UTC [21] LOG:  database system was shut down at 2023-09-27 02:32:22 UTC
2023-09-27 02:33:23.210 UTC [21] LOG:  invalid resource manager ID in primary checkpoint record
2023-09-27 02:33:23.210 UTC [21] PANIC:  could not locate a valid checkpoint record
2023-09-27 02:33:24.657 UTC [1] LOG:  startup process (PID 21) was terminated by signal 6: Aborted
2023-09-27 02:33:24.657 UTC [1] LOG:  aborting startup due to startup process failure
2023-09-27 02:33:24.659 UTC [1] LOG:  database system is shut down

如上, WAL文件已损坏, 应该如何恢复?

恢复步骤

🐾Warning: 目的是启动 Postgres 恢复应用的正常运行. 数据可能存在丢失.

这是一个 TTRSS feed 应用, 只供我自己使用, 只要能启动起来, 丢失一点数据无所谓.

首先, Postgres Pod 在 CrashBackoffLoop, 无法进行任何操作, 首要任务是使 Pod 启动起来, 不要关闭. 这里通过在 Deployment 添加一些命令来实现. 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  ...
spec:
  ...
  template:
    spec:
      containers:
      - image: postgres:13-alpine
        imagePullPolicy: IfNotPresent
        name: postgres
        command: ["sh"]
        args: ["-c", "tail -f /dev/null"]
...

如上, 通过 sh -c tail -f /dev/null 实现 Pod 运行. 也可以通过类似 while true; do sleep 30; done; 等类似命令来实现.

Pod 稳定运行后, 通过 kubectl exec -it 进入该Pod:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
k3s kubectl exec -it database-postgres-56cff865bb-92pcx -n rsshub -- /bin/sh

并切换到 postgres 用户:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
su - postgres

🐾Warning: 切换到 postgres 用户方可执行下面命令.

接下来就顺利了, 使用 pg_reset_wal 恢复 WAL:

先用 --dry-run 看看运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pg_resetwal --dry-run /var/lib/postgresql/data/

如果结果符合预期, 再运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pg_resetwal /var/lib/postgresql/data/
Write-ahead log reset

成功后, 退出 Pod. 并移除 Deploy 的 commandargs 后, postgres 即可正常启动. 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2023-09-27 04:03:25.172 UTC [1] LOG:  starting PostgreSQL 13.5 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.3.1_git20211027) 10.3.1 20211027, 64-bit
2023-09-27 04:03:25.173 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2023-09-27 04:03:25.173 UTC [1] LOG:  listening on IPv6 address "::", port 5432
2023-09-27 04:03:25.179 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2023-09-27 04:03:25.187 UTC [20] LOG:  database system was shut down at 2023-09-27 04:02:42 UTC
2023-09-27 04:03:25.210 UTC [1] LOG:  database system is ready to accept connections

完成🎉🎉🎉

References

[1] 使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss: https://ewhisper.cn/posts/60709/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-27 16:45,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 东风微鸣技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PG高可用之repmgr(1主2从+1witness)+Pgpool-II实现主从切换+读写分离+负载均衡
第二次执行时不再提示输入yes,并且可以成功执行命令,则表示SSH对等性配置成功。
AiDBA宝典
2022/11/07
3K0
PG高可用之repmgr(1主2从+1witness)+Pgpool-II实现主从切换+读写分离+负载均衡
【赵渝强老师】PostgreSQL的服务器日志文件
PostgreSQL数据库的物理存储结构主要是指硬盘上存储的文件,包括:数据文件、日志文件、参数文件、控制文件、WAL预写日志文件等等。下面重点讨论一下PostgreSQL的服务器日志文件。视频讲解如下:
赵渝强老师
2024/12/06
990
【赵渝强老师】PostgreSQL的服务器日志文件
进阶数据库系列(十五):PostgreSQL 主从同步原理与实践
在正式介绍 PostgreSQL 主从同步复制 之前,我们先了解一下 PostgreSQL 的预写日志机制(WAL)。
民工哥
2023/08/22
5.3K0
进阶数据库系列(十五):PostgreSQL 主从同步原理与实践
从Oracle到PostgreSQL:最全控制文件
墨墨导读:本文介绍了Oracle和PostgreSQL控制文件基本内容,对如何重建PostgreSQL控制文件进行了详细描述并进行了恢复测试。
数据和云
2019/07/22
2.9K0
从Oracle到PostgreSQL:最全控制文件
进阶数据库系列(二十一):PostgreSQL 数据目录同步工具 pg_rewind
pg_rewind 相比 pg_basebackup 和 rsync 这样的工具来说,优势是它不需要从源目录拷贝所有的数据文件,而是会对比时间线发生偏离的点,只拷贝变化过的文件,这样对于数据量很大的情况下速度更快。
民工哥
2023/08/22
2K0
进阶数据库系列(二十一):PostgreSQL 数据目录同步工具 pg_rewind
进阶数据库系列(二十):PostgreSQL 数据库备份与恢复
此种方式是直接备份数据库物理文件,在pg数据库里,这通常指的是PGDATA变量定义的文件夹,例如:
民工哥
2023/08/22
7.7K0
进阶数据库系列(二十):PostgreSQL 数据库备份与恢复
PostgreSQL pgBackRest 是最好的PG备份工具 ? (小试牛刀 1)
之前备份的工具一直在使用PGRMAN,潮流变化了,现在最新最推崇的PG备份软件是pgBackRest,今天来探究一下到底为什么他是目前最推崇的备份软件。
AustinDatabases
2023/10/24
2.2K0
PostgreSQL  pgBackRest 是最好的PG备份工具 ? (小试牛刀  1)
POSTGRES10.4安装步骤(WIN10 x64下FOR ODOO12部署)
在选择语言环境时,若选择"default locale"会导致安装不正确;同时,PostgreSQL 不支持 GBK 和 GB18030 作为字符集,如果选择其它四个中文字符集:中文繁体 香港(Chinese[Traditional], Hong Kong S.A.R.)、中文简体 新加坡(Chinese[Simplified], Singapore)、中文繁体 台湾(Chinese[Traditional], Taiwan)和中文繁体 澳门(Chinese[Traditional], Marco S.A.R.),会导致查询结果和排序效果不正确。建议选择"C",即不使用区域。
好派笔记
2021/09/17
1K0
pg_rman备份
pg_rman是一款专门为postgresql设计的在线备份恢复的工具。其支持在线和基于时间点备份方式,还可以通过创建backup catalog来维护DB cluster备份信息。
DB之路
2021/03/11
1.5K0
史上最全PostgreSQL体系结构
墨墨导读:本文主要从日志文件、参数文件、控制文件、数据文件、redo日志(WAL)、后台进程这六个方面来讨论PostgreSQL的结构。
数据和云
2019/07/22
4.1K0
史上最全PostgreSQL体系结构
【DB宝94】PG分布式之PGXL安装部署
文档:https://www.postgres-xl.org/documentation/index.html
AiDBA宝典
2022/04/11
2.3K0
【DB宝94】PG分布式之PGXL安装部署
PostgreSQL体系结构
原文:https://www.enmotech.com/web/detail/1/764/1.html
数据和云01
2019/07/31
1.1K0
PostgreSQL体系结构
Postgres-XL集群部署与管理指南
Postgres-XL是一个基于PostgreSQL数据库的横向扩展开源SQL数据库集群,具有足够的灵活性来处理不同的数据库工作负载,架构如下图所示:
星哥玩云
2022/08/17
1.1K0
Postgres-XL集群部署与管理指南
实战教程:利用Docker容器化技术部署Szurubooru图像分享平台
本文详细介绍了使用Vue3构建PC端扫码登录系统的全过程,从环境准备到功能实现,步骤清晰,非常适合前端新手学习。文章不仅提供了必要的代码示例,还附有视频讲解,帮助读者更好地理解和实践。
江湖有缘
2024/12/01
1380
实战教程:利用Docker容器化技术部署Szurubooru图像分享平台
PostgreSQL13流复制主从同步配置,切换步骤
本文档详细记录如何一步一步在两台Linux服务器上,搭建PostgreSQL数据库主从模式的高可用数据库环境,以及如何手工切换主备库,及其注意事项。
用户8006012
2022/05/31
7.6K0
CentOS6.7安装PostgreSQL10.9详细教程
PostgreSQL 是一个基于 POSTGRES 的对象关系数据库管理系统(ORDBMS),版本4.2,由加州大学伯克利分校计算机科学系开发。POSTGRES 开创了许多概念,这些概念在很久以后才在某些商业数据库系统中出现。
JiekeXu之路
2019/07/22
2.2K0
CentOS6.7安装PostgreSQL10.9详细教程
解决 macOS 下 PostgreSQL 服务启动失败
使用 brew 安装的 PostgreSQL 服务,不知道什么时候升级了版本,在启动时失败了,第一次也没有报错。
沈唁
2022/04/12
2.6K0
[译]PG复制和自动故障转移--2
6)通过pg_waldump --path=/tmp/sd/pg_wal -start=0/1C420B8看下日志文件里内容。使用的是步骤3中的起始LSN。注意WAL中包含创建物理文件的指令:
yzsDBA
2022/04/28
7040
[译]PG复制和自动故障转移--2
【DB宝60】PG12高可用之1主2从流复制环境搭建及切换测试
PostgreSQL在9.x之后引入了主从的流复制机制,所谓流复制,就是备服务器通过tcp流从主服务器中同步相应的数据,主服务器在WAL记录产生时即将它们以流式传送给备服务器,而不必等到WAL文件被填充。
AiDBA宝典
2021/07/29
3.3K0
Joplin 环境
其中 APP_BASE_URL 为 joplin 可接受的访问链接,该url 需要填入 协议、域名和端口,初始为了方便建议 http 协议测试,之后升级 https
为为为什么
2023/12/14
4760
Joplin 环境
推荐阅读
相关推荐
PG高可用之repmgr(1主2从+1witness)+Pgpool-II实现主从切换+读写分离+负载均衡
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验