已关闭
[Bug]: 【ustore】【HA】【gs_probackup】增量恢复后对ustore表执行alter table ... alter column ... type int 产生core #8361
wuchenlong创建于  7月28日关闭于  8月24日
wuchenlong
wuchenlong成员
7月28日 创建

测试类型

工具功能
存储功能
故障注入

测试版本

6.0.6LTS

操作系统和硬件信息

openEuler release 24.03 (LTS) aarch64

测试环境

企业版主备

操作步骤

-- 环境一:cmp 6.0.6(15700),打开 enable_cbm_tracking 后构造最小链路
DROP DATABASE IF EXISTS db_for_probackup_1061897;
CREATE DATABASE db_for_probackup_1061897;
\c db_for_probackup_1061897
CREATE TABLESPACE tbs_1061897_1 LOCATION '/home/wcl0716/ts_1061897_1';
CREATE TABLESPACE tbs_1061897_2 LOCATION '/home/wcl0716/ts_1061897_2';
CREATE TABLESPACE tbs_1061897_3 LOCATION '/home/wcl0716/ts_1061897_3';
CREATE TABLE ustore_alter_1061897(
    id int,
    col_new_smallint smallint,
    payload text,
    updated_at timestamp default clock_timestamp()
) WITH (orientation=row, storage_type=ustore) TABLESPACE tbs_1061897_1;
CREATE INDEX idx_ustore_alter_1061897_id ON ustore_alter_1061897(id) TABLESPACE tbs_1061897_2;
INSERT INTO ustore_alter_1061897
SELECT g, (g % 30000)::smallint, repeat('x', 200)
FROM generate_series(1, 50000) g;

-- FULL -> PTRACK -> PTRACK
-- gs_probackup init/add-instance/backup FULL
-- 业务变更 1:UPDATE/INSERT/DELETE/CHECKPOINT
-- gs_probackup backup -b PTRACK
-- 业务变更 2:UPDATE/INSERT/DELETE/CHECKPOINT
-- gs_probackup backup -b PTRACK

-- 恢复最新增备
-- gs_probackup restore -B /home/wcl0716/probackup_1061897 --instance=i1061897 -D /home/wcl0716/cluster/dn1 -i TIVJQ6 -I checksum

-- 恢复后执行
\c db_for_probackup_1061897
SELECT count(*) AS rows_before_alter FROM ustore_alter_1061897;
ALTER TABLE ustore_alter_1061897 ALTER COLUMN col_new_smallint TYPE int;
SELECT count(*) AS rows_after_alter FROM ustore_alter_1061897;

-- 若 standby 进入 Need repair(WAL),在 standby 节点执行
-- gs_ctl build -D /home/wcl0716/cluster/dn1 -b full

-- 环境二:lts 7.0.0-RC3(15600)按相同链路对照执行
-- 同样构造 5 万行 USTORE 表 + FULL/PTRACK/PTRACK + restore -I checksum
-- 再执行 ALTER TABLE ... ALTER COLUMN col_new_smallint TYPE int;

预期输出

1. FULL/PTRACK/PTRACK 备份成功
2. restore -I checksum 成功
3. 恢复后 ALTER TABLE ... ALTER COLUMN col_new_smallint TYPE int 正常完成
4. standby build/start 正常完成,主备集群保持 Normal,无 core / 无 coredump

实际输出

【cmp 6.0.6】
1. FULL/PTRACK/PTRACK 均成功,restore -I checksum 成功。
2. 第一次恢复后:
   - rows_before_alter = 53778
   - ALTER TABLE ustore_alter_1061897 ALTER COLUMN col_new_smallint TYPE int; 长时间不返回
   - pg_stat_activity 显示该会话 state=active, waiting=f,持有 AccessExclusiveLock
   - core=0
3. 第二次按同一备份链重放恢复后:
   - 再次手动执行相同 ALTER,现象一致:rows_before_alter 正常返回,ALTER 长时间不返回
   - 同样 state=active, waiting=f,core=0
4. 两次 restore 之后,cmp standby 都进入 Need repair(WAL)。
5. 对 20.20.20.226 执行 gs_ctl build -D /home/wcl0716/cluster/dn1 -b full 时,17:18:13 再次报:
   gaussDB state is Coredump
