1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG104-PG简单恢复:基于备份文件的库/表恢复

本文档风哥主要介绍PostgreSQL的简单恢复方法,包括基于备份文件的库恢复和表恢复。风哥教程参考PostgreSQL官方文档Backup and Restore内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 恢复的概念

恢复是指将备份文件中的数据和结构还原到数据库中,以恢复数据库的正常运行。恢复是备份的逆过程,是数据库灾难恢复的重要手段。更多视频教程www.fgedu.net.cn

恢复的主要目标:

  • 恢复数据库的正常运行
  • 恢复丢失的数据
  • 恢复数据库的结构和配置
  • 确保数据的一致性和完整性
  • 最小化业务中断时间

1.2 恢复类型

PostgreSQL的恢复类型包括:

# 恢复类型
– 完全恢复:恢复整个数据库到最新状态
– 时间点恢复:恢复数据库到指定的时间点
– 表级恢复:只恢复特定的表
– 部分恢复:只恢复数据库的部分内容
– 逻辑恢复:使用逻辑备份文件进行恢复
– 物理恢复:使用物理备份文件进行恢复

# 恢复类型比较
| 恢复类型 | 适用场景 | 恢复速度 | 恢复粒度 |
|———|———|———|———|
| 完全恢复 | 数据库完全损坏 | 快 | 整个数据库 |
| 时间点恢复 | 误操作后恢复 | 中 | 整个数据库 |
| 表级恢复 | 表数据丢失 | 快 | 单个表 |
| 部分恢复 | 部分数据丢失 | 中 | 部分数据 |
| 逻辑恢复 | 跨版本迁移 | 慢 | 灵活 |
| 物理恢复 | 大型数据库 | 快 | 整个数据库 |

1.3 恢复前提条件

PostgreSQL恢复的前提条件:

from oracle:www.itpux.com

  • 备份文件:需要有有效的备份文件
  • 恢复环境:需要准备好恢复环境,包括数据库实例和存储
  • 恢复工具:需要使用合适的恢复工具
  • 恢复计划:需要制定详细的恢复计划
  • 权限:需要有足够的权限执行恢复操作

1.4 恢复流程

PostgreSQL恢复的基本流程:

# 恢复流程
1. 准备恢复环境:停止数据库服务,清理数据目录
2. 复制备份文件:将备份文件复制到恢复位置
3. 执行恢复操作:使用合适的工具执行恢复操作
4. 验证恢复结果:检查数据库是否正常运行,数据是否完整
5. 清理恢复环境:清理临时文件,恢复配置

# 恢复注意事项
– 恢复前确保备份文件的完整性
– 恢复前停止数据库服务
– 恢复过程中避免中断
– 恢复后验证数据完整性
– 恢复后更新数据库配置

Part02-生产环境规划与建议

2.1 恢复策略规划

恢复策略规划要点:

# 恢复策略规划步骤
1. 分析恢复需求:了解业务对恢复时间和数据完整性的要求
2. 确定恢复类型:根据恢复需求选择合适的恢复类型
3. 选择恢复工具:根据备份类型选择合适的恢复工具
4. 制定恢复计划:制定详细的恢复步骤和时间计划
5. 测试恢复流程:定期测试恢复流程,确保恢复的可靠性
6. 建立恢复文档:记录恢复策略和流程,便于后续参考

# 恢复策略建议
– 完全恢复:用于数据库完全损坏的情况
– 时间点恢复:用于误操作后的恢复
– 表级恢复:用于表数据丢失的情况
– 部分恢复:用于部分数据丢失的情况

# 恢复时间目标(RTO)
– 关键业务:RTO < 1小时 - 重要业务:RTO < 4小时 - 一般业务:RTO < 24小时

2.2 恢复工具选择

PostgreSQL恢复工具选择:

  • 逻辑恢复工具:
    • psql:用于恢复SQL格式的备份文件
    • pg_restore:用于恢复自定义格式、tar格式和目录格式的备份文件
  • 物理恢复工具:
    • cp:用于复制物理备份文件
    • rsync:用于同步物理备份文件
    • pg_basebackup:用于基于物理备份的恢复

2.3 恢复计划制定

恢复计划制定要点:

# 恢复计划制定
– 恢复准备:准备恢复环境,包括数据库实例和存储
– 恢复步骤:详细的恢复步骤和操作指南
– 恢复时间:预计的恢复时间和时间点
– 恢复验证:验证恢复结果的方法和标准
– 恢复回滚:恢复失败时的回滚策略
– 恢复测试:定期测试恢复流程的计划

