1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG101-PG物理备份:pg_basebackup核心用法

本文档风哥主要介绍PostgreSQL的物理备份工具pg_basebackup的使用方法和核心功能。风哥教程参考PostgreSQL官方文档Backup and Restore内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 物理备份的概念

物理备份是指直接复制数据库的物理文件,包括数据文件、控制文件、WAL日志等。物理备份不依赖于SQL语句,而是以二进制形式存储数据,因此恢复速度快,适合大型数据库。更多视频教程www.fgedu.net.cn

物理备份的特点:

  • 直接复制物理文件:备份数据库的实际文件
  • 恢复速度快:直接复制文件,无需执行SQL语句
  • 适合大型数据库:备份和恢复时间短
  • 备份一致性:通过WAL日志确保备份的一致性
  • 存储效率高:直接复制文件,空间利用率高

1.2 pg_basebackup工具介绍

pg_basebackup是PostgreSQL的物理备份工具,用于创建数据库集群的基础备份。它可以在数据库运行状态下执行备份,通过流式复制协议获取数据库文件,确保备份的一致性。

# pg_basebackup的主要特点
– 支持热备份:在数据库运行状态下执行备份
– 支持流式复制:通过流式复制协议获取数据库文件
– 支持压缩备份:可以压缩备份文件,减少存储空间
– 支持并行备份:可以使用多个线程进行备份
– 支持备份格式:支持tar格式和目录格式
– 支持WAL日志包含:可以包含WAL日志,确保备份的一致性
– 支持备份标签:可以为备份添加标签,便于管理

# pg_basebackup的适用场景
– 大型数据库备份:数据量较大的数据库
– 热备份:需要在数据库运行状态下执行备份
– 基础备份:作为增量备份的基础
– 主从复制:用于搭建主从复制架构
– 快速恢复:需要快速恢复的场景

1.3 物理备份的优势

物理备份的优势包括:

  • 恢复速度快:直接复制文件,无需执行SQL语句
  • 适合大型数据库:备份和恢复时间短
  • 备份一致性:通过WAL日志确保备份的一致性
  • 存储效率高:直接复制文件,空间利用率高
  • 支持增量备份:可以基于基础备份进行增量备份
  • 支持主从复制:可以用于搭建主从复制架构

1.4 备份前提条件

使用pg_basebackup执行物理备份的前提条件:

# 备份前提条件
– 启用归档模式:需要启用WAL归档,确保备份的一致性
– 配置复制权限:需要为备份用户配置复制权限
– 足够的磁盘空间:备份目录需要足够的磁盘空间
– 网络连接:如果是远程备份,需要确保网络连接稳定
– PostgreSQL版本:pg_basebackup在PostgreSQL 9.1及以上版本可用

# 配置归档模式
1. 编辑postgresql.conf文件
archive_mode = on
archive_command = ‘cp %p /postgresql/archive/%f’

2. 创建归档目录
mkdir -p /postgresql/archive
chown pgsql: pgsql /postgresql/archive

3. 重新加载配置
SELECT pg_reload_conf();

# 配置复制权限
1. 编辑pg_hba.conf文件
fgedu.net.cn replication pgsql 127.0.0.1/32 md5
fgedu.net.cn replication pgsql ::1/128 md5

2. 重新加载配置
SELECT pg_reload_conf();

Part02-生产环境规划与建议

2.1 物理备份策略

物理备份策略规划要点:

# 物理备份策略规划步骤
1. 分析业务需求:了解业务对数据可用性和恢复时间的要求
2. 确定备份频率:根据数据变更频率确定备份频率
3. 选择备份工具:使用pg_basebackup执行物理备份
4. 规划备份存储:确定备份文件的存储位置和方式
5. 制定恢复计划:制定详细的恢复步骤和测试计划
6. 建立备份监控:监控备份的执行情况和有效性

# 备份频率建议
– 全量备份:每周或每月执行一次
– 增量备份:每天执行一次
– 差异备份:每两天或每三天执行一次

# 备份存储规划
– 本地存储:用于短期备份,如7天内的备份
– 远程存储:用于长期备份,如月度和年度备份
– 云存储:用于灾备备份,确保数据安全性

2.2 备份参数选择

pg_basebackup的常用参数:

# pg_basebackup常用参数
– -D, –pgdata:指定备份目录
– -F, –format:指定备份格式(p=plain, t=tar)
– -X, –xlog-method:指定WAL日志获取方式(f=fetch, s=stream)
– -z, –gzip:启用gzip压缩
– -Z, –compress:指定压缩级别(0-9)
– -P, –progress:显示备份进度
– -v, –verbose:显示详细信息
– -h, –fgedu.net.cn:指定主机名
– -p, –port:指定端口号
– -U, –fgeduname:指定用户名
– -w, –no-password:不提示输入密码
– -W, –password:提示输入密码
– -c, –checkpoint:指定检查点模式(fast, spread)
– -T, –fgedutbs-mfgapping:表空间映射
– -l, –label:指定备份标签

