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 恢复计划制定
恢复计划制定要点:
– 恢复准备:准备恢复环境,包括数据库实例和存储
– 恢复步骤:详细的恢复步骤和操作指南
– 恢复时间:预计的恢复时间和时间点
– 恢复验证:验证恢复结果的方法和标准
– 恢复回滚:恢复失败时的回滚策略
– 恢复测试:定期测试恢复流程的计划
# 恢复计划文档
– 恢复步骤:详细的恢复步骤和操作指南
– 恢复工具:使用的恢复工具和参数
– 恢复时间:预计的恢复时间和时间点
– 恢复验证:验证恢复结果的方法和标准
– 恢复责任:恢复过程中的责任人
– 恢复测试:定期测试恢复流程的记录
Part03-生产环境项目实施方案
3.1 数据库恢复
3.1.1 从pg_dump备份恢复
# 创建目标数据库
$ 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备份恢复
# 停止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备份恢复
# 停止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备份恢复表
# 恢复单个表
$ 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表备份恢复
$ 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 恢复特定模式
$ 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 恢复特定数据
$ 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 实施方案
# 停止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 实施方案
# 先删除表(如果存在)
$ 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 实施方案
# 恢复模式
$ 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;”
Part05-风哥经验总结与分享
5.1 恢复最佳实践
恢复最佳实践:
学习交流加群风哥QQ113257174
- 制定详细的恢复计划:根据业务需求和数据库环境,制定详细的恢复计划
- 定期测试恢复流程:定期测试恢复流程,确保备份文件可用于恢复
- 准备恢复环境:在恢复前准备好恢复环境,包括数据库实例和存储
- 验证备份文件:在恢复前验证备份文件的完整性,确保备份文件可用于恢复
- 执行恢复操作:按照恢复计划执行恢复操作,避免中断
- 验证恢复结果:在恢复后验证数据库是否正常运行,数据是否完整
- 清理恢复环境:在恢复后清理临时文件,恢复配置
- 文档记录:记录恢复过程和结果,便于后续参考
5.2 常见问题与解决方案
恢复常见问题及解决方案:
- 备份文件损坏:解决方案:定期验证备份文件的完整性,使用校验和确保文件完整性
- 恢复失败:解决方案:检查恢复环境,确保备份文件完整,使用正确的恢复命令
- 数据不一致:解决方案:确保恢复过程中避免中断,使用事务确保数据一致性
- 权限问题:解决方案:确保恢复用户有足够的权限,检查文件权限
- 存储空间不足:解决方案:确保恢复环境有足够的存储空间,清理不必要的文件
- 网络传输失败:解决方案:确保网络连接稳定,使用断点续传
- 版本兼容性问题:解决方案:使用SQL格式备份,确保版本兼容性
- 恢复时间过长:解决方案:使用并行恢复,优化恢复参数,选择合适的恢复工具
5.3 恢复技巧
恢复技巧:
- 使用并行恢复:使用pg_restore的-j参数进行并行恢复,提高恢复速度
- 优化恢复参数:调整PostgreSQL的恢复参数,如shared_buffers、work_mem等
- 选择合适的恢复工具:根据备份类型选择合适的恢复工具
- 验证备份文件:在恢复前验证备份文件的完整性,确保备份文件可用于恢复
- 测试恢复流程:定期测试恢复流程,确保恢复的可靠性
- 使用增量恢复:对于大型数据库,使用增量恢复减少恢复时间
- 监控恢复过程:在恢复过程中监控系统资源使用情况,确保恢复顺利进行
- 文档化恢复流程:记录恢复流程和结果,便于后续参考和审计
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