# 恢复计划文档
– 恢复步骤:详细的恢复步骤和操作指南
– 恢复工具:使用的恢复工具和参数
– 恢复时间:预计的恢复时间和时间点
– 恢复验证:验证恢复结果的方法和标准
– 恢复责任:恢复过程中的责任人
– 恢复测试:定期测试恢复流程的记录

风哥提示:恢复策略是PostgreSQL数据库管理的重要组成部分,需要根据业务需求和数据库环境制定合理的恢复策略。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 数据库恢复

3.1.1 从pg_dump备份恢复

# 1. 从SQL格式备份恢复

# 创建目标数据库
$ sudo -u pgsql psql -U pgsql -c “CREATE DATABASE fgedu_production;”

# 恢复备份
$ sudo -u pgsql psql -U pgsql -d fgedu_production -f /backup/fgedu_production_20260401.sql

# 2. 从自定义格式备份恢复

# 创建目标数据库
$ sudo -u pgsql psql -U pgsql -c “CREATE DATABASE fgedu_production;”

# 恢复备份
$ sudo -u pgsql pg_restore -U pgsql -d fgedu_production /backup/fgedu_production_20260401.backup

# 3. 从tar格式备份恢复

# 创建目标数据库
$ sudo -u pgsql psql -U pgsql -c “CREATE DATABASE fgedu_production;”

# 恢复备份
$ sudo -u pgsql pg_restore -U pgsql -d fgedu_production /backup/fgedu_production_20260401.tar

# 4. 从目录格式备份恢复

# 创建目标数据库
$ sudo -u pgsql psql -U pgsql -c “CREATE DATABASE fgedu_production;”

# 恢复备份
$ sudo -u pgsql pg_restore -U pgsql -d fgedu_production -j 4 /backup/fgedu_production_20260401

3.1.2 从pg_dumpall备份恢复

# 1. 从pg_dumpall备份恢复

# 停止PostgreSQL服务
$ sudo systemctl stop postgresql