# 常用参数组合
– 基本备份:pg_basebackup -D /backup/base -X stream -P
– 压缩备份:pg_basebackup -D /backup/base -X stream -z -P
– 远程备份:pg_basebackup -h 192.168.1.100 -U pgsql -D /backup/base -X stream -P
– tar格式备份:pg_basebackup -D /backup/base.tar -F t -X stream -P

2.3 备份计划制定

备份计划制定要点:

# 备份计划制定
– 全量备份:每周日凌晨2:00执行
– 增量备份:每天凌晨1:00执行
– 差异备份:每三天凌晨1:30执行
– 备份验证:每周一凌晨3:00执行

# 备份保留策略
– 全量备份:保留4周
– 增量备份:保留7天
– 差异备份:保留14天
– 月度备份:保留12个月
– 年度备份:保留3年

# 备份监控
– 监控备份执行状态:确保备份按时完成
– 监控备份文件大小:确保备份文件完整
– 监控备份存储:确保备份存储有足够空间
– 监控备份验证:确保备份文件可用于恢复

风哥提示:物理备份是PostgreSQL数据库管理的重要组成部分,需要根据业务需求和数据库环境制定合理的备份策略。学习交流加群风哥QQ113257174

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

3.1 pg_basebackup使用方法

3.1.1 基本备份

# 1. 本地备份

# 创建备份目录
$ sudo mkdir -p /backup/base
$ sudo chown pgsql: pgsql /backup/base

# 执行基本备份
$ sudo -u pgsql pg_basebackup -D /backup/base -X stream -P

# 2. 压缩备份

# 创建备份目录
$ sudo mkdir -p /backup/base
$ sudo chown pgsql: pgsql /backup/base

# 执行压缩备份
$ sudo -u pgsql pg_basebackup -D /backup/base -X stream -z -P

# 3. tar格式备份

# 执行tar格式备份
$ sudo -u pgsql pg_basebackup -D /backup/base.tar -F t -X stream -P

# 4. 远程备份

# 执行远程备份
$ pg_basebackup -h 192.168.1.100 -U pgsql -D /backup/base -X stream -P

# 5. 指定备份标签

# 执行带标签的备份
$ sudo -u pgsql pg_basebackup -D /backup/base -X stream -P -l “Weekly Backup”

# 6. 表空间映射

# 执行表空间映射备份
$ sudo -u pgsql pg_basebackup -D /backup/base -X stream -P -T /postgresql/fgedutbs1=/backup/fgedutbs1 -T /postgresql/fgedutbs2=/backup/fgedutbs2

3.1.2 增量备份

# 1. 基础备份

$ sudo -u pgsql pg_basebackup -D /backup/base/full -X stream -P

# 2. 增量备份(使用WAL日志)

# 确保WAL日志已归档
$ sudo -u pgsql psql -c “CHECKPOINT;”

# 执行增量备份(基于WAL日志)
$ sudo -u pgsql pg_basebackup -D /backup/base/incremental -X stream -P -C

# 3. 增量备份(使用rsync)

# 执行基础备份
$ sudo -u pgsql pg_basebackup -D /backup/base/full -X stream -P

# 执行增量备份(使用rsync)
$ rsync -av –delete /backup/base/full/ /backup/base/incremental/
$ sudo -u pgsql pg_basebackup -D /backup/base/incremental -X stream -P –incremental

3.2 备份恢复方法

3.2.1 基本恢复

# 1. 停止PostgreSQL服务
$ sudo systemctl stop postgresql

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

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

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

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

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

# 6. 启动PostgreSQL服务
$ sudo systemctl start postgresql

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

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

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

3.2.2 从tar格式备份恢复

# 1. 停止PostgreSQL服务
$ sudo systemctl stop postgresql

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

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

# 4. 解压tar格式备份
$ sudo tar -xzvf /backup/base.tar -C /postgresql/data/

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

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

# 6. 启动PostgreSQL服务
$ sudo systemctl start postgresql

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

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

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

3.3 备份验证

3.3.1 备份文件验证

# 1. 检查备份文件完整性

# 检查目录格式备份
$ sudo ls -la /backup/base

# 检查tar格式备份
$ sudo tar -tvf /backup/base.tar

# 2. 检查WAL日志

$ sudo ls -la /backup/base/pg_wal/

# 3. 检查备份标签

$ sudo cat /backup/base/backup_label

# 4. 测试恢复

# 创建测试目录
$ sudo mkdir -p /backup/test

