opengauss教程FG056-openGauss数据文件误删除恢复生产实战
本文档详细介绍openGauss数据库数据文件误删除的处理方法,包括基于备份恢复、PITR恢复、从备库恢复等操作,风哥教程参考openGauss官方文档数据库管理指南、备份恢复指南等内容,适合DBA人员在数据文件异常场景中使用。
Part01-基础概念与理论知识
1.1 openGauss数据文件基本概念
- 按表存储:每个表对应独立的数据文件
- 页式结构:数据文件由固定大小的页组成(默认8KB)
- OID命名:数据文件以对象的OID命名
- 表空间组织:数据文件按表空间组织存储
1.2 openGauss数据文件结构详解
数据文件存储结构和路径:
/opengauss/fgdata/base/
├── 1/ # 模板数据库目录
│ ├── 112/ # 系统表数据文件
│ ├── 113/ # 系统表数据文件
│ └── …
├── 16384/ # fgedudb数据库目录
│ ├── 16385/ # 表数据文件
│ ├── 16386/ # 索引数据文件
│ └── …
└── 16385/ # 其他数据库目录
# 表空间数据文件路径
/opengauss/fgdata/pg_tblspc/
├── 16387 -> /opengauss/fgdata/fgedutbs/ # fgedutbs表空间
└── …
# 数据文件命名规则
# 文件名 = 表的OID
# 例如:16385对应pg_class表中relfilenode=16385的表
1.3 openGauss数据文件删除的影响
数据文件删除的影响:
- 表访问失败:访问被删除数据文件的表会报错
- 查询中断:涉及该表的查询会失败
- 事务回滚:正在进行的涉及该表的事务可能失败
- 数据库损坏:系统表文件删除可能导致数据库无法启动
Part02-生产环境规划与建议
2.1 openGauss数据文件保护策略
数据文件保护策略建议:
# 1. 目录权限控制
$ ls -ld /opengauss/fgdata/base
drwx—— 16 opengauss opengauss 4096 Apr 9 10:00 /opengauss/fgdata/base
# 2. 文件权限设置
$ ls -la /opengauss/fgdata/base/16384/
-rw——- 1 opengauss opengauss 8192 Apr 9 10:00 16385
-rw——- 1 opengauss opengauss 8192 Apr 9 10:00 16386
# 3. 禁止直接操作数据文件
# 在操作系统层面设置alias
alias rm=’rm -i’
alias rm=’rm –preserve-root’
# 4. 数据目录只读挂载(可选)
# mount -o ro /dev/sdb1 /opengauss/fgdata
2.2 openGauss数据文件备份策略
数据文件备份策略建议:
1. 物理备份(推荐)
– 使用gs_probackup进行全量备份
– 每日凌晨执行全量备份
– 每4小时执行增量备份
2. 存储快照
– 使用存储层快照功能
– 每小时创建一次快照
– 保留最近48小时快照
3. 逻辑备份
– 使用gs_dump导出关键表
– 每日导出核心业务表
– 保留最近7天逻辑备份
# 备份脚本
#!/bin/bash
# backup_datafile.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
BACKUP_DIR=”/opengauss/backup”
DATE=$(date +%Y%m%d_%H%M%S)
# 执行全量备份
gs_probackup backup -B $BACKUP_DIR –instance=fgedudb -b FULL
# 创建存储快照
lvcreate -L 10G -s -n fgdata_snap_$DATE /dev/vg_opengauss/lv_fgdata
# 保留策略
find $BACKUP_DIR -name “*.backup” -mtime +7 -delete
2.3 openGauss数据文件监控方案
数据文件监控方案:
#!/bin/bash
# monitor_datafile.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
DATA_DIR=”/opengauss/fgdata/base”
LOG_FILE=”/opengauss/logs/datafile_monitor.log”风哥提示:
# 检查数据文件数量变化
file_count=$(find $DATA_DIR -type f | wc -l)
last_count=$(cat /tmp/last_file_count 2>/dev/null || echo 0)
if [ $file_count -lt $last_count ]; then
echo “$(date): 警告 – 数据文件数量减少: $last_count -> $file_count” >> $LOG_FILE
# 发送告警
fi
echo $file_count > /tmp/last_file_count
# 检查数据文件大小异常
find $DATA_DIR -type f -size 0 -exec echo “$(date): 警告 – 空数据文件: {}” >> $LOG_FILE \;
# 检查数据文件权限
find $DATA_DIR -type f ! -perm 600 -exec echo “$(date): 警告 – 权限异常: {}” >> $LOG_FILE \;
Part03-生产环境项目实施方案
3.1 openGauss基于备份的数据文件恢复
3.1.1 从物理备份恢复数据文件
# 步骤1:确认数据文件丢失学习交流加群风哥微信: itpux-com
$ ls -la /opengauss/fgdata/base/16384/16385
ls: cannot access ‘/opengauss/fgdata/base/16384/16385′: No such file or directory
# 步骤2:确认表信息
$ gsql -d fgedudb -c “SELECT oid, relfilenode FROM pg_class WHERE relname=’fgedu_orders’;
”
oid | relfilenode
——–+————-
16385 | 16385
(1 row)
# 步骤3:查找最近的备份
$ gs_probackup show -B /opengauss/backup –instance=fgedudb | head -5
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
# 步骤4:创建临时恢复目录
$ mkdir -p /opengauss/fgdata_temp
# 步骤5:恢复备份到临时目录
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata_temp -i QMR8YJ
INFO: Restore begin.
INFO: Checking backup QMR8YJ
INFO: Backup QMR8YJ is valid
INFO: Restoring backup QMR8YJ
INFO: Copying data files
INFO: Data files are copied
INFO: Restore completed successfully
# 步骤6:复制数据文件到原位置
$ cp /opengauss/fgdata_temp/base/16384/16385 /opengauss/fgdata/base/16384/
$ chown opengauss:opengauss /opengauss/fgdata/base/16384/16385
$ chmod 600 /opengauss/fgdata/base/16384/16385学习交流加群风哥QQ113257174
# 步骤7:验证数据文件
$ ls -la /opengauss/fgdata/base/16384/16385
-rw——- 1 opengauss opengauss 134217728 Apr 9 11:00 /opengauss/fgdata/base/16384/16385
# 步骤8:验证表访问
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM fgedu.fgedu_orders;
”
count
——-
12580
(1 row)
# 步骤9:清理临时目录
$ rm -rf /opengauss/fgdata_temp
3.2 openGauss基于PITR的数据文件恢复
3.2.1 使用PITR恢复特定表的数据文件
# 步骤1:确认删除时间
# 数据文件删除时间:2026-04-09 14:30:00
# 步骤2:执行PITR恢复到删除前
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata_recovery -i QMR8YJ –recovery-target-time=”2026-04-09 14:29:59+08″
INFO: Restore begin.
INFO: Checking backup QMR8YJ
INFO: Backup QMR8YJ is valid
INFO: Restoring backup QMR8YJ
INFO: Recovery target time: 2026-04-09 14:29:59+08
INFO: Copying data files
INFO: Data files are copied
INFO: Generating recovery.conf
INFO: Restore completed successfully
# 步骤3:启动临时实例更多视频教程www.fgedu.net.cn
$ gs_ctl start -D /opengauss/fgdata_recovery -p 25433
waiting for server to start…. done
server started
# 步骤4:导出表数据
$ gs_dump -h localhost -p 25433 -d fgedudb -t fgedu.fgedu_orders –data-only -f /tmp/fgedu_orders_data.sql
# 步骤5:在原库恢复数据
$ gsql -d fgedudb -c “TRUNCATE TABLE fgedu.fgedu_orders;”
$ gsql -d fgedudb -f /tmp/fgedu_orders_data.sql
# 步骤6:验证数据
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM fgedu.fgedu_orders;
”
count
——-
12580
(1 row)
# 步骤7:清理临时实例
$ gs_ctl stop -D /opengauss/fgdata_recovery
$ rm -rf /opengauss/fgdata_recovery
3.3 openGauss从备库恢复数据文件
3.3.1 从备库复制数据文件
# 步骤1:确认主库数据文件丢失
$ ls -la /opengauss/fgdata/base/16384/16385
ls: cannot access ‘/opengauss/fgdata/base/16384/16385’: No such file or directory
# 步骤2:停止主库(避免数据不一致)
$ gs_ctl stop -D /opengauss/fgdata
waiting for server to shut down…. done更多学习教程公众号风哥教程itpux_com
server stopped
# 步骤3:从备库复制数据文件
$ scp opengauss@fgedu-standby:/opengauss/fgdata/base/16384/16385 /opengauss/fgdata/base/16384/
16385 100% 128MB 12.8MB/s 00:10
# 步骤4:修改权限
$ chown opengauss:opengauss /opengauss/fgdata/base/16384/16385
$ chmod 600 /opengauss/fgdata/base/16384/16385
# 步骤5:启动主库
$ 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 | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | sync_state
—–+———-+———+——————+————-+——-+———-+———–+———–+————+———–
12345 | 16384 | repl | fgedu_standby | 192.168.1.11|streaming|0/16000000|0/16000000|0/16000000|0/16000000| async
# 步骤7:验证数据完整性
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM fgedu.fgedu_orders;
”
count
——-from DB视频:www.itpux.com
12580
(1 row)
Part04-生产案例与实战讲解
4.1 openGauss单数据文件误删恢复
4.1.1 案例背景
运维人员误执行rm命令,删除了fgedu_orders表的数据文件16385。
4.1.2 恢复过程
$ ls -la /opengauss/fgdata/base/16384/16385
ls: cannot access ‘/opengauss/fgdata/base/16384/16385’: No such file or directory
# 步骤2:检查数据库日志
$ tail -50 /opengauss/fgdata/pg_log/postgresql-2026-04-09.log
2026-04-09 15:30:25.123 CST [12345] ERROR: could not open file “base/16384/16385”: No such file or directory
2026-04-09 15:30:25.123 CST [12345] STATEMENT: SELECT * FROM fgedu.fgedu_orders
# 步骤3:从备份恢复数据文件
$ mkdir -p /opengauss/fgdata_temp
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata_temp -i QMR8YJ
# 步骤4:复制数据文件
$ cp /opengauss/fgdata_temp/base/16384/16385 /opengauss/fgdata/base/16384/
$ chown opengauss:opengauss /opengauss/fgdata/base/16384/16385
$ chmod 600 /opengauss/fgdata/base/16384/16385
# 步骤5:验证恢复
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM fgedu.fgedu_orders;
”
count
——-
12580
(1 row)
$ gsql -d fgedudb -c “SELECT * FROM fgedu.fgedu_orders LIMIT 5;
”
order_id | customer_id | product_id | quantity | order_time | status
———-+————-+————+———-+———————+———-
1 | 1001 | 101 | 2 | 2026-01-01 10:00:00 | COMPLETED
2 | 1002 | 102 | 1 | 2026-01-01 11:00:00 | COMPLETED
3 | 1003 | 103 | 3 | 2026-01-01 12:00:00 | PENDING
4 | 1004 | 104 | 1 | 2026-01-01 13:00:00 | COMPLETED
5 | 1005 | 105 | 2 | 2026-01-01 14:00:00 | SHIPPED
(5 rows)
# 步骤6:清理
$ rm -rf /opengauss/fgdata_temp
4.2 openGauss表空间数据文件恢复
4.2.1 案例背景
存储故障导致fgedutbs表空间的数据文件丢失。
4.2.2 恢复过程
$ gsql -d fgedudb -c “SELECT spcname, pg_tablespace_location(oid) FROM pg_tablespace WHERE spcname=’fgedutbs’;
”
spcname | pg_tablespace_location
———-+————————
fgedutbs | /opengauss/fgdata/fgedutbs
(1 row)
# 步骤2:检查表空间文件
$ ls -la /opengauss/fgdata/fgedutbs/16384/
ls: cannot access ‘/opengauss/fgdata/fgedutbs/16384/’: No such file or directory
# 步骤3:从备份恢复整个表空间
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata_recovery -i QMR8YJ
# 步骤4:恢复表空间目录
$ mkdir -p /opengauss/fgdata/fgedutbs/16384
$ cp -r /opengauss/fgdata_recovery/fgedutbs/16384/* /opengauss/fgdata/fgedutbs/16384/
$ chown -R opengauss:opengauss /opengauss/fgdata/fgedutbs
$ chmod -R 700 /opengauss/fgdata/fgedutbs
# 步骤5:验证表空间
$ gsql -d fgedudb -c “SELECT pg_tablespace_size(‘fgedutbs’);
”
pg_tablespace_size
——————–
1073741824
(1 row)
# 步骤6:验证表访问
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM fgedu.fgedu_large_table;
”
count
——-
500000
(1 row)
4.3 openGauss系统表空间文件恢复
4.3.1 案例背景
系统表空间pg_global中的数据文件损坏,数据库无法启动。
4.3.2 恢复过程
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start…. stopped waiting
pg_ctl: could not start server
# 步骤2:查看错误日志
$ tail -50 /opengauss/fgdata/pg_log/postgresql-2026-04-09.log
2026-04-09 16:30:25.123 CST [12345] FATAL: could not open file “global/1262”: No such file or directory
2026-04-09 16:30:25.123 CST [12345] LOG: database system is shut down
# 步骤3:从备份恢复系统表空间
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata_recovery -i QMR8YJ
# 步骤4:恢复系统表空间文件
$ cp /opengauss/fgdata_recovery/global/1262 /opengauss/fgdata/global/
$ chown opengauss:opengauss /opengauss/fgdata/global/1262
$ chmod 600 /opengauss/fgdata/global/1262
# 步骤5:启动数据库
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start…. done
server started
# 步骤6:验证数据库状态
$ gsql -d postgres -c “SELECT version();
”
version
————————————————————————————————–
openGauss 5.0.0 build 7c71d3e0 compiled at 2026-04-01 10:00:00 commit 0 last mr 500
(1 row)
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM pg_tables;
”
count
——-
156
(1 row)
Part05-风哥经验总结与分享
5.1 openGauss数据文件管理最佳实践
数据文件管理最佳实践总结:
- 严格权限:数据目录权限设置为700,文件权限600
- 定期备份:每日执行全量备份,保留多个备份副本
- 存储保护:使用RAID保护数据文件存储
- 监控告警:实时监控数据文件状态和大小
- 操作规范:禁止直接操作数据文件,所有操作通过SQL执行
5.2 openGauss数据文件检查清单
□ 检查数据文件目录权限
□ 检查数据文件数量变化
□ 检查数据文件大小异常
□ 检查数据文件权限
# 每周检查清单
□ 验证数据文件备份完整性
□ 检查表空间使用情况
□ 监控数据文件增长趋势
□ 清理过期数据文件
# 每月检查清单
□ 进行数据文件恢复演练
□ 验证备份可用性
□ 优化数据文件存储布局
□ 更新数据文件管理文档
5.3 openGauss数据文件误删预防措施
预防数据文件误删的措施:
- 权限隔离:数据目录仅数据库用户可访问
- 命令别名:设置rm命令别名,增加确认提示
- 回收站机制:配置操作系统级回收站
- 定期快照:使用存储快照保护数据文件
- 变更审批:数据文件操作需经过审批流程
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
