1. 首页 > 国产数据库教程 > openGauss教程 > 正文

opengauss教程FG052-openGauss单表与全库恢复生产实战

本文档详细介绍openGauss数据库单表与全库恢复的生产实战方法,包括单表恢复、全库恢复、模式级恢复等操作,风哥教程参考openGauss官方文档备份恢复指南、数据库管理指南等内容,适合DBA人员在数据恢复场景中使用。

Part01-基础概念与理论知识

1.1 openGauss数据恢复基本概念

openGauss恢复方式分类:

  • 物理恢复:基于物理备份进行恢复,速度快,适合全库恢复
  • 逻辑恢复:基于逻辑备份(SQL导出)进行恢复,灵活度高
  • 单表恢复:只恢复特定表的数据,不影响其他对象
  • 全库恢复:恢复整个数据库到某一时间点

1.2 openGauss恢复类型与适用场景

不同恢复类型适用于不同的业务场景:

  • 完全恢复:将数据库恢复到最新状态,适用于介质故障
  • 不完全恢复:将数据库恢复到某一时间点,适用于逻辑错误
  • 表级恢复:只恢复特定表,适用于误删除表或表数据损坏
  • 增量恢复:基于增量备份进行恢复,节省时间和空间

1.3 openGauss恢复原理与流程

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进行单表恢复

# 场景:恢复误删除的fgedu_orders表

# 步骤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命令恢复单表数据

# 场景:从CSV文件恢复表数据风哥提示:

# 步骤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进行全库恢复

# 场景:数据库文件损坏,需要全库恢复学习交流加群风哥微信: itpux-com

# 步骤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)

# 场景:恢复到2026-04-09 10:30:00之前的状态

# 步骤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 恢复整个模式

# 场景:恢复fgedu_schema模式下的所有对象

# 步骤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 恢复过程

# 故障时间:2026-04-09 14:25:00
# 误操作: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 使用闪回查询恢复误删除数据

# 场景:误删除了fgedu_orders表中部分数据

# 步骤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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息