# 复制备份文件到测试目录
$ sudo cp -r /backup/base/* /backup/test/

# 检查测试目录
$ sudo ls -la /backup/test

# 清理测试目录
$ sudo rm -rf /backup/test

Part04-生产案例与实战讲解

4.1 pg_basebackup备份案例

4.1.1 案例描述

场景:一个生产环境的PostgreSQL数据库,数据量约500GB,需要每周执行全量物理备份,每天执行增量备份。

4.1.2 实施方案

# 1. 创建全量备份脚本

$ sudo vi /postgresql/scripts/full_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”
BACKUP_DIR=”/backup”
FULL_BACKUP_DIR=”$BACKUP_DIR/full”
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 “$FULL_BACKUP_DIR/$(date +%Y%m%d)”
sudo chown pgsql: pgsql “$FULL_BACKUP_DIR/$(date +%Y%m%d)”

# 执行全量备份
log_message “执行全量备份…”
sudo -u pgsql pg_basebackup -D “$FULL_BACKUP_DIR/$(date +%Y%m%d)” -X stream -z -P >> “$LOG_DIR/backup.log”

if [ $? -ne 0 ]; then
log_message “全量备份执行失败”
# 清理临时目录
sudo rm -rf “$FULL_BACKUP_DIR/$(date +%Y%m%d)”
exit 1
fi

# 验证备份文件
log_message “验证备份文件…”
if [ -d “$FULL_BACKUP_DIR/$(date +%Y%m%d)” ]; then
log_message “全量备份执行成功,备份目录:$FULL_BACKUP_DIR/$(date +%Y%m%d)”
else
log_message “全量备份执行失败,备份目录不存在”
exit 1
fi

# 清理旧备份文件
log_message “清理旧备份文件…”
sudo find “$FULL_BACKUP_DIR” -type d -mtime +30 -delete

log_message “全量备份执行完成”

# 2. 创建增量备份脚本

$ sudo vi /postgresql/scripts/incremental_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”
BACKUP_DIR=”/backup”
FULL_BACKUP_DIR=”$BACKUP_DIR/full”
INCREMENTAL_BACKUP_DIR=”$BACKUP_DIR/incremental”
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 “开始执行增量备份…”

# 查找最新的全量备份
latest_full_backup=$(ls -td “$FULL_BACKUP_DIR”/* | head -n 1)

if [ -z “$latest_full_backup” ]; then
log_message “未找到全量备份,执行全量备份”
/postgresql/scripts/full_backup.sh
latest_full_backup=$(ls -td “$FULL_BACKUP_DIR”/* | head -n 1)
fi

log_message “使用全量备份:$latest_full_backup”

# 创建增量备份目录
log_message “创建增量备份目录…”
sudo mkdir -p “$INCREMENTAL_BACKUP_DIR/$(date +%Y%m%d)”
sudo chown pgsql: pgsql “$INCREMENTAL_BACKUP_DIR/$(date +%Y%m%d)”

# 复制全量备份到增量备份目录
log_message “复制全量备份到增量备份目录…”
sudo rsync -av –delete “$latest_full_backup/” “$INCREMENTAL_BACKUP_DIR/$(date +%Y%m%d)/”

# 执行增量备份
log_message “执行增量备份…”
sudo -u pgsql pg_basebackup -D “$INCREMENTAL_BACKUP_DIR/$(date +%Y%m%d)” -X stream -z -P –incremental >> “$LOG_DIR/backup.log”

if [ $? -ne 0 ]; then
log_message “增量备份执行失败”
# 清理临时目录
sudo rm -rf “$INCREMENTAL_BACKUP_DIR/$(date +%Y%m%d)”
exit 1
fi

# 验证备份文件
log_message “验证备份文件…”
if [ -d “$INCREMENTAL_BACKUP_DIR/$(date +%Y%m%d)” ]; then
log_message “增量备份执行成功,备份目录:$INCREMENTAL_BACKUP_DIR/$(date +%Y%m%d)”
else
log_message “增量备份执行失败,备份目录不存在”
exit 1
fi

# 清理旧备份文件
log_message “清理旧备份文件…”
sudo find “$INCREMENTAL_BACKUP_DIR” -type d -mtime +7 -delete

log_message “增量备份执行完成”

# 3. 设置定时执行

$ sudo crontab -e

# 添加以下内容
0 2 * * 0 /postgresql/scripts/full_backup.sh
0 1 * * * /postgresql/scripts/incremental_backup.sh

# 4. 验证备份脚本执行

$ sudo tail -f /postgresql/logs/backup.log
$ ls -la /backup/full/$(date +%Y%m%d)
$ ls -la /backup/incremental/$(date +%Y%m%d)

4.2 备份恢复案例

4.2.1 案例描述

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

from oracle:www.itpux.com

4.2.2 实施方案

# 1. 准备恢复环境

# 停止PostgreSQL服务
$ sudo systemctl stop postgresql

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

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

# 2. 从全量备份恢复

# 复制备份文件到数据目录
$ sudo cp -r /backup/full/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. 从增量备份恢复

# 复制增量备份文件到数据目录
$ sudo cp -r /backup/incremental/20260402/* /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

4.3 增量备份案例

4.3.1 案例描述

场景:一个PostgreSQL数据库,数据量较大,需要使用增量备份减少备份时间和存储空间。

4.3.2 实施方案

# 1. 配置WAL归档

$ sudo vi /postgresql/data/postgresql.conf

archive_mode = on
archive_command = ‘cp %p /postgresql/archive/%f’

$ sudo mkdir -p /postgresql/archive
$ sudo chown pgsql: pgsql /postgresql/archive
$ sudo -u pgsql psql -c “SELECT pg_reload_conf();”

# 2. 执行基础备份

$ sudo -u pgsql pg_basebackup -D /backup/base/full -X stream -P

# 3. 执行增量备份

# 方法1:使用WAL日志增量备份

$ sudo -u pgsql pg_basebackup -D /backup/base/incremental -X stream -P -C

# 方法2:使用rsync增量备份

$ rsync -av –delete /backup/base/full/ /backup/base/incremental/
$ sudo -u pgsql pg_basebackup -D /backup/base/incremental -X stream -P –incremental

# 4. 验证增量备份

$ sudo ls -la /backup/base/incremental/
$ sudo cat /backup/base/incremental/backup_label

# 5. 恢复增量备份

$ sudo systemctl stop postgresql
$ sudo rm -rf /postgresql/data/*
$ sudo cp -r /backup/base/incremental/* /postgresql/data/
$ sudo vi /postgresql/data/recovery.conf
restore_command = ‘cp /postgresql/archive/%f %p’
recovery_target_timeline = ‘latest’
$ sudo systemctl start postgresql
$ sudo -u pgsql psql -c “SELECT count(*) FROM fgedu_employees;”
$ sudo rm /postgresql/data/recovery.conf

风哥教程针对风哥教程针对风哥教程针对生产环境建议:在生产环境中,建议定期执行物理备份,并验证备份文件的有效性。同时,制定详细的恢复计划,确保在数据丢失或系统故障时能够快速恢复数据库。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 物理备份最佳实践

物理备份最佳实践:

学习交流加群风哥微信: itpux-com

  • 制定合理的备份策略:根据业务需求和数据库环境,制定合理的备份策略
  • 定期执行备份:按照备份计划定期执行备份操作
  • 验证备份文件:定期验证备份文件的有效性,确保备份文件可用于恢复
  • 存储备份文件:将备份文件存储在安全的位置,包括本地存储和远程存储
  • 加密备份文件:对敏感数据的备份文件进行加密,确保数据安全性
  • 测试恢复流程:定期测试恢复流程,确保能够快速恢复数据库
  • 监控备份执行:监控备份的执行情况,及时发现和解决备份失败问题
  • 文档记录:记录备份策略、执行情况和恢复流程,便于后续参考

5.2 常见问题与解决方案

物理备份常见问题及解决方案:

  • 备份失败:解决方案:检查数据库连接、权限和磁盘空间
  • 备份文件损坏:解决方案:定期验证备份文件,使用校验和确保文件完整性
  • 磁盘空间不足:解决方案:监控磁盘空间,清理旧备份文件,使用压缩存储
  • 备份时间过长:解决方案:使用并行备份,调整备份时间,使用增量备份
  • 恢复失败:解决方案:检查恢复环境,确保备份文件完整,使用正确的恢复命令
  • WAL日志丢失:解决方案:确保WAL日志的安全存储,使用归档模式
  • 权限问题:解决方案:确保备份用户有足够的权限,检查文件权限
  • 网络传输失败:解决方案:确保网络连接稳定,使用断点续传

5.3 备份技巧

物理备份技巧:

  • 选择合适的备份格式:根据恢复需求选择合适的备份格式
  • 使用压缩存储:压缩备份文件,减少存储空间
  • 自动化备份:使用脚本和定时任务,自动化备份流程
  • 多副本存储:将备份文件存储在多个位置,提高数据安全性
  • 增量备份:使用增量备份,减少备份时间和存储空间
  • 监控备份状态:使用监控工具,实时监控备份状态
  • 定期清理:定期清理旧备份文件,避免磁盘空间不足
  • 持续改进:根据备份执行情况,持续改进备份策略
风哥提示:物理备份是PostgreSQL数据库管理的重要组成部分,需要根据业务需求和数据库环境制定合理的备份策略。通过定期执行备份操作和验证备份文件的有效性,可以确保在数据丢失或系统故障时能够快速恢复数据库。from PostgreSQL:www.itpux.com

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

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

联系我们

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

微信号:itpux-com

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