opengauss教程FG055-openGauss控制文件丢失恢复生产实战
本文档详细介绍openGauss数据库控制文件丢失的处理方法,包括控制文件备份恢复、手动重建、从备库恢复等操作,风哥教程参考openGauss官方文档数据库管理指南、备份恢复指南等内容,适合DBA人员在控制文件异常场景中使用。
Part01-基础概念与理论知识
1.1 openGauss控制文件基本概念
- 多副本机制:默认创建多个控制文件副本,提高可靠性
- 自动维护:数据库自动更新控制文件内容
- 启动必需:数据库启动时必须读取控制文件
- 实时更新:记录数据库检查点、日志位置等实时信息
1.2 openGauss控制文件内容详解
控制文件包含以下关键信息:
1. 数据库标识信息
– 数据库名称
– 数据库创建时间
– 数据库唯一标识符
2. 数据文件信息
– 数据文件路径和名称
– 数据文件大小
– 表空间信息
3. 日志信息
– 当前日志序列号(LSN)
– 最后检查点信息
– 归档日志信息
4. 备份信息
– 备份开始和结束时间
– 备份模式
– 备份状态
5. 运行状态信息
– 数据库状态
– 实例启动时间
– 事务ID信息
1.3 openGauss控制文件的重要性
控制文件在以下场景中发挥关键作用:
- 数据库启动:读取数据文件位置、日志位置等关键信息
- 故障恢复:确定恢复的起始点和需要应用的日志
- 备份恢复:记录备份元数据,支持恢复操作
- 一致性维护:维护数据库全局一致性状态
Part02-生产环境规划与建议
2.1 openGauss控制文件保护策略
控制文件保护策略建议:
# postgresql.conf
# 配置多个控制文件副本
control_files = ‘/opengauss/fgdata/pg_control,/opengauss/fgdata/pg_control1,/opengauss/fgdata/pg_control2’
# 控制文件副本分布在不同磁盘
# 副本1: 系统盘 /opengauss/fgdata/pg_control
# 副本2: 数据盘 /opengauss/fgdata/pg_control1
# 副本3: 日志盘 /opengauss/fgdata/pg_control2
# 控制文件权限设置
$ ls -la /opengauss/fgdata/pg_control*
-rw——- 1 opengauss opengauss 8192 Apr 9 10:00 /opengauss/fgdata/pg_control
-rw——- 1 opengauss opengauss 8192 Apr 9 10:00 /opengauss/fgdata/pg_control1
-rw——- 1 opengauss opengauss 8192 Apr 9 10:00 /opengauss/fgdata/pg_control2
2.2 openGauss控制文件备份策略
控制文件备份策略建议:
#!/bin/bash
# backup_controlfile.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
BACKUP_DIR=”/opengauss/backup/controlfile”
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份控制文件
cp /opengauss/fgdata/pg_control $BACKUP_DIR/pg_control_$DATE
# 备份控制文件信息到文本
gs_ctl query -D /opengauss/fgdata > $BACKUP_DIR/controlfile_info_$DATE.txt
# 压缩备份
tar czvf $BACKUP_DIR/controlfile_backup_$DATE.tar.gz -C $BACKUP_DIR pg_control_$DATE controlfile_info_$DATE.txt
# 保留最近30天的备份
find $BACKUP_DIR -name “controlfile_backup_*.tar.gz” -mtime +30 -delete
echo “控制文件备份完成: $BACKUP_DIR/controlfile_backup_$DATE.tar.gz”
2.3 openGauss控制文件监控方案
控制文件监控方案:
#!/bin/bash
# monitor_controlfile.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
CONTROL_FILES=”/opengauss/fgdata/pg_control /opengauss/fgdata/pg_control1 /opengauss/fgdata/pg_control2″
LOG_FILE=”/opengauss/logs/controlfile_monitor.log”
for cf in $CONTROL_FILES; do
if [ ! -f “$cf” ]; then
echo “$(date): 错误 – 控制文件不存在: $cf” >> $LOG_FILE
# 发送告警风哥提示:
continue
fi
# 检查文件大小
size=$(stat -c%s “$cf”)
if [ $size -eq 0 ]; then
echo “$(date): 错误 – 控制文件大小为0: $cf” >> $LOG_FILE
continue
fi
# 检查文件权限
perm=$(stat -c%a “$cf”)
if [ “$perm” != “600” ]; then
echo “$(date): 警告 – 控制文件权限异常: $cf (当前: $perm, 期望: 600)” >> $LOG_FILE
fi
echo “$(date): 控制文件检查正常: $cf” >> $LOG_FILE
done
Part03-生产环境项目实施方案
3.1 openGauss基于备份的控制文件恢复
3.1.1 从备份恢复控制文件
# 步骤1:确认控制文件丢失
$ ls -la /opengauss/fgdata/pg_control*
ls: cannot access ‘/opengauss/fgdata/pg_control*’: No such file or directory
# 步骤2:从备份恢复控制文件
$ cp /opengauss/backup/controlfile/pg_control_20260409_020000 /opengauss/fgdata/pg_control
$ cp /opengauss/backup/controlfile/pg_control_20260409_020000 /opengauss/fgdata/pg_control1
$ cp /opengauss/backup/controlfile/pg_control_20260409_020000 /opengauss/fgdata/pg_control2
# 步骤3:修改权限
$ chown opengauss:opengauss /opengauss/fgdata/pg_control*
$ chmod 600 /opengauss/fgdata/pg_control*
# 步骤4:尝试启动数据库
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start…. done
server started
# 步骤5:验证数据库状态
$ gsql -d postgres -c “SELECT pg_is_in_recovery();
”
pg_is_in_recovery
——————-
f
(1 row)
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM pg_tables WHERE schemaname=’fgedu’;
”
count
——-
25
(1 row)
3.2 openGauss手动重建控制文件
3.2.1 使用gs_initdb重建控制文件
学习交流加群风哥QQ113257174
# 步骤1:停止数据库(如果还在运行)
$ gs_ctl stop -D /opengauss/fgdata -m immediate
# 步骤2:备份数据目录
$ cp -r /opengauss/fgdata /opengauss/fgdata_backup_$(date +%Y%m%d_%H%M%S)
# 步骤3:使用gs_initdb重建控制文件
# 注意:这会创建新的控制文件,但保留数据文件
$ gs_initdb -D /opengauss/fgdata –nodename=fgedudb -w fgedu_password –encoding=UTF-8 –locale=en_US.UTF-8 –noclean
The files belonging to this database system will be owned by user “opengauss”.
This user must also own the server process.
The database cluster will be initialized with locale “en_US.UTF-8”.
The default database encoding has accordingly been set to “UTF8”.
creating directory /opengauss/fgdata … ok
creating subdirectories … ok
selecting default max_connections … 100
selecting default shared_buffers … 128MB
creating configuration files … ok
running bootstrap script … ok
performing post-bootstrap initialization … ok
syncing data to disk … ok
# 步骤4:恢复数据文件
# 从备份恢复数据文件到新的数据目录
$ cp -r /opengauss/fgdata_backup_*/base /opengauss/fgdata/
$ cp -r /opengauss/fgdata_backup_*/global /opengauss/fgdata/
$ cp -r /opengauss/fgdata_backup_*/pg_xact /opengauss/fgdata/
# 步骤5:修改权限
$ chown -R opengauss:opengauss /opengauss/fgdata
$ chmod 700 /opengauss/fgdata
# 步骤6:启动数据库
$ gs_ctl start -D /opengauss/fgdata
# 步骤7:验证数据完整性更多视频教程www.fgedu.net.cn
$ gsql -d fgedudb -c “SELECT pg_database_size(‘fgedudb’);
”
pg_database_size
——————
5242880000
(1 row)
3.3 openGauss从备库恢复控制文件
3.3.1 从备库复制控制文件
# 步骤1:停止主库
$ gs_ctl stop -D /opengauss/fgdata
waiting for server to shut down…. done
server stopped
# 步骤2:从备库复制控制文件
$ scp opengauss@fgedu-standby:/opengauss/fgdata/pg_control /opengauss/fgdata/pg_control
$ scp opengauss@fgedu-standby:/opengauss/fgdata/pg_control /opengauss/fgdata/pg_control1
$ scp opengauss@fgedu-standby:/opengauss/fgdata/pg_control /opengauss/fgdata/pg_control2
pg_control 100% 8192 8.0KB/s 00:00
# 步骤3:修改控制文件中的数据库角色
# 编辑控制文件将角色改为主库(需要专业工具或手动修改)
# 或者使用gs_resetwal工具
$ gs_resetwal -D /opengauss/fgdata -f
Write-ahead log reset
# 步骤4:修改权限
$ chown opengauss:opengauss /opengauss/fgdata/pg_control*
$ chmod 600 /opengauss/fgdata/pg_control*
# 步骤5:启动主库更多学习教程公众号风哥教程itpux_com
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start…. done
server started
# 步骤6:重新配置备库连接
$ gsql -d postgres -c “SELECT * FROM pg_stat_replication;
”
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state
—–+———-+———+——————+————-+—————–+————-+—————+————–+——-+———-+———–+———–+————+———–+———–+————+—————+————
(0 rows)
# 需要重新建立复制连接
Part04-生产案例与实战讲解
4.1 openGauss单控制文件丢失恢复
4.1.1 案例背景
数据库运行过程中,存储故障导致其中一个控制文件pg_control1损坏,其他控制文件正常。
4.1.2 恢复过程
$ ls -la /opengauss/fgdata/pg_control*from DB视频:www.itpux.com
-rw——- 1 opengauss opengauss 8192 Apr 9 10:00 /opengauss/fgdata/pg_control
-rw——- 1 opengauss opengauss 0 Apr 9 10:30 /opengauss/fgdata/pg_control1
-rw——- 1 opengauss opengauss 8192 Apr 9 10:00 /opengauss/fgdata/pg_control2
# 发现pg_control1大小为0,已损坏
# 步骤2:从其他副本恢复
$ cp /opengauss/fgdata/pg_control /opengauss/fgdata/pg_control1
# 步骤3:修改权限
$ chown opengauss:opengauss /opengauss/fgdata/pg_control1
$ chmod 600 /opengauss/fgdata/pg_control1
# 步骤4:验证控制文件
$ ls -la /opengauss/fgdata/pg_control*
-rw——- 1 opengauss opengauss 8192 Apr 9 10:00 /opengauss/fgdata/pg_control
-rw——- 1 opengauss opengauss 8192 Apr 9 11:00 /opengauss/fgdata/pg_control1
-rw——- 1 opengauss opengauss 8192 Apr 9 10:00 /opengauss/fgdata/pg_control2
# 步骤5:检查数据库状态
$ gsql -d postgres -c “SELECT 1;
”
?column?
———-
1
(1 row)
# 数据库运行正常
4.2 openGauss全部控制文件丢失恢复
4.2.1 案例背景
磁盘阵列故障导致所有控制文件丢失,但数据文件完好。
4.2.2 恢复过程
$ ls -la /opengauss/fgdata/pg_control*
ls: cannot access ‘/opengauss/fgdata/pg_control*’: No such file or directory
# 步骤2:确认数据文件存在
$ ls -la /opengauss/fgdata/base/
total 64
drwx—— 16 opengauss opengauss 4096 Apr 9 10:00 .
drwx—— 20 opengauss opengauss 4096 Apr 9 10:00 ..
drwx—— 2 opengauss opengauss 4096 Apr 9 10:00 1
drwx—— 2 opengauss opengauss 4096 Apr 9 10:00 16384
drwx—— 2 opengauss opengauss 4096 Apr 9 10:00 16385
# 步骤3:从最近的备份恢复控制文件
$ ls -lt /opengauss/backup/controlfile/
total 32
-rw-r–r– 1 opengauss opengauss 8192 Apr 9 02:00 pg_control_20260409_020000
-rw-r–r– 1 opengauss opengauss 8192 Apr 8 02:00 pg_control_20260408_020000
# 步骤4:恢复控制文件
$ cp /opengauss/backup/controlfile/pg_control_20260409_020000 /opengauss/fgdata/pg_control
$ cp /opengauss/backup/controlfile/pg_control_20260409_020000 /opengauss/fgdata/pg_control1
$ cp /opengauss/backup/controlfile/pg_control_20260409_020000 /opengauss/fgdata/pg_control2
# 步骤5:修改权限
$ chown opengauss:opengauss /opengauss/fgdata/pg_control*
$ chmod 600 /opengauss/fgdata/pg_control*
# 步骤6:尝试启动数据库
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start…. done
server started
# 步骤7:验证数据完整性
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM fgedu.fgedu_orders;
”
count
——-
12580
(1 row)
$ gsql -d fgedudb -c “SELECT pg_database_datfrozenxid FROM pg_database WHERE datname=’fgedudb’;
”
pg_database_datfrozenxid
————————–
548
(1 row)
4.3 openGauss控制文件损坏恢复
4.3.1 案例背景
数据库异常断电导致控制文件损坏,数据库无法启动。
4.3.2 恢复过程
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start…. stopped waiting
pg_ctl: could not start server
Examine the log output.
# 步骤2:查看错误日志
$ tail -50 /opengauss/fgdata/pg_log/postgresql-2026-04-09.log
2026-04-09 14:30:25.123 CST [12345] LOG: database system was shut down at 2026-04-09 14:25:10 CST
2026-04-09 14:30:25.145 CST [12345] FATAL: could not read block 0 in file “pg_control”: Bad file descriptor
2026-04-09 14:30:25.146 CST [12345] LOG: database system is in recovery mode
# 步骤3:检查控制文件
$ pg_controldata /opengauss/fgdata
pg_control version number: 960
Catalog version number: 202105121
Database system identifier: 1234567890123456789
Database cluster state: in production
pg_control last modified: Thu 09 Apr 2026 02:00:00 PM CST
Latest checkpoint location: 0/12000028
Prior checkpoint location: 0/10000028
# 步骤4:使用gs_resetwal修复
$ gs_resetwal -D /opengauss/fgdata -l 000000010000000000000001
Write-ahead log reset
# 步骤5:重新生成控制文件
$ gs_ctl init -D /opengauss/fgdata –nodename=fgedudb
# 步骤6:启动数据库
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start…. done
server started
# 步骤7:验证数据
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM pg_tables;
”
count
——-
156
(1 row)
Part05-风哥经验总结与分享
5.1 openGauss控制文件管理最佳实践
控制文件管理最佳实践总结:
- 多副本配置:至少配置3个控制文件副本
- 分散存储:控制文件副本分布在不同物理磁盘
- 定期备份:每日备份控制文件到安全位置
- 监控告警:实时监控控制文件状态和大小
- 权限控制:严格控制控制文件的访问权限
5.2 openGauss控制文件检查清单
□ 检查控制文件是否存在
□ 检查控制文件大小是否正常(通常8KB)
□ 检查控制文件权限是否正确(600)
□ 检查控制文件时间戳是否更新
# 每周检查清单
□ 验证控制文件备份完整性
□ 检查控制文件副本一致性
□ 测试控制文件恢复流程
□ 更新控制文件管理文档
# 每月检查清单
□ 进行控制文件恢复演练
□ 验证多副本配置有效性
□ 优化控制文件保护策略
□ 归档控制文件历史备份
5.3 openGauss控制文件丢失预防措施
预防控制文件丢失的措施:
- RAID保护:控制文件所在磁盘使用RAID10保护
- 异地备份:实时同步控制文件到异地存储
- 快照保护:定期对控制文件进行存储快照
- 权限管控:实施最小权限原则,限制控制文件操作
- 变更管理:控制文件变更需经过审批流程
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