# 清理数据目录
$ sudo rm -rf /postgresql/data/*

# 初始化数据库
$ sudo -u pgsql initdb -D /postgresql/data

# 启动PostgreSQL服务
$ sudo systemctl start postgresql

# 恢复备份
$ sudo -u pgsql psql -U pgsql -f /backup/postgresql_all_20260401.sql

# 2. 从压缩的pg_dumpall备份恢复

# 停止PostgreSQL服务
$ sudo systemctl stop postgresql

# 清理数据目录
$ sudo rm -rf /postgresql/data/*

# 初始化数据库
$ sudo -u pgsql initdb -D /postgresql/data

# 启动PostgreSQL服务
$ sudo systemctl start postgresql

# 恢复备份
$ gunzip -c /backup/postgresql_all_20260401.sql.gz | sudo -u pgsql psql -U pgsql

3.1.3 从pg_basebackup备份恢复

# 1. 从pg_basebackup备份恢复

# 停止PostgreSQL服务
$ sudo systemctl stop postgresql

# 确认服务已停止
$ sudo systemctl status postgresql

# 清理数据目录
$ sudo rm -rf /postgresql/data/*

# 复制备份文件到数据目录
$ sudo cp -r /backup/base/20260401/* /postgresql/data/

# 创建recovery.conf文件
$ sudo vi /postgresql/data/recovery.conf

restore_command = ‘cp /postgresql/archive/%f %p’
recovery_target_timeline = ‘latest’

# 启动PostgreSQL服务
$ sudo systemctl start postgresql

# 确认服务已启动
$ sudo systemctl status postgresql

# 验证数据完整性
$ sudo -u pgsql psql -c “SELECT count(*) FROM fgedu_employees;”

# 清理recovery.conf文件
$ sudo rm /postgresql/data/recovery.conf

3.2 表恢复

3.2.1 从pg_dump备份恢复表

# 1. 从SQL格式备份恢复表

# 恢复单个表
$ sudo -u pgsql psql -U pgsql -d fgedu_production -f /backup/fgedu_production_20260401.sql -v ON_ERROR_STOP=1 -c “SELECT ‘Restoring table fgedu_employees'” -c “COPY fgedu_employees FROM stdin;”

# 2. 从自定义格式备份恢复表

# 恢复单个表
$ sudo -u pgsql pg_restore -U pgsql -d fgedu_production -t fgedu_employees /backup/fgedu_production_20260401.backup

# 恢复多个表
$ sudo -u pgsql pg_restore -U pgsql -d fgedu_production -t fgedu_employees -t fgedu_fgfgfgfgsales /backup/fgedu_production_20260401.backup

# 3. 从tar格式备份恢复表

# 恢复单个表
$ sudo -u pgsql pg_restore -U pgsql -d fgedu_production -t fgedu_employees /backup/fgedu_production_20260401.tar

# 4. 从目录格式备份恢复表

# 恢复单个表
$ sudo -u pgsql pg_restore -U pgsql -d fgedu_production -t fgedu_employees /backup/fgedu_production_20260401

3.2.2 从pg_dump表备份恢复

# 1. 备份单个表

$ sudo -u pgsql pg_dump -U pgsql -d fgedu_production -t fgedu_employees -f /backup/fgedu_employees_20260401.sql

# 2. 恢复单个表

# 先删除表(如果存在)
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “DROP TABLE IF EXISTS fgedu_employees;”

# 恢复表
$ sudo -u pgsql psql -U pgsql -d fgedu_production -f /backup/fgedu_employees_20260401.sql

# 3. 备份多个表

$ sudo -u pgsql pg_dump -U pgsql -d fgedu_production -t fgedu_employees -t fgedu_fgfgfgfgsales -f /backup/fgedu_tables_20260401.sql

# 4. 恢复多个表

# 先删除表(如果存在)
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “DROP TABLE IF EXISTS fgedu_employees;”
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “DROP TABLE IF EXISTS fgedu_fgfgfgfgsales;”

# 恢复表
$ sudo -u pgsql psql -U pgsql -d fgedu_production -f /backup/fgedu_tables_20260401.sql

3.3 部分恢复

3.3.1 恢复特定模式

# 1. 备份特定模式

$ sudo -u pgsql pg_dump -U pgsql -d fgedu_production -n public -f /backup/fgedu_public_20260401.sql

# 2. 恢复特定模式

# 恢复模式
$ sudo -u pgsql psql -U pgsql -d fgedu_production -f /backup/fgedu_public_20260401.sql

# 3. 从自定义格式备份恢复特定模式

$ sudo -u pgsql pg_restore -U pgsql -d fgedu_production -n public /backup/fgedu_production_20260401.backup

3.3.2 恢复特定数据

# 1. 备份特定数据

$ sudo -u pgsql pg_dump -U pgsql -d fgedu_production -t fgedu_employees -a -f /backup/fgedu_employees_data_20260401.sql

# 2. 恢复特定数据

# 恢复数据
$ sudo -u pgsql psql -U pgsql -d fgedu_production -f /backup/fgedu_employees_data_20260401.sql

# 3. 从自定义格式备份恢复特定数据

$ sudo -u pgsql pg_restore -U pgsql -d fgedu_production -t fgedu_employees –data-only /backup/fgedu_production_20260401.backup

Part04-生产案例与实战讲解

4.1 数据库恢复案例

4.1.1 案例描述

场景:一个PostgreSQL数据库因硬件故障导致数据丢失,需要使用备份恢复数据库。

4.1.2 实施方案

# 1. 准备恢复环境

# 停止PostgreSQL服务
$ sudo systemctl stop postgresql

# 确认服务已停止
$ sudo systemctl status postgresql

# 清理数据目录
$ sudo rm -rf /postgresql/data/*

# 2. 从pg_basebackup备份恢复

# 复制备份文件到数据目录
$ sudo cp -r /backup/base/20260401/* /postgresql/data/

# 创建recovery.conf文件
$ sudo vi /postgresql/data/recovery.conf

restore_command = ‘cp /postgresql/archive/%f %p’
recovery_target_timeline = ‘latest’

# 启动PostgreSQL服务
$ sudo systemctl start postgresql

# 确认服务已启动
$ sudo systemctl status postgresql

# 3. 验证恢复结果

# 检查数据库是否存在
$ sudo -u pgsql psql -U pgsql -c “\l”

# 检查表是否存在
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “\dt”

# 检查数据是否完整
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “SELECT count(*) FROM fgedu_employees;”

# 4. 清理恢复环境

# 清理recovery.conf文件
$ sudo rm /postgresql/data/recovery.conf

# 检查数据库服务状态
$ sudo systemctl status postgresql

4.2 表恢复案例

4.2.1 案例描述

场景:一个PostgreSQL数据库中的fgedu_employees表因误操作导致数据丢失,需要从备份中恢复该表。

4.2.2 实施方案

# 1. 从pg_dump备份恢复表

# 先删除表(如果存在)
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “DROP TABLE IF EXISTS fgedu_employees;”

# 恢复表
$ sudo -u pgsql pg_restore -U pgsql -d fgedu_production -t fgedu_employees /backup/fgedu_production_20260401.backup

# 2. 验证恢复结果

# 检查表是否存在
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “\dt fgedu_employees”

# 检查数据是否完整
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “SELECT count(*) FROM fgedu_employees;”

# 检查表结构
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “\d fgedu_employees”

4.3 部分恢复案例

4.3.1 案例描述

场景:一个PostgreSQL数据库中的public模式因误操作导致数据丢失,需要从备份中恢复该模式。

4.3.2 实施方案

# 1. 从pg_dump备份恢复模式

# 恢复模式
$ sudo -u pgsql pg_restore -U pgsql -d fgedu_production -n public /backup/fgedu_production_20260401.backup

# 2. 验证恢复结果

# 检查模式是否存在
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “\dn”

# 检查表是否存在
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “\dt public.”

# 检查数据是否完整
$ sudo -u pgsql psql -U pgsql -d fgedu_production -c “SELECT count(*) FROM public.fgedu_employees;”

风哥教程针对风哥教程针对风哥教程针对生产环境建议:在生产环境中,建议定期测试恢复流程,确保备份文件可用于恢复。同时,制定详细的恢复计划,确保在数据丢失或系统故障时能够快速恢复数据库。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 恢复最佳实践

恢复最佳实践:

学习交流加群风哥QQ113257174

  • 制定详细的恢复计划:根据业务需求和数据库环境,制定详细的恢复计划
  • 定期测试恢复流程:定期测试恢复流程,确保备份文件可用于恢复
  • 准备恢复环境:在恢复前准备好恢复环境,包括数据库实例和存储
  • 验证备份文件:在恢复前验证备份文件的完整性,确保备份文件可用于恢复
  • 执行恢复操作:按照恢复计划执行恢复操作,避免中断
  • 验证恢复结果:在恢复后验证数据库是否正常运行,数据是否完整
  • 清理恢复环境:在恢复后清理临时文件,恢复配置
  • 文档记录:记录恢复过程和结果,便于后续参考

5.2 常见问题与解决方案

恢复常见问题及解决方案:

  • 备份文件损坏:解决方案:定期验证备份文件的完整性,使用校验和确保文件完整性
  • 恢复失败:解决方案:检查恢复环境,确保备份文件完整,使用正确的恢复命令
  • 数据不一致:解决方案:确保恢复过程中避免中断,使用事务确保数据一致性
  • 权限问题:解决方案:确保恢复用户有足够的权限,检查文件权限
  • 存储空间不足:解决方案:确保恢复环境有足够的存储空间,清理不必要的文件
  • 网络传输失败:解决方案:确保网络连接稳定,使用断点续传
  • 版本兼容性问题:解决方案:使用SQL格式备份,确保版本兼容性
  • 恢复时间过长:解决方案:使用并行恢复,优化恢复参数,选择合适的恢复工具

5.3 恢复技巧

恢复技巧:

  • 使用并行恢复:使用pg_restore的-j参数进行并行恢复,提高恢复速度
  • 优化恢复参数:调整PostgreSQL的恢复参数,如shared_buffers、work_mem等
  • 选择合适的恢复工具:根据备份类型选择合适的恢复工具
  • 验证备份文件:在恢复前验证备份文件的完整性,确保备份文件可用于恢复
  • 测试恢复流程:定期测试恢复流程,确保恢复的可靠性
  • 使用增量恢复:对于大型数据库,使用增量恢复减少恢复时间
  • 监控恢复过程:在恢复过程中监控系统资源使用情况,确保恢复顺利进行
  • 文档化恢复流程:记录恢复流程和结果,便于后续参考和审计
风哥提示:恢复是PostgreSQL数据库管理的重要组成部分,需要根据业务需求和数据库环境制定合理的恢复策略。通过定期测试恢复流程和验证备份文件的完整性,可以确保在数据丢失或系统故障时能够快速恢复数据库。from PostgreSQL:www.itpux.com

持续改进:恢复策略是一个持续的过程,需要根据业务需求和系统变化不断调整和优化。建议定期审查和调整恢复策略,以保持系统的最佳恢复能力。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

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

微信号:itpux-com

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