6. 修正 core_pattern 后,成功落盘:
   /home/wcl0716/core/core-gaussdb-3913846-2026_07_28_17_18_07-bbox.lz4
7. 解压后确认为 ELF core file,gdb 栈显示线程落在:
   - BBOX_CreateCoredump
   - parallel_recovery::GetCompletedReadEndPtr
   - parallel_recovery::GetReplayedRecPtrFromUndoWorkers
   - parallel_recovery::PageRedoWorkerMain
   - StartupXLOG / StartupProcessMain

【lts 7.0.0-RC3 对照】
1. 同样的 FULL/PTRACK/PTRACK + restore -I checksum 成功。
2. rows_before_alter = 53778
3. ALTER TABLE ... ALTER COLUMN col_new_smallint TYPE int; 直接成功
4. rows_after_alter = 53778
5. core=0,集群 Normal

日志信息

cmp 6.0.6 上至少两次稳定复现“增量恢复后 USTORE smallint->int 改列卡住”;lts 7.0.0-RC3 同链路不复现。进一步在 cmp 上补抓到真实 core:standby full build/start 时进入 Coredump,核心文件为 /home/wcl0716/core/core-gaussdb-3913846-2026_07_28_17_18_07-bbox.lz4。gdb 栈已收敛到 standby StartupXLOG / parallel_recovery / UNDO replay 相关路径;同时 pg_log 持续出现 RecheckUndoRecycleXid / globalFrozenXid 告警,当前判断更像旧版本增量恢复后 USTORE 物理/元数据状态异常。

提单组织

测试团队

likedislike
wuchenlongwuchenlong成员
7月28日 添加了label:bug
opengauss_bot
opengauss_bot成员
7月28日 评论:

This issue requires an assignee. Since you haven't specified one, we've assigned TestManager as the default assignee for this issue.

likedislike
opengauss_botopengauss_bot成员
7月28日 将 TestManager 设为负责人
opengauss_botopengauss_bot成员
7月28日 添加了label:sig/StorageEngine,sig/AI,sig/CM,sig/CloudNative,sig/SecurityTechnology,sig/SQLEngine
opengauss_bot
opengauss_bot成员
7月28日 评论:

Welcome To openGauss Community

Hey @wuchenlong , thanks for your contribution to the community.

Bot Usage Manual

I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands.

Contact Guide

If you have any questions, please contact the SIG: StorageEngine, AI, CM, CloudNative, SecurityTechnology, SQLEngine ,
and any of the maintainers: @CarrotGo, @chendong76, @chenxiaobin19, @congzhou2603, @dodders, @hwworkholic, @jemappellehc, @muyulinzhong, @quemingjian, @shenzheng4, @shirley_zhengx, @superlchf, @totaj, @wlff234, @wofanzheng, @ywzq1161327784 ,
and any of the committers: @Igali, @bihua111, @cailei19, @h_ray, @levy53071, @libiao2024, @lihaixiao, @mrzack, @wangfeihuo, @wuyuechuan, @xiong_xjun, @zhangfengzhi123, @zhangxubo, @zhangzq131, @zjh_hw .

likedislike
徐文贵
徐文贵成员
7月28日 评论:

是问题。gs_probackup -I checksum 误跳过内容不同但 CRC 相同的 undo/undometa,导致 USTORE 增量恢复后 UNDO 元数据错乱,进而造成 ALTER 卡住及备机恢复 core。

