问题

关键信息都在这几行:

  • failed to open feature control file: gaussdb.version(不是致命,包里没这个文件/路径不对)
  • Error when reading postmaster.opts: No such file or directory(非致命,正常由启动过程生成)
  • The core dump path is an invalid directory(coredump 路径配置错误,非致命)
  • FATAL: could not locate required checkpoint record
  • HINT: If you are not restoring from a backup, try removing the file ".../backup_label"

结论:这个实例的 PGDATA 处于“未完成的备份/拉起”状态(目录残缺或曾经执行过 basebackup/rewind 被中断),backup_label 残留导致恢复流程去找“必需的检查点/WAL”而找不到,于是崩溃退出。配合你之前的 pg_control 异常、postmaster.opts 缺失,以及 K8s 环境,很像是:副本在拉起或被重建时,卷挂载/IO 异常或被中断 → 目录不一致


怎么修

你这是副本/Replica 节点(从截图 host 看是 ...-2-0

最稳妥:直接重建副本,不要在坏目录里做手工修复。

# 仅对副本执行(不要指向 Leader)
patronictl -c /etc/patroni.yml reinit --force opengauss-c76f944a opengauss-c76f944a-2-0
# 观察
patronictl -c /etc/patroni.yml list

--force 会让 Patroni 清空 $PGDATA,重新 basebackup 同步回来,自动处理 backup_label 残留问题。

若 DCS 里 -2-0 是僵尸条目,可先 patronictl remove ... -2-0,再让 Pod 重建/再执行 reinit。

如果你暂时不走 Patroni(或需要先手工把目录“解卡”)

仅用于排障验证,更推荐直接 reinit

export PGDATA=/pgdata/data/opengauss-83434b30

# 1) 看看是否有残留的备份标记
ls -l $PGDATA/backup_label $PGDATA/tablespace_map 2>/dev/null

# 2) 不在做恢复/不是在从备份还原,就移走它们
[ -f $PGDATA/backup_label ]   && mv $PGDATA/backup_label   $PGDATA/backup_label.bak.$(date +%F-%T)
[ -f $PGDATA/tablespace_map ] && mv $PGDATA/tablespace_map $PGDATA/tablespace_map.bak.$(date +%F-%T)

# 3) 确认 WAL 目录存在且非空(pg_wal/pg_xlog 取决于版本)
ls -lh $PGDATA/pg_wal 2>/dev/null || ls -lh $PGDATA/pg_xlog 2>/dev/null
  • 如果移走 backup_label 后仍报 “could not locate required checkpoint record”,说明 WAL/控制信息已不一致。
    副本场景不要硬修gs_resetxlog/pg_resetwal),直接清空并用 basebackup 重建更安全。

如果这是主库且没有可用备份(万不得已)

  • 先完整备份坏目录(以便回滚),再尝试 gs_resetxlog/pg_resetwal -f $PGDATA 重置 WAL/重建 pg_control,能起则立即全量导出并重建所有备库
  • 但只在没有更好选择时这样做,风险较高

伴随告警如何处理(非致命,可顺手修)

  • Get ENV GS_CLUSTER_NAME failed / AlarmItem file:告警模块配置/环境变量缺失,不影响 DB 启动,可后续按运维规范补齐。

  • The core dump path is an invalid directory:把 coredump_pathpostgresql.confgs_guc set)指向一个存在且可写的目录,例如:

    gs_guc set -D $PGDATA -c "coredump_path='/pgdata/core'"
    mkdir -p /pgdata/core && chown -R gaussdb:gaussdb /pgdata/core
    
  • gaussdb.version 缺失:打包/路径问题,通常不影响功能。


避免再次发生

  • 副本一律用 patronictl reinit --force 重建,不要在坏目录里 reset。
  • 确认 PVC 只挂载一个 Pod(RWO),排除 Multi-Attach;卷挂载失败时避免在“空目录”上误初始化。
  • 避免 NFS 作为数据盘;如必须,使用 hard 等安全挂载参数并监控 I/O。
  • 监控卷空间/只读重挂载;避免暴力杀进程/断电。

一条你现在可以直接用的命令

(目标就是你截图里的 ...-2-0 这个副本)

patronictl -c /etc/patroni.yml reinit --force opengauss-c76f944a opengauss-c76f944a-2-0

执行后把 patronictl list 的最新输出贴我,我帮你确认是否已回到 running (Replica)

backup_label目录是 patronictl 自己的逻辑吗?

不是的。backup_label 不是 Patroni 的逻辑,而是 PostgreSQL/openGauss 内核自己的文件(而且是文件,不是目录),位于 $PGDATA/backup_label

它的作用/来源:

  • 在做 basebackup(如 gs_basebackup/pg_basebackup)或老式 pg_start_backup/pg_stop_backup 备份流程时生成,写入起始检查点/LSN、时间线、系统ID等信息,供恢复启动时定位必需的检查点与 WAL。

  • 正常恢复到一致点后,内核会自动移除这个文件;如果备份/恢复被中断、WAL 缺失,backup_label 残留,就会出现你看到的

    FATAL: could not locate required checkpoint record
    HINT: If you are not restoring from a backup, try removing .../backup_label

Patroni 只是编排:它调用这些标准工具(basebackup / rewind)来拉副本,本身不会创建 backup_label。你在副本上看到它,多半是上一次拉库被中断或卷/IO异常导致残留。

✅ 实操建议(副本)
用 Patroni 直接重建副本最安全:

patronictl reinit --force <cluster_name> <replica_member>

不要在副本里用 pg_resetwal 之类硬修。只有在单机主库又无备份这类无退路场景,才考虑手动移走 backup_label 或 reset(高风险)。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