1 背景

UAT 环境,发现服务应用 PG 库里拿出来的时间是错误的,所以产生诉求:修改 PG 数据库的时区

2 过程

2.1 线上操作

线上使用 K8s 部署(单 Node 单 Pod)bitnami PostgreSQL 14 版本数据库,修改方式非常简单,在 Web UI 中添加 POSTGRESQL_TIMEZONE 和 POSTGRESQL_LOG_TIMEZONE 配置参数(值均为 PRC,PG 对中国时区的定义),重启

2.2 问题产生原因

由于线上有大量的数据在不断写入,PG 重启的过程中有 Pod 被 K8s 强制关闭,这个时间点有 Insert 语句的数据直接先落入到 redo 日志,还未落盘,同时这个数据是不完整的

2.3 问题

K8s 无法正常拉起 PG 的 Pod,进入无限 Error 重启阶段

由于 UAT 环境的数据量大且类生产环境,所以数据也是非常重要,不可丢失。

3 修复过程

3.1 问题定位

根据错误日志可以判断是重启执行 redo 日志的时候失败了

Untitled

3.2 处理方式

3.2.1 启动的时候跳过 redo 日志的执行,但是一直没找到对应的启动参数,放弃

3.2.2 修复 redo 日志

在 Google 可以找到修复方式,以 10 版本为界限,可以使用 pg_resetxlog 或 pg_resetwal(10 以后版本) 命令对 PG 的 data 文件夹进行修复

小细节:不管做什么尝试手段,第一步一定是对出现问题以后的 data 目录进行打包封存,可用于多次的修复尝试,不然就没有回头路了