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


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 .


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


验证版本:700B19
验证结果:通过




验证版本:606B003
验证结果:通过




问题根因:
-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。


【回归版本】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:成功,无IsSkipInsertUndoPANIC - 恢复后
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)。


测试类型
工具功能
存储功能
故障注入
测试版本
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;预期输出
实际输出
日志信息
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 物理/元数据状态异常。
提单组织
测试团队