opengauss教程FG054-openGauss归档丢失恢复处理生产实战
本文档详细介绍openGauss数据库归档日志丢失的处理方法,包括归档缺失检测、不完全恢复、备库重建等操作,风哥教程参考openGauss官方文档备份恢复指南、WAL归档配置等内容,适合DBA人员在归档异常场景中使用。
Part01-基础概念与理论知识
1.1 openGauss归档日志基本概念
- 顺序写入:WAL日志按时间顺序生成,编号连续
- 不可修改:归档日志一旦生成不可修改,保证数据一致性
- 连续性要求:PITR恢复需要连续的归档日志链
- 主备同步:备库通过应用归档日志保持与主库同步
1.2 openGauss归档日志的重要性
归档日志在以下场景中发挥关键作用:
- 时间点恢复:实现精确到秒级的数据恢复
- 主备复制:支持流复制和归档复制
- 数据迁移:支持基于日志的数据同步
- 审计分析:支持基于日志的数据变更分析
1.3 openGauss归档丢失的常见原因
归档日志丢失的常见原因:
1. 存储故障:归档目录所在磁盘损坏
2. 人为误删:误删除归档文件或目录
3. 保留策略:归档保留时间设置过短
4. 网络故障:远程归档传输失败
5. 权限问题:归档进程无写入权限
6. 空间不足:归档目录空间满导致归档失败
7. 配置错误:归档命令配置错误
# 归档丢失的影响
– PITR恢复无法进行到丢失点之后
– 备库无法继续应用日志,复制中断
– 数据一致性无法保证
Part02-生产环境规划与建议
2.1 openGauss归档监控方案
建立完善的归档监控体系:
#!/bin/bash
# archive_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
ARCHIVE_DIR=”/opengauss/archive”
ALERT_THRESHOLD=3600 # 1小时未归档告警
LOG_FILE=”/opengauss/logs/archive_monitor.log”
# 检查最新归档时间
latest_archive=$(ls -lt $ARCHIVE_DIR/*.backup 2>/dev/null | head -1 | awk ‘{print $6,$7,$8}’)
latest_time=$(date -d “$latest_archive” +%s 2>/dev/null || echo 0)
current_time=$(date +%s)
time_diff=$((current_time – latest_time))
if [ $time_diff -gt $ALERT_THRESHOLD ]; then
echo “$(date): 告警 – 归档异常,最近归档时间: $latest_archive” >> $LOG_FILE
# 发送告警通知
fi
# 检查归档连续性
cd $ARCHIVE_DIR
for file in $(ls -1 *.backup 2>/dev/null | sort); do
# 检查时间线连续性
timeline=$(echo $file | cut -d’.’ -f1 | cut -c1-8)
# 记录检查日志
echo “$(date): 检查归档文件 $file” >> $LOG_FILE
done
2.2 openGauss归档保护策略
归档日志保护策略建议:
- 本地+远程双备份:归档同时写入本地和远程存储
- 定期备份归档:将归档日志定期备份到磁带或对象存储
- 保留策略:至少保留7天以上的归档日志
- 监控告警:实时监控归档状态和存储空间
- 权限控制:限制归档目录的删除权限
2.3 openGauss备份策略优化
优化备份策略减少对归档的依赖:
1. 增加全量备份频率:从每天1次增加到每天2次
2. 缩短增量备份间隔:从每4小时缩短到每2小时
3. 定期验证备份:每周验证一次备份可用性
4. 多地备份存储:本地+异地+云端三重备份
# 备份脚本优化
#!/bin/bash
# enhanced_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
BACKUP_DIR=”/opengauss/backup”
ARCHIVE_BACKUP_DIR=”/opengauss/backup/archives”
DATE=$(date +%Y%m%d_%H%M%S)
# 备份数据
gs_probackup backup -B $BACKUP_DIR –instance=fgedudb -b FULL
# 备份归档日志
tar czvf $ARCHIVE_BACKUP_DIR/archive_backup_$DATE.tar.gz /opengauss/archive/
# 同步到远程
rsync -avz $BACKUP_DIR/ backup-server:/backup/opengauss/
Part03-生产环境项目实施方案
3.1 openGauss归档缺失检测
风哥提示:
3.1.1 检测归档连续性
#!/bin/bash
# check_archive_gap.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
ARCHIVE_DIR=”/opengauss/archive”
# 获取所有归档文件列表
archives=$(ls -1 $ARCHIVE_DIR/00000001* 2>/dev/null | sort)
prev_logid=””
prev_seg=””
gap_found=0
for archive in $archives; do
filename=$(basename $archive)
# 解析文件名: 0000000100000001000000AB
timeline=${filename:0:8}
logid=${filename:8:8}
seg=${filename:16:8}
if [ -n “$prev_logid” ]; then
# 检查连续性
prev_logid_dec=$((16#$prev_logid))
prev_seg_dec=$((16#$prev_seg))
curr_logid_dec=$((16#$logid))
curr_seg_dec=$((16#$seg))学习交流加群风哥微信: itpux-com
expected_seg=$((prev_seg_dec + 1))
if [ $curr_seg_dec -ne $expected_seg ] && [ $curr_logid_dec -eq $prev_logid_dec ]; then
echo “发现归档缺失: 时间线 $timeline, 日志ID $logid, 段号 $prev_seg -> $seg”
gap_found=1
fi
fi
prev_logid=$logid
prev_seg=$seg
done
if [ $gap_found -eq 0 ]; then
echo “归档日志连续,未发现缺失”
fi
3.1.2 检查归档与备份对应关系
$ gs_probackup show -B /opengauss/backup –instance=fgedudb
BACKUP INSTANCE ‘fgedudb’
================================================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time Data WAL Zratio Start LSN Stop LSN Status
================================================================================
fgedudb 9.2 QMR8YJ 2026-04-09 03:00:01+08 FULL STREAM 1/0 45m 485GB 2GB 1.05 0/12000028 0/150000F0 OK
# 检查备份需要的归档是否存在
start_lsn=”0/12000028″
stop_lsn=”0/150000F0″
# 解析LSN到文件名
start_file=$(echo $start_lsn | awk -F’/’ ‘{printf “%08X%08X\n”, strtonum(“0x”$1), strtonum(“0x”$2)}’)
echo “备份需要的起始归档: $start_file”
# 检查文件是否存在
if [ -f “/opengauss/archive/00000001$start_file” ]; then
echo “归档文件存在”
else学习交流加群风哥QQ113257174
echo “警告: 归档文件缺失”
fi
3.2 openGauss不完全恢复处理
3.2.1 执行不完全恢复
# 步骤1:确定可恢复的最大LSN
# 最后一个可用归档是00000001000000050000009F
# 对应LSN为0/5000009F
# 步骤2:执行不完全恢复到缺失前的最后一个可用点
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata_new -i QMR8YJ –recovery-target-lsn=”0/5000009F”
INFO: Restore begin.
INFO: Checking backup QMR8YJ
INFO: Backup QMR8YJ is valid
INFO: Restoring backup QMR8YJ
INFO: Recovery target LSN: 0/5000009F
INFO: Copying data files
INFO: Data files are copied
INFO: Generating recovery.conf
WARNING: Some WAL files are missing, recovery will stop at the last available point
INFO: Restore completed successfully
# 步骤3:启动数据库
$ gs_ctl start -D /opengauss/fgdata_new
waiting for server to start…. done
server started
# 步骤4:验证恢复结果
$ gsql -d fgedudb -c “SELECT pg_last_wal_replay_lsn();
”
pg_last_wal_replay_lsn
————————
0/5000009F更多视频教程www.fgedu.net.cn
(1 row)
$ gsql -d fgedudb -c “SELECT pg_last_xact_replay_timestamp();
”
pg_last_xact_replay_timestamp
——————————-
2026-04-09 08:45:32.123456+08
(1 row)
3.3 openGauss备库重建方案
3.3.1 备库因归档缺失重建
# 步骤1:检查备库状态
$ gsql -h fgedu-standby -d postgres -c “SELECT * FROM pg_stat_wal_receiver;
”
pid | status | receive_start_lsn | receive_start_tli | received_lsn | received_tli | latest_end_lsn | latest_end_time | slot_name
—–+——–+——————-+——————-+————–+————————-+—————-+—————–+———–
12345 | streaming | 0/50000000 | 1 | 0/500000A0 | 1 | 0/500000A0 | 2026-04-09 08:45:00+08 | fgedudb_slot
# 步骤2:检查复制延迟
$ gsql -h fgedu-standby -d postgres -c “SELECT EXTRACT(EPOCH FROM (now() – pg_last_xact_replay_timestamp()))/60 AS delay_minutes;
”
delay_minutes
—————
120.5
(1 row)
# 步骤3:停止备库
$ gs_ctl stop -D /opengauss/fgdata
waiting for server to shut down…. done
server stopped
# 步骤4:清理备库数据目录
$ rm -rf /opengauss/fgdata/*
# 步骤5:从主库重新拉取基础备份更多学习教程公众号风哥教程itpux_com
$ gs_probackup backup -B /opengauss/backup –instance=fgedudb -b FULL –remote-host=fgedu-primary –remote-user=opengauss
INFO: Backup begin.
INFO: Remote host: fgedu-primary
INFO: Starting backup…
INFO: Creating backup directory
INFO: Copying data files
INFO: Data files are copied
INFO: Backup completed successfully
# 步骤6:恢复备份到备库
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata -i QMR9ZK
# 步骤7:配置备库参数
cat >> /opengauss/fgdata/postgresql.conf << EOF
primary_conninfo = 'host=fgedu-primary port=5432 user=repl password=repl_pass'
recovery_target_timeline = 'latest'
hot_standby = on
EOF
# 步骤8:创建standby.signal文件
touch /opengauss/fgdata/standby.signal
# 步骤9:启动备库
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start.... done
server started
# 步骤10:验证复制状态from DB视频:www.itpux.com
$ gsql -h fgedu-standby -d postgres -c "SELECT * FROM pg_stat_wal_receiver;
”
pid | status | receive_start_lsn | receive_start_tli | received_lsn | received_tli | latest_end_lsn | latest_end_time | slot_name
—–+——–+——————-+——————-+————–+————–+—————-+—————–+———–
12346 | streaming | 0/60000000 | 1 | 0/60000100 | 1 | 0/60000100 | 2026-04-09 11:30:00+08 | fgedudb_slot
Part04-生产案例与实战讲解
4.1 openGauss单段归档缺失恢复
4.1.1 案例背景
运维人员误删除了归档目录中的单个归档文件000000010000000300000050,导致PITR恢复无法继续。
4.1.2 恢复过程
$ ls -la /opengauss/archive/0000000100000003000000*
-rw——- 1 opengauss opengauss 16777216 Apr 9 10:00 /opengauss/archive/00000001000000030000004F
-rw——- 1 opengauss opengauss 16777216 Apr 9 10:15 /opengauss/archive/000000010000000300000051
# 发现000000010000000300000050缺失
# 步骤2:检查远程备份
$ ls -la /backup/remote/archive/000000010000000300000050
-rw——- 1 backup backup 16777216 Apr 9 10:08 /backup/remote/archive/000000010000000300000050
# 步骤3:从远程备份恢复归档
$ cp /backup/remote/archive/000000010000000300000050 /opengauss/archive/
$ chown opengauss:opengauss /opengauss/archive/000000010000000300000050
$ chmod 600 /opengauss/archive/000000010000000300000050
# 步骤4:验证归档完整性
$ pg_waldump /opengauss/archive/000000010000000300000050 | head -5
rmgr: XLOG len (rec/tot): 24/ 24, tx: 0, lsn: 0/30000050, prev 0/30000028, desc: SWITCH
rmgr: Heap len (rec/tot): 54/ 54, tx: 5678, lsn: 0/30000068, prev 0/30000050, desc: INSERT off 15 flags 0x08, blkref #0: rel 1663/16384/16385 blk 1234
# 步骤5:继续PITR恢复
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata -i QMR8YJ –recovery-target-time=”2026-04-09 12:00:00+08″
INFO: Restore begin.
INFO: Checking backup QMR8YJ
INFO: Backup QMR8YJ is valid
INFO: Restoring backup QMR8YJ
INFO: Recovery target time: 2026-04-09 12:00:00+08
INFO: Copying data files
INFO: Data files are copied
INFO: Applying WAL files
INFO: WAL files are applied
INFO: Restore completed successfully
4.2 openGauss多段归档缺失处理
4.2.1 案例背景
存储故障导致归档目录中连续多个归档文件丢失,无法通过备份恢复。
4.2.2 处理过程
# 缺失归档:000000010000000400000060 到 000000010000000400000080
# 步骤2:检查远程和备份中是否存在
$ find /backup -name “00000001000000040000006*” 2>/dev/null
# 无结果,远程也没有
# 步骤3:确定可恢复的最大点
# 最后一个可用归档是00000001000000040000005F
# 对应LSN 0/4000005F
# 步骤4:执行不完全恢复
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata_recovery -i QMR8YJ –recovery-target-lsn=”0/4000005F”
# 步骤5:启动并验证
$ gs_ctl start -D /opengauss/fgdata_recovery
$ gsql -d fgedudb -c “SELECT pg_last_wal_replay_lsn(), pg_last_xact_replay_timestamp();
”
pg_last_wal_replay_lsn | pg_last_xact_replay_timestamp
————————+——————————–
0/4000005F | 2026-04-09 09:30:45.123456+08
(1 row)
# 步骤6:导出可恢复的数据
$ gs_dump -d fgedudb -f /tmp/recovered_data.sql
# 步骤7:评估数据丢失情况
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM fgedu.fgedu_orders WHERE create_time > ‘2026-04-09 09:30:45’;
”
count
——-
250
(1 row)
# 步骤8:从应用日志或其他来源补回丢失数据
# 如果有应用日志或业务记录,可以手动补回这250条记录
4.3 openGauss备库同步中断恢复
4.3.1 案例背景
主库归档清理策略设置不当,导致备库需要的归档被提前删除,复制中断。
4.3.2 恢复过程
$ gsql -h fgedu-standby -d postgres -c “SELECT * FROM pg_stat_wal_receiver;
”
pid | status | receive_start_lsn | receive_start_tli | received_lsn | received_tli | latest_end_lsn | latest_end_time | slot_name
—–+——–+——————-+——————-+————–+————–+—————-+—————–+———–
12345 | stopped | 0/70000000 | 1 | 0/70000050 | 1 | 0/70000050 | 2026-04-09 08:00:00+08 | fgedudb_slot
# 步骤2:检查主库复制槽状态
$ gsql -h fgedu-primary -d postgres -c “SELECT * FROM pg_replication_slots WHERE slot_name=’fgedudb_slot’;
”
slot_name | plugin | slot_type | datoid | database | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
———–+——–+———–+——–+———-+——–+————+——+————–+————-+———————
fgedudb_slot | | physical | | | f | | | | 0/70000050 |
# 步骤3:检查主库当前LSN
$ gsql -h fgedu-primary -d postgres -c “SELECT pg_current_wal_lsn();
”
pg_current_wal_lsn
——————–
0/90000100
(1 row)
# 步骤4:计算延迟
# 主库LSN: 0/90000100
# 备库LSN: 0/70000050
# 差距约512MB,差距较大,选择重建备库
# 步骤5:重建备库
$ gs_ctl stop -D /opengauss/fgdata
$ rm -rf /opengauss/fgdata/*
# 步骤6:从主库重新备份
$ gs_probackup backup -B /opengauss/backup –instance=fgedudb -b FULL –remote-host=fgedu-primary –remote-user=opengauss
# 步骤7:恢复并启动备库
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata -i QMR9AL
touch /opengauss/fgdata/standby.signal
$ gs_ctl start -D /opengauss/fgdata
# 步骤8:验证复制
$ gsql -h fgedu-standby -d postgres -c “SELECT * FROM pg_stat_wal_receiver;
”
pid | status | receive_start_lsn | receive_start_tli | received_lsn | received_tli | latest_end_lsn | latest_end_time | slot_name
—–+——–+——————-+——————-+————–+————–+—————-+—————–+———–
12346 | streaming | 0/90000000 | 1 | 0/90000100 | 1 | 0/90000100 | 2026-04-09 14:30:00+08 | fgedudb_slot
# 步骤9:优化归档保留策略
$ gsql -h fgedu-primary -d postgres -c “ALTER SYSTEM SET archive_cleanup_command = ‘pg_archivecleanup /opengauss/archive %r’;
”
$ gsql -h fgedu-primary -d postgres -c “SELECT pg_reload_conf();
”
Part05-风哥经验总结与分享
5.1 openGauss归档管理最佳实践
归档管理最佳实践总结:
- 多重备份:归档日志至少保留2份,本地+远程
- 定期验证:每月验证归档日志的可用性
- 监控告警:实时监控归档状态和连续性
- 权限控制:限制归档目录的删除权限,避免误删
- 保留策略:归档保留时间不少于7天
5.2 openGauss归档检查清单
□ 检查归档日志是否正常生成
□ 检查归档目录空间使用率
□ 检查归档日志连续性
□ 检查备库复制延迟
# 每周检查清单
□ 验证最近归档日志可读性
□ 检查归档备份完整性
□ 清理过期归档日志
□ 更新归档监控报告
# 每月检查清单
□ 进行归档恢复演练
□ 验证远程归档备份
□ 优化归档保留策略
□ 归档管理文档更新
5.3 openGauss归档丢失预防措施
预防归档丢失的措施:
- RAID保护:归档目录使用RAID10或RAID6保护
- 异地备份:实时同步归档到异地存储
- 对象存储:将归档备份到对象存储(如MinIO、OSS)
- 定期快照:对归档目录定期进行存储快照
- 权限管控:实施最小权限原则,限制归档操作权限
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
