PostgreSQL教程FG099-PG备份基础:冷备份与热备份区别与实操
本文档风哥主要介绍PostgreSQL的冷备份与热备份的区别和具体操作。风哥教程参考PostgreSQL官方文档Backup and Restore内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 PostgreSQL备份的概念
PostgreSQL备份是指将数据库的数据和结构复制到一个安全的位置,以便在数据丢失或系统故障时能够恢复数据库。备份是数据库管理的重要组成部分,可以确保数据的安全性和可恢复性。更多视频教程www.fgedu.net.cn
- 确保数据的安全性和完整性
- 预防数据丢失
- 支持灾难恢复
- 满足合规要求
- 提供数据迁移的手段
1.2 冷备份的概念
冷备份(Cold Backup)是指在数据库关闭的状态下进行的备份操作。在冷备份过程中,数据库服务停止运行,确保数据文件处于一致状态,然后复制数据文件到备份位置。
– 数据库必须关闭:备份过程中数据库服务停止运行
– 备份速度快:直接复制文件,无需处理并发事务
– 备份文件完整:包含所有数据文件和配置文件
– 恢复简单:直接复制备份文件到数据目录即可
– 影响业务:备份过程中数据库不可用
# 冷备份的适用场景
– 小型数据库:数据量较小,停机时间可接受
– 维护窗口:有固定的维护窗口进行备份
– 全量备份:适合作为全量备份的一种方式
– 测试环境:测试环境的备份
1.3 热备份的概念
热备份(Hot Backup)是指在数据库运行状态下进行的备份操作。在热备份过程中,数据库服务正常运行,用户可以继续访问数据库,备份过程不会影响业务操作。
– 数据库正常运行:备份过程中数据库服务继续运行
– 不影响业务:用户可以正常访问数据库
– 备份文件一致:通过WAL日志确保数据一致性
– 恢复复杂:需要使用WAL日志进行恢复
– 备份速度相对较慢:需要处理并发事务
# 热备份的适用场景
– 大型数据库:数据量较大,停机时间不可接受
– 生产环境:需要24/7运行的生产环境
– 增量备份:适合作为增量备份的基础
– 业务关键系统:对可用性要求高的系统
1.4 冷备份与热备份的区别
冷备份与热备份的主要区别:
from oracle:www.itpux.com
| 特性 | 冷备份 | 热备份 |
|——|——–|——–|
| 数据库状态 | 关闭 | 运行 |
| 业务影响 | 不可用 | 可用 |
| 备份速度 | 快 | 相对较慢 |
| 备份文件大小 | 完整数据文件 | 完整数据文件 + WAL日志 |
| 恢复复杂度 | 简单 | 相对复杂 |
| 适用场景 | 小型数据库、维护窗口 | 大型数据库、生产环境 |
| 备份工具 | cp、tar等 | pg_basebackup、pg_dump等 |
| 数据一致性 | 自然一致 | 通过WAL日志保证一致性 |
Part02-生产环境规划与建议
2.1 备份策略规划
备份策略规划要点:
1. 分析业务需求:了解业务对数据可用性和恢复时间的要求
2. 确定备份类型:根据业务需求选择冷备份或热备份
3. 制定备份频率:根据数据变更频率确定备份频率
4. 选择备份工具:根据备份类型选择合适的备份工具
5. 规划备份存储:确定备份文件的存储位置和方式
6. 制定恢复计划:制定详细的恢复步骤和测试计划
7. 建立备份监控:监控备份的执行情况和有效性
# 备份类型选择建议
– 冷备份:适合小型数据库、维护窗口、全量备份
– 热备份:适合大型数据库、生产环境、增量备份
– 混合备份:结合冷备份和热备份,提高备份的可靠性
# 备份频率建议
– 全量备份:每周或每月执行一次
– 增量备份:每天执行一次
– 差异备份:每两天或每三天执行一次
2.2 备份工具选择
PostgreSQL备份工具选择:
学习交流加群风哥微信: itpux-com
- 冷备份工具:
- cp:复制文件
- tar:打包文件
- rsync:同步文件
- 热备份工具:
- pg_dump:逻辑备份工具
- pg_dumpall:全库逻辑备份工具
- pg_basebackup:物理备份工具
- Barman:企业级备份管理工具
2.3 备份计划制定
备份计划制定要点:
– 全量备份:每周日凌晨2:00执行
– 增量备份:每天凌晨1:00执行
– 差异备份:每三天凌晨1:30执行
– 备份验证:每周一凌晨3:00执行
# 备份存储规划
– 本地存储:用于短期备份,如7天内的备份
– 远程存储:用于长期备份,如月度和年度备份
– 云存储:用于灾备备份,确保数据安全性
# 备份保留策略
– 全量备份:保留4周
– 增量备份:保留7天
– 差异备份:保留14天
– 月度备份:保留12个月
– 年度备份:保留3年
Part03-生产环境项目实施方案
3.1 冷备份实施方案
3.1.1 冷备份步骤
$ sudo systemctl stop postgresql
# 2. 确认服务已停止
$ sudo systemctl status postgresql
# 3. 备份数据目录
$ sudo tar -czvf /backup/postgresql_cold_backup_$(date +%Y%m%d).tar.gz /postgresql/data
# 4. 备份配置文件
$ sudo tar -czvf /backup/postgresql_config_$(date +%Y%m%d).tar.gz /postgresql/data/postgresql.conf /postgresql/data/pg_hba.conf
# 5. 启动PostgreSQL服务
$ sudo systemctl start postgresql
# 6. 确认服务已启动
$ sudo systemctl status postgresql
# 7. 验证备份文件
$ ls -la /backup/postgresql_cold_backup_$(date +%Y%m%d).tar.gz
$ ls -la /backup/postgresql_config_$(date +%Y%m%d).tar.gz
3.1.2 冷备份恢复步骤
$ sudo systemctl stop postgresql
# 2. 确认服务已停止
$ sudo systemctl status postgresql
# 3. 清理数据目录
$ sudo rm -rf /postgresql/data/*
# 4. 恢复备份文件
$ sudo tar -xzvf /backup/postgresql_cold_backup_$(date +%Y%m%d).tar.gz -C /
# 5. 恢复配置文件(如果需要)
$ sudo tar -xzvf /backup/postgresql_config_$(date +%Y%m%d).tar.gz -C /
# 6. 启动PostgreSQL服务
$ sudo systemctl start postgresql
# 7. 确认服务已启动
$ sudo systemctl status postgresql
# 8. 验证数据完整性
$ sudo -u pgsql psql -c “SELECT count(*) FROM fgedu_employees;”
3.2 热备份实施方案
3.2.1 配置归档模式
$ sudo vi /postgresql/data/postgresql.conf
# 启用归档模式
archive_mode = on
archive_command = ‘cp %p /postgresql/archive/%f’
# 2. 创建归档目录
$ sudo mkdir -p /postgresql/archive
$ sudo chown pgsql: pgsql /postgresql/archive
# 3. 重新加载配置
$ sudo -u pgsql psql -c “SELECT pg_reload_conf();”
# 4. 验证归档模式是否启用
$ sudo -u pgsql psql -c “SHOW archive_mode;”
3.2.2 使用pg_basebackup进行热备份
$ sudo mkdir -p /backup/hot
$ sudo chown pgsql: pgsql /backup/hot
# 2. 执行热备份
$ sudo -u pgsql pg_basebackup -h localfgedu.net.cn -U pgsql -D /backup/hot/$(date +%Y%m%d) -F t -X stream -P
# 3. 验证备份文件
$ ls -la /backup/hot/$(date +%Y%m%d)
# 4. 备份WAL日志
$ sudo cp -r /postgresql/archive /backup/hot/$(date +%Y%m%d)/
# 5. 压缩备份文件
$ sudo tar -czvf /backup/postgresql_hot_backup_$(date +%Y%m%d).tar.gz /backup/hot/$(date +%Y%m%d)
# 6. 清理临时备份目录
$ sudo rm -rf /backup/hot/$(date +%Y%m%d)
3.2.3 热备份恢复步骤
$ sudo systemctl stop postgresql
# 2. 确认服务已停止
$ sudo systemctl status postgresql
# 3. 清理数据目录
$ sudo rm -rf /postgresql/data/*
# 4. 解压备份文件
$ sudo tar -xzvf /backup/postgresql_hot_backup_$(date +%Y%m%d).tar.gz -C /backup/
# 5. 复制备份文件到数据目录
$ sudo cp -r /backup/hot/$(date +%Y%m%d)/* /postgresql/data/
# 6. 创建recovery.conf文件
$ sudo vi /postgresql/data/recovery.conf
restore_command = ‘cp /postgresql/archive/%f %p’
recovery_target_timeline = ‘latest’
# 7. 启动PostgreSQL服务
$ sudo systemctl start postgresql
# 8. 确认服务已启动
$ sudo systemctl status postgresql
# 9. 验证数据完整性
$ sudo -u pgsql psql -c “SELECT count(*) FROM fgedu_employees;”
# 10. 清理recovery.conf文件
$ sudo rm /postgresql/data/recovery.conf
3.3 备份验证
3.3.1 冷备份验证
$ sudo mkdir -p /backup/validate
# 2. 解压备份文件
$ sudo tar -xzvf /backup/postgresql_cold_backup_$(date +%Y%m%d).tar.gz -C /backup/validate
# 3. 检查文件完整性
$ sudo ls -la /backup/validate/postgresql/data
# 4. 清理验证目录
$ sudo rm -rf /backup/validate
3.3.2 热备份验证
$ sudo mkdir -p /backup/validate
# 2. 解压备份文件
$ sudo tar -xzvf /backup/postgresql_hot_backup_$(date +%Y%m%d).tar.gz -C /backup/validate
# 3. 检查文件完整性
$ sudo ls -la /backup/validate/hot/$(date +%Y%m%d)
# 4. 检查WAL日志
$ sudo ls -la /backup/validate/hot/$(date +%Y%m%d)/archive
# 5. 清理验证目录
$ sudo rm -rf /backup/validate
Part04-生产案例与实战讲解
4.1 冷备份案例
4.1.1 案例描述
场景:一个小型PostgreSQL数据库,数据量约50GB,有固定的维护窗口,需要执行冷备份。
4.1.2 实施方案
$ sudo vi /postgresql/scripts/cold_backup.sh
#!/bin/bash
# 冷备份脚本
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# web: http://www.fgedu.net.cn
PG_HOME=”/postgresql”
PG_DATA=”/postgresql/data”
BACKUP_DIR=”/backup”
LOG_DIR=”/postgresql/logs”
log_message() {
local timestamp=$(date +”%Y-%m-%d %H:%M:%S”)
echo “[$timestamp] $1”
echo “[$timestamp] $1” >> “$LOG_DIR/backup.log”
}
log_message “开始执行冷备份…”
# 停止PostgreSQL服务
log_message “停止PostgreSQL服务…”
sudo systemctl stop postgresql
# 确认服务已停止
if [ $? -ne 0 ]; then
log_message “停止PostgreSQL服务失败”
exit 1
fi
log_message “PostgreSQL服务已停止”
# 备份数据目录
log_message “备份数据目录…”
sudo tar -czvf “$BACKUP_DIR/postgresql_cold_backup_$(date +%Y%m%d).tar.gz” “$PG_DATA”
if [ $? -ne 0 ]; then
log_message “备份数据目录失败”
# 启动PostgreSQL服务
sudo systemctl start postgresql
exit 1
fi
# 备份配置文件
log_message “备份配置文件…”
sudo tar -czvf “$BACKUP_DIR/postgresql_config_$(date +%Y%m%d).tar.gz” “$PG_DATA/postgresql.conf” “$PG_DATA/pg_hba.conf”
# 启动PostgreSQL服务
log_message “启动PostgreSQL服务…”
sudo systemctl start postgresql
if [ $? -ne 0 ]; then
log_message “启动PostgreSQL服务失败”
exit 1
fi
log_message “PostgreSQL服务已启动”
# 验证备份文件
log_message “验证备份文件…”
if [ -f “$BACKUP_DIR/postgresql_cold_backup_$(date +%Y%m%d).tar.gz” ]; then
log_message “冷备份执行成功,备份文件:$BACKUP_DIR/postgresql_cold_backup_$(date +%Y%m%d).tar.gz”
else
log_message “冷备份执行失败,备份文件不存在”
exit 1
fi
# 清理旧备份文件
log_message “清理旧备份文件…”
sudo find “$BACKUP_DIR” -name “postgresql_cold_backup_*.tar.gz” -mtime +30 -delete
sudo find “$BACKUP_DIR” -name “postgresql_config_*.tar.gz” -mtime +30 -delete
log_message “冷备份执行完成”
# 2. 设置定时执行
$ sudo crontab -e
# 添加以下内容
0 2 * * 0 /postgresql/scripts/cold_backup.sh
# 3. 验证备份脚本执行
$ sudo tail -f /postgresql/logs/backup.log
$ ls -la /backup/postgresql_cold_backup_$(date +%Y%m%d).tar.gz
4.2 热备份案例
4.2.1 案例描述
场景:一个生产环境的PostgreSQL数据库,数据量约200GB,需要24/7运行,不能停机,需要执行热备份。
4.2.2 实施方案
$ sudo vi /postgresql/scripts/hot_backup.sh
#!/bin/bash
# 热备份脚本
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# web: http://www.fgedu.net.cn
PG_HOME=”/postgresql”
PG_DATA=”/postgresql/data”
BACKUP_DIR=”/backup”
HOT_BACKUP_DIR=”/backup/hot”
ARCHIVE_DIR=”/postgresql/archive”
LOG_DIR=”/postgresql/logs”
log_message() {
local timestamp=$(date +”%Y-%m-%d %H:%M:%S”)
echo “[$timestamp] $1”
echo “[$timestamp] $1” >> “$LOG_DIR/backup.log”
}
log_message “开始执行热备份…”
# 创建备份目录
log_message “创建备份目录…”
sudo mkdir -p “$HOT_BACKUP_DIR/$(date +%Y%m%d)”
sudo chown pgsql: pgsql “$HOT_BACKUP_DIR/$(date +%Y%m%d)”
# 执行热备份
log_message “执行热备份…”
sudo -u pgsql pg_basebackup -h localfgedu.net.cn -U pgsql -D “$HOT_BACKUP_DIR/$(date +%Y%m%d)” -F t -X stream -P >> “$LOG_DIR/backup.log”
if [ $? -ne 0 ]; then
log_message “热备份执行失败”
# 清理临时目录
sudo rm -rf “$HOT_BACKUP_DIR/$(date +%Y%m%d)”
exit 1
fi
# 备份WAL日志
log_message “备份WAL日志…”
sudo cp -r “$ARCHIVE_DIR” “$HOT_BACKUP_DIR/$(date +%Y%m%d)/”
# 压缩备份文件
log_message “压缩备份文件…”
sudo tar -czvf “$BACKUP_DIR/postgresql_hot_backup_$(date +%Y%m%d).tar.gz” “$HOT_BACKUP_DIR/$(date +%Y%m%d)”
if [ $? -ne 0 ]; then
log_message “压缩备份文件失败”
# 清理临时目录
sudo rm -rf “$HOT_BACKUP_DIR/$(date +%Y%m%d)”
exit 1
fi
# 清理临时备份目录
log_message “清理临时备份目录…”
sudo rm -rf “$HOT_BACKUP_DIR/$(date +%Y%m%d)”
# 验证备份文件
log_message “验证备份文件…”
if [ -f “$BACKUP_DIR/postgresql_hot_backup_$(date +%Y%m%d).tar.gz” ]; then
log_message “热备份执行成功,备份文件:$BACKUP_DIR/postgresql_hot_backup_$(date +%Y%m%d).tar.gz”
else
log_message “热备份执行失败,备份文件不存在”
exit 1
fi
# 清理旧备份文件
log_message “清理旧备份文件…”
sudo find “$BACKUP_DIR” -name “postgresql_hot_backup_*.tar.gz” -mtime +14 -delete
log_message “热备份执行完成”
# 2. 设置定时执行
$ sudo crontab -e
# 添加以下内容
0 1 * * * /postgresql/scripts/hot_backup.sh
# 3. 验证备份脚本执行
$ sudo tail -f /postgresql/logs/backup.log
$ ls -la /backup/postgresql_hot_backup_$(date +%Y%m%d).tar.gz
4.3 备份恢复案例
4.3.1 案例描述
场景:一个PostgreSQL数据库因磁盘故障导致数据丢失,需要使用备份文件恢复数据库。
4.3.2 实施方案
# 停止PostgreSQL服务
$ sudo systemctl stop postgresql
# 确认服务已停止
$ sudo systemctl status postgresql
# 清理数据目录
$ sudo rm -rf /postgresql/data/*
# 解压备份文件
$ sudo tar -xzvf /backup/postgresql_cold_backup_20260401.tar.gz -C /
# 启动PostgreSQL服务
$ sudo systemctl start postgresql
# 确认服务已启动
$ sudo systemctl status postgresql
# 验证数据完整性
$ sudo -u pgsql psql -c “SELECT count(*) FROM fgedu_employees;”
# 2. 热备份恢复
# 停止PostgreSQL服务
$ sudo systemctl stop postgresql
# 确认服务已停止
$ sudo systemctl status postgresql
# 清理数据目录
$ sudo rm -rf /postgresql/data/*
# 解压备份文件
$ sudo tar -xzvf /backup/postgresql_hot_backup_20260401.tar.gz -C /backup/
# 复制备份文件到数据目录
$ sudo cp -r /backup/hot/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
Part05-风哥经验总结与分享
5.1 PostgreSQL备份最佳实践
PostgreSQL备份最佳实践:
- 制定合理的备份策略:根据业务需求和数据库环境,制定合理的备份策略
- 定期执行备份:按照备份计划定期执行备份操作
- 验证备份文件:定期验证备份文件的有效性,确保备份文件可用于恢复
- 存储备份文件:将备份文件存储在安全的位置,包括本地存储和远程存储
- 加密备份文件:对敏感数据的备份文件进行加密,确保数据安全性
- 测试恢复流程:定期测试恢复流程,确保能够快速恢复数据库
- 监控备份执行:监控备份的执行情况,及时发现和解决备份失败问题
- 文档记录:记录备份策略、执行情况和恢复流程,便于后续参考
5.2 备份常见问题
备份常见问题及解决方案:
- 备份失败:解决方案:检查备份脚本权限、磁盘空间和数据库状态
- 备份文件损坏:解决方案:定期验证备份文件,使用校验和确保文件完整性
- 磁盘空间不足:解决方案:监控磁盘空间,清理旧备份文件,使用压缩存储
- 备份时间过长:解决方案:优化备份策略,使用增量备份,调整备份时间
- 恢复失败:解决方案:检查恢复流程,确保备份文件完整,使用正确的恢复命令
- WAL日志丢失:解决方案:确保WAL日志的安全存储,使用归档模式
- 备份权限问题:解决方案:确保备份用户有足够的权限,检查文件权限
- 网络传输失败:解决方案:确保网络连接稳定,使用断点续传
5.3 备份技巧
备份技巧:
- 选择合适的备份类型:根据数据库大小和业务需求,选择冷备份或热备份
- 使用压缩存储:压缩备份文件,减少存储空间
- 自动化备份:使用脚本和定时任务,自动化备份流程
- 多副本存储:将备份文件存储在多个位置,提高数据安全性
- 增量备份:使用增量备份,减少备份时间和存储空间
- 监控备份状态:使用监控工具,实时监控备份状态
- 定期清理:定期清理旧备份文件,避免磁盘空间不足
- 持续改进:根据备份执行情况,持续改进备份策略
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
