opengauss教程FG052-openGauss单表与全库恢复生产实战
本文档详细介绍openGauss数据库单表与全库恢复的生产实战方法,包括单表恢复、全库恢复、模式级恢复等操作,风哥教程参考openGauss官方文档备份恢复指南、数据库管理指南等内容,适合DBA人员在数据恢复场景中使用。
Part01-基础概念与理论知识
1.1 openGauss数据恢复基本概念
- 物理恢复:基于物理备份进行恢复,速度快,适合全库恢复
- 逻辑恢复:基于逻辑备份(SQL导出)进行恢复,灵活度高
- 单表恢复:只恢复特定表的数据,不影响其他对象
- 全库恢复:恢复整个数据库到某一时间点
1.2 openGauss恢复类型与适用场景
不同恢复类型适用于不同的业务场景:
- 完全恢复:将数据库恢复到最新状态,适用于介质故障
- 不完全恢复:将数据库恢复到某一时间点,适用于逻辑错误
- 表级恢复:只恢复特定表,适用于误删除表或表数据损坏
- 增量恢复:基于增量备份进行恢复,节省时间和空间
1.3 openGauss恢复原理与流程
openGauss恢复的基本原理和流程:
1. 准备阶段:确认备份有效性,准备恢复环境
2. 停止数据库:停止目标数据库实例
3. 恢复数据文件:从备份中还原数据文件
4. 应用WAL日志:回放归档日志到目标时间点
5. 验证恢复:检查数据完整性和一致性
6. 启动数据库:启动实例并验证服务正常
Part02-生产环境规划与建议
2.1 openGauss恢复策略规划
生产环境恢复策略规划要点:
1. RTO(恢复时间目标):业务可接受的最大停机时间
2. RPO(恢复点目标):业务可接受的最大数据丢失量
3. 恢复优先级:核心业务优先,次要业务延后
4. 恢复路径:本地恢复、异地恢复、灾备切换
# 生产环境建议
– 关键业务RTO < 1小时,RPO < 15分钟
- 一般业务RTO < 4小时,RPO < 1小时
- 建立分级恢复预案
- 定期进行恢复演练
2.2 openGauss恢复前准备工作
恢复前必须完成的准备工作:
- 备份验证:确认备份文件完整可用
- 资源评估:确保恢复环境资源充足
- 影响评估:评估恢复操作对业务的影响
- 回退方案:准备恢复失败的回退方案
- 通知相关方:提前通知业务方和运维团队
2.3 openGauss恢复环境配置
恢复环境配置要求:
1. 操作系统版本与源环境一致
2. openGauss版本与备份时一致
3. 存储空间至少是备份大小的2倍
4. 网络配置正确,端口可用
5. 环境变量配置正确
# 目录权限设置
$ chown -R opengauss:opengauss /opengauss/fgdata
$ chmod 700 /opengauss/fgdata
Part03-生产环境项目实施方案
3.1 openGauss单表恢复实战
3.1.1 使用gs_restore进行单表恢复
# 步骤1:查看备份文件中的表列表
$ gs_restore -l /opengauss/backup/fgedudb_20260409.dump | grep fgedu_orders
3127; 0 17134 TABLE fgedu_orders fgedu
# 步骤2:恢复单个表到新建表
$ gs_restore -d fgedudb -t fgedu_orders /opengauss/backup/fgedudb_20260409.dump
pg_restore: connecting to database for restore
pg_restore: creating TABLE “fgedu.fgedu_orders”
pg_restore: processing data for table “fgedu.fgedu_orders”
pg_restore: executing SEQUENCE SET fgedu_orders_seq
pg_restore: finished main parallel loop
# 步骤3:验证恢复的数据
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM fgedu.fgedu_orders;
”
count
——-
12580
(1 row)
# 步骤4:对比数据完整性
$ gsql -d fgedudb -c “SELECT MIN(create_time), MAX(create_time) FROM fgedu.fgedu_orders;
”
min | max
——————+——————
2026-01-01 00:00:00 | 2026-04-08 23:59:59
(1 row)
3.1.2 使用COPY命令恢复单表数据
# 步骤1:创建临时表
$ gsql -d fgedudb -c “CREATE TABLE fgedu.fgedu_orders_temp (LIKE fgedu.fgedu_orders INCLUDING ALL);
”
CREATE TABLE
# 步骤2:使用COPY导入数据
$ gsql -d fgedudb -c “COPY fgedu.fgedu_orders_temp FROM ‘/opengauss/backup/fgedu_orders_20260409.csv’ WITH (FORMAT csv, HEADER true);”
COPY 12580
# 步骤3:验证数据
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM fgedu.fgedu_orders_temp;
”
count
——-
12580
(1 row)
# 步骤4:数据校验后替换原表
$ gsql -d fgedudb -c “BEGIN; ALTER TABLE fgedu.fgedu_orders RENAME TO fgedu_orders_old; ALTER TABLE fgedu.fgedu_orders_temp RENAME TO fgedu_orders; COMMIT;
”
COMMIT
3.2 openGauss全库恢复实战
3.2.1 使用gs_probackup进行全库恢复
# 步骤1:停止数据库
$ gs_ctl stop -D /opengauss/fgdata
waiting for server to shut down…. done
server stopped
# 步骤2:备份当前数据目录(防止恢复失败)
$ mv /opengauss/fgdata /opengauss/fgdata_corrupted_$(date +%Y%m%d_%H%M%S)
# 步骤3:执行全库恢复
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata -i QMR8YJ
INFO: Restore begin.
INFO: Checking backup QMR8YJ
INFO: Backup QMR8YJ is valid
INFO: Restoring backup QMR8YJ
INFO: Restore destination is not empty: /opengauss/fgdata
INFO: Cleaning restore destination
INFO: Copying data files
INFO: Data files are copied
INFO: Applying WAL files
INFO: WAL files are applied
INFO: Restore completed successfully
# 步骤4:修改数据目录权限
$ chown -R opengauss:opengauss /opengauss/fgdata
$ chmod 700 /opengauss/fgdata
# 步骤5:启动数据库
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start…. done
server started
# 步骤6:验证数据库状态
$ gsql -d postgres -c “SELECT pg_is_in_recovery();
”
pg_is_in_recovery
——————-学习交流加群风哥QQ113257174
f
(1 row)
$ gsql -d fgedudb -c “SELECT datname, pg_database_size(datname) FROM pg_database WHERE datname=’fgedudb’;
”
datname | pg_database_size
———-+——————
fgedudb | 52428800000
(1 row)
3.2.2 恢复到指定时间点(PITR)
# 步骤1:确认备份和归档日志可用
$ 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
# 步骤2:执行时间点恢复
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata -i QMR8YJ –recovery-target-time=”2026-04-09 10:30:00″
INFO: Restore begin.
INFO: Checking backup QMR8YJ
INFO: Backup QMR8YJ is valid
INFO: Restoring backup QMR8YJ
INFO: Recovery target time: 2026-04-09 10:30:00
INFO: Copying data files
INFO: Data files are copied
INFO: Generating recovery.conf
INFO: Restore completed successfully
# 步骤3:启动数据库并验证
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start…. done更多视频教程www.fgedu.net.cn
server started
# 步骤4:检查恢复后的数据状态
$ gsql -d fgedudb -c “SELECT pg_last_xact_replay_timestamp();
”
pg_last_xact_replay_timestamp
——————————-
2026-04-09 10:29:58.123456+08
(1 row)
3.3 openGauss模式级恢复实战
3.3.1 恢复整个模式
# 步骤1:查看备份中的模式列表
$ gs_restore -l /opengauss/backup/fgedudb_20260409.dump | grep SCHEMA
3125; 0 0 SCHEMA – fgedu_schema fgedu
# 步骤2:恢复整个模式
$ gs_restore -d fgedudb -n fgedu_schema /opengauss/backup/fgedudb_20260409.dump
pg_restore: connecting to database for restore
pg_restore: creating SCHEMA “fgedu_schema”
pg_restore: creating TABLE “fgedu_schema.fgedu_orders”
pg_restore: creating TABLE “fgedu_schema.fgedu_products”
pg_restore: creating TABLE “fgedu_schema.fgedu_customers”
pg_restore: processing data for table “fgedu_schema.fgedu_orders”
pg_restore: processing data for table “fgedu_schema.fgedu_products”
pg_restore: processing data for table “fgedu_schema.fgedu_customers”
pg_restore: finished main parallel loop
# 步骤3:验证模式对象更多学习教程公众号风哥教程itpux_com
$ gsql -d fgedudb -c “\dn fgedu_schema”
List of schemas
Name | Owner
—————+——–
fgedu_schema | fgedu
(1 row)
$ gsql -d fgedudb -c “SELECT tablename FROM pg_tables WHERE schemaname=’fgedu_schema’;
”
tablename
—————–
fgedu_orders
fgedu_products
fgedu_customers
(3 rows)
Part04-生产案例与实战讲解
4.1 openGauss误删除表恢复案例
4.1.1 案例背景
某生产环境DBA误执行了DROP TABLE操作,删除了重要的业务表fgedu_orders,需要紧急恢复。
4.1.2 恢复过程
# 误操作:DROP TABLE fgedu.fgedu_orders;
# 步骤1:立即停止相关应用,防止数据写入from DB视频:www.itpux.com
# 步骤2:确认最新备份时间
$ 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
# 步骤3:创建临时恢复实例
$ mkdir -p /opengauss/fgdata_temp
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata_temp -i QMR8YJ
# 步骤4:启动临时实例
$ gs_ctl start -D /opengauss/fgdata_temp -p 25433
# 步骤5:从临时实例导出表数据
$ gs_dump -h localhost -p 25433 -d fgedudb -t fgedu.fgedu_orders -f /tmp/fgedu_orders_restore.sql
# 步骤6:在目标库恢复表
$ gsql -d fgedudb -f /tmp/fgedu_orders_restore.sql
# 步骤7:验证恢复结果
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM fgedu.fgedu_orders;
”
count
——-
12580
(1 row)
# 步骤8:清理临时实例
$ gs_ctl stop -D /opengauss/fgdata_temp
$ rm -rf /opengauss/fgdata_temp
4.2 openGauss数据损坏恢复案例
4.2.1 案例背景
数据库文件因磁盘故障导致部分数据文件损坏,数据库无法启动,需要进行全库恢复。
4.2.2 恢复过程
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start…. stopped waiting
pg_ctl: could not start server
Examine the log output.
# 查看日志
$ tail -100 /opengauss/fgdata/pg_log/postgresql-2026-04-09.log
2026-04-09 16:30:25.123 CST [12345] LOG: database system was shut down at 2026-04-09 16:25:10 CST
2026-04-09 16:30:25.145 CST [12345] LOG: invalid page in block 1234 of relation base/16384/16385
2026-04-09 16:30:25.146 CST [12345] FATAL: could not read block 1234 in file “base/16384/16385”: read only 0 of 8192 bytes
# 恢复步骤
# 步骤1:确认损坏范围
$ gs_ctl stop -D /opengauss/fgdata
# 步骤2:备份损坏的数据目录
$ tar czvf /opengauss/backup/corrupted_fgdata_20260409.tar.gz /opengauss/fgdata
# 步骤3:执行全库恢复
$ gs_probackup restore -B /opengauss/backup –instance=fgedudb -D /opengauss/fgdata -i QMR8YJ –force
INFO: Restore begin.
INFO: Checking backup QMR8YJ
INFO: Backup QMR8YJ is valid
INFO: Restoring backup QMR8YJ
INFO: Restore destination is not empty: /opengauss/fgdata
INFO: Cleaning restore destination
INFO: Copying data files
INFO: Data files are copied
INFO: Applying WAL files
INFO: WAL files are applied
INFO: Restore completed successfully
# 步骤4:启动数据库
$ gs_ctl start -D /opengauss/fgdata
waiting for server to start…. done
server started
# 步骤5:验证数据库完整性
$ gsql -d fgedudb -c “SELECT pg_database_datfrozenxid FROM pg_database WHERE datname=’fgedudb’;
”
pg_database_datfrozenxid
————————–
548
(1 row)
# 步骤6:运行数据校验
$ gsql -d fgedudb -c “SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||’.’||tablename)) FROM pg_tables WHERE schemaname=’fgedu’ ORDER BY pg_total_relation_size(schemaname||’.’||tablename) DESC;
”
schemaname | tablename | pg_size_pretty
————+—————–+—————-
fgedu | fgedu_orders | 256 MB
fgedu | fgedu_products | 128 MB
fgedu | fgedu_customers | 64 MB
(3 rows)
4.3 openGauss部分数据恢复案例
4.3.1 使用闪回查询恢复误删除数据
# 步骤1:确认误删除时间
# 误操作执行时间:2026-04-09 11:15:00
# 步骤2:使用闪回查询查看删除前的数据
$ gsql -d fgedudb -c “SELECT * FROM fgedu.fgedu_orders TIMECAPSULE TIMESTAMP ‘2026-04-09 11:14:59’ WHERE order_id BETWEEN 10001 AND 10100;
”
order_id | customer_id | product_id | quantity | order_time | status
———-+————-+————+———-+———————+———-
10001 | 5001 | 101 | 2 | 2026-04-09 10:30:00 | COMPLETED
10002 | 5002 | 102 | 1 | 2026-04-09 10:35:00 | COMPLETED
…
10100 | 5100 | 200 | 3 | 2026-04-09 11:10:00 | PENDING
(100 rows)
# 步骤3:将闪回数据插入临时表
$ gsql -d fgedudb -c “CREATE TABLE fgedu.fgedu_orders_recovery AS SELECT * FROM fgedu.fgedu_orders TIMECAPSULE TIMESTAMP ‘2026-04-09 11:14:59’ WHERE order_id BETWEEN 10001 AND 10100;
”
SELECT 100
# 步骤4:恢复数据到原表
$ gsql -d fgedudb -c “INSERT INTO fgedu.fgedu_orders SELECT * FROM fgedu.fgedu_orders_recovery;
”
INSERT 0 100
# 步骤5:验证恢复结果
$ gsql -d fgedudb -c “SELECT COUNT(*) FROM fgedu.fgedu_orders WHERE order_id BETWEEN 10001 AND 10100;
”
count
——-
100
(1 row)
# 步骤6:清理临时表
$ gsql -d fgedudb -c “DROP TABLE fgedu.fgedu_orders_recovery;
”
DROP TABLE
Part05-风哥经验总结与分享
5.1 openGauss数据恢复最佳实践
数据恢复最佳实践总结:
- 定期演练:每季度至少进行一次恢复演练
- 备份验证:定期验证备份文件的可用性
- 文档记录:详细记录每次恢复操作的步骤和结果
- 分级恢复:根据故障级别选择合适的恢复方式
- 监控告警:建立完善的监控告警机制,及时发现故障
5.2 openGauss恢复操作检查清单
□ 确认故障范围和影响程度
□ 验证备份文件的完整性
□ 评估恢复所需时间和资源
□ 通知相关业务方和运维团队
□ 准备回退方案
# 恢复中检查清单
□ 严格按照恢复步骤执行
□ 记录每个步骤的执行时间和结果
□ 监控恢复过程中的系统资源使用
□ 及时处理恢复过程中的异常情况
# 恢复后检查清单
□ 验证数据库可以正常启动
□ 检查关键业务表的数据完整性
□ 验证应用连接和查询正常
□ 更新故障处理文档
□ 进行故障复盘和总结
5.3 openGauss恢复常见问题处理
恢复过程中常见问题及解决方案:
- 备份文件损坏:尝试使用其他备份,或联系专业数据恢复服务
- WAL日志缺失:检查归档配置,可能需要不完全恢复
- 版本不兼容:确保恢复环境与备份时版本一致
- 空间不足:清理磁盘空间或扩展存储
- 权限问题:检查数据目录权限和用户权限配置
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