likedislike
chendong76chendong76成员
7月28日 修改标题为 “[Bug]: 【ustore】【HA】【gs_probackup】增量恢复后对ustore表执行alter table ... alter column ... type int 产生core”,原标题为“[Bug]: 【ustore】【HA】【vb_probackup】增量恢复后对ustore表执行alter table ... alter column ... type int 产生core”
wuchenlongwuchenlong成员
7月29日 关联了看板:临时看板
chendong76chendong76成员
8月3日 关联了看板:openGauss 7.0.0-LTS
chendong76chendong76成员
8月3日 移除了看板:临时看板
wuchenlongwuchenlong成员
8月3日 issue优先级由 无优先级 改变为 主要
wuchenlong
wuchenlong成员
8月4日 评论:
likedislike
IIgali成员
8月5日 将 xudabiao2024 设为负责人
xudabiao2024xudabiao2024成员
8月8日 关联了pull request:Force restore undo files during incremental restore
xudabiao2024xudabiao2024成员
8月8日 关联了pull request:Force restore undometa during incremental restore
xudabiao2024xudabiao2024成员
8月9日 关联了pull request:Force restore undometa during incremental restore
xudabiao2024xudabiao2024成员
8月10日 关联了pull request:Force restore undometa during incremental restore
xudabiao2024
xudabiao2024成员
8月19日 评论:

验证版本:700B19
验证结果:通过
image.png
image.png

likedislike
xudabiao2024
xudabiao2024成员
8月19日 评论:

验证版本:606B003
验证结果:通过
image.png
image.png

likedislike
xudabiao2024xudabiao2024成员
8月19日 issue状态由 待办的 改变为 待回归
xudabiao2024
xudabiao2024成员
8月20日 评论:

问题根因:

-I checksum / -I lsn 增量 restore 会对已存在的非数据文件计算 CRC,如果当前 PGDATA 中的文件 CRC 与备份集中记录的 CRC 相同,则跳过该文件恢复。

在问题场景中,restore 前 PGDATA 中的 undo 状态已经比 FULL 备份更新,undo/undometa 文件内容与备份集中的文件不同,但两者计算出的整文件 CRC 相同,导致增量 restore 误判 undometa 未变化并跳过恢复。最终 restore 后 undometa 没有回到备份恢复点,而是保留了恢复前较新的 undo 状态,造成 undo 状态与数据文件恢复点不一致。

undometa 之所以会稳定得到相同整文件 CRC,是因为该文件按 512B meta page 组织,每个 meta page 内部保存了该页 undo meta 内容的 CRC。根据 CRC 校验的数学特性,CRC(data + CRC(data)) 会得到固定余数。因此当 meta page 内容变化时,页内保存的 CRC 也会同步变化,但再次对整个页面计算 CRC 时仍会得到固定值。实际测试中,不同 sha256 的 undometa 文件,其整文件 CRC 均为 1171041420。

后续主机执行 DDL 产生 WAL,备机 full build 后启动回放时进入 undo/redo 相关路径,由于 undo 状态与数据恢复点不匹配,最终导致备机 core。

likedislike
wuchenlong
wuchenlong成员
8月24日 评论:

【回归版本】openGauss 7.0.0-RC3 build a2d43dcd(7.0.0LTS B019,compiled at 2026-08-19 00:10:18)
【回归日期】20260824
【回归人员】wuchenlong
【回归结论】通过

测试结果

按 必现流程-可运行版.md 方式二(适配7.0.0LTS,见附件e86c2b8fb4c44d53824b6e711db290e2.md)完整构造:
FULL → PTRACK → PTRACK → 备份后推 UNDO → 停库 + 非空 PGDATA restore -I checksum(增量 ratio 48%,历史 6.0.6 在 ~42% 主库启动必现 PANIC)→ 启动。

  • 主库启动:无 RecycleUndoSpace / PANIC,无新增 gaussdb core
  • 备机 226/228 gs_ctl build -b full:成功,无 IsSkipInsertUndo PANIC
  • 恢复后 ALTER TABLE ... ALTER COLUMN col_new_smallint TYPE int:成功(53778 行,前后 count 一致);集群回到 Normal

说明

历史异常:-I checksum 误跳过 CRC 碰撞的 undo/undometa,导致 UNDO 与数据恢复点不一致 → 启动 PANIC / 备机 build core。B019 上同链路(ratio 48%)不再复现。

【回归步骤】

见 run_必现_8361_lts.sh / result_B019.txt(路径相对原文档改为 /home/wcl0623、端口 15600)。

likedislike
wuchenlongwuchenlong成员
8月24日 issue状态由 待回归 改变为 已验收
wuchenlongwuchenlong成员
8月24日 关闭了 issue