利用 pgBackRest 有效率的备份 PostgresQL

发布于:08/26/2025 18:28:59 · Programming · #devlog · #postgresql

我是用的 pgsql 版本是 17,所以路径里有 17,你可以自行替换版本和路径。

使用的命令

以下是在设置 pgBackRest 和 crontab 过程中需要运行的命令,共 12 条(包括安装、配置、初始化、备份和 crontab 设置):

  1. 更新系统并安装依赖

    sudo apt update
    sudo apt install -y perl libbz2-dev liblz4-dev libpq-dev libssl-dev libxml2-dev zlib1g-dev
    
  2. 添加 PostgreSQL 官方仓库

    sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
    wget --quiet -O - https://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add -
    sudo apt update
    
  3. 安装 pgBackRest

    sudo apt install -y pgbackrest
    
  4. 验证 pgBackRest 安装

    pgbackrest version
    
  5. 编辑 PostgreSQL 配置文件(假设 PostgreSQL 版本 17):

    sudo nano /etc/postgresql/17/main/postgresql.conf
    

    (在文件中添加或修改 archive_modearchive_command,见下文配置文件部分)

  6. 重启 PostgreSQL

    sudo systemctl restart postgresql
    
  7. 创建备份存储目录并设置权限

    sudo mkdir -p /var/lib/pgbackrest
    sudo chown postgres:postgres /var/lib/pgbackrest
    sudo chmod 750 /var/lib/pgbackrest
    
  8. 创建 pgBackRest 配置文件

    sudo mkdir -p /etc/pgbackrest
    sudo nano /etc/pgbackrest.conf
    

    (配置文件内容见下文)

  9. 创建 Stanza

    sudo -u postgres pgbackrest --stanza=main stanza-create
    
  10. 检查配置

    sudo -u postgres pgbackrest --stanza=main check
    
  11. 执行第一次完整备份

    sudo -u postgres pgbackrest --stanza=main --type=full backup
    
  12. 配置 crontab

    sudo -u postgres crontab -e
    

    (在 crontab 中添加定时任务,见下文配置文件部分)


配置文件内容

以下是你需要创建或修改的两个配置文件的内容:

  1. PostgreSQL 配置文件/etc/postgresql/17/main/postgresql.conf): 添加或修改以下配置:

    archive_mode = on
    archive_command = 'pgbackrest --stanza=main archive-push %p'
    
  2. pgBackRest 配置文件/etc/pgbackrest.conf):

    [global]
    repo1-path=/var/lib/pgbackrest
    log-level-console=info
    log-level-file=debug
    start-fast=y
    repo1-retention-full=2
    
    [main]
    pg1-path=/var/lib/postgresql/17/main
    
  3. crontab 文件(通过 sudo -u postgres crontab -e 编辑):

    # 每天晚上 23:00 进行增量备份
    0 23 * * * /usr/bin/pgbackrest --stanza=main --type=incr backup
    
    # 每周一晚上 23:00 进行完整备份
    0 23 * * 1 /usr/bin/pgbackrest --stanza=main --type=full backup
    

安装与配置小结

  • 命令总数:12 条(包括安装、配置、初始化、备份和 crontab 设置)。
  • 配置文件:3 个(PostgreSQL 配置文件、pgBackRest 配置文件、crontab 文件)。
  • 关键点
    • PostgreSQL 版本 17,数据目录为 /var/lib/postgresql/17/main
    • 备份存储在本地路径 /var/lib/pgbackrest
    • 每天 23:00 进行增量备份,每周一 23:00 进行完整备份。
    • 确保 postgres 用户有权限访问备份目录和执行 pgBackRest 命令。
    • 备份日志存储在 /var/log/pgbackrest,可用于排查问题。

如果日后需要查看备份状态,可以运行:

sudo -u postgres pgbackrest info

恢复备份的总结

前提条件

  • 备份已存在:确保你已通过 pgBackRest 创建了备份(完整备份或增量备份),可以通过以下命令确认:
    sudo -u postgres pgbackrest info
    
  • PostgreSQL 数据目录:假设为 /var/lib/postgresql/17/main(与你的 pgBackRest 配置一致)。
  • pgBackRest 配置文件:确保 /etc/pgbackrest.conf 存在且配置正确(见之前的总结)。
  • 权限:以 postgres 用户身份运行恢复命令,确保对备份目录 /var/lib/pgbackrest 有读写权限。

恢复步骤

以下是恢复备份所需的命令,共 4 条(包括停止服务、清理目录、恢复备份和启动服务):

  1. 停止 PostgreSQL 服务: 在恢复之前,必须停止 PostgreSQL 服务以避免数据冲突:

    sudo systemctl stop postgresql
    
  2. (可选)清理数据目录: 如果要恢复到空的数据目录(例如模拟灾难恢复),需要清空 PostgreSQL 数据目录:

    sudo -u postgres rm -rf /var/lib/postgresql/17/main/*
    

    注意:此操作会删除现有数据,请确保备份可用且无需保留当前数据目录内容。

  3. 执行恢复: 使用 pgBackRest 恢复最新的备份:

    sudo -u postgres pgbackrest --stanza=main --delta restore
    
    • --stanza=main:指定配置中的 stanza 名称。
    • --delta:仅恢复更改的文件,加快恢复速度(如果数据目录不为空,pgBackRest 会比较文件差异)。
    • 如果想恢复到特定时间点(PITR,Point-in-Time Recovery),使用以下命令(替换时间戳为实际值):
      sudo -u postgres pgbackrest --stanza=main --type=time --target="2025-08-27 01:00:00" --delta restore
      
  4. 启动 PostgreSQL 服务: 恢复完成后,启动 PostgreSQL 服务:

    sudo systemctl start postgresql
    

验证恢复

  • 检查数据库:连接到 PostgreSQL,确认数据是否恢复:
    sudo -u postgres psql -c "SELECT * FROM your_table;"
    
  • 查看备份信息:确认恢复的备份版本:
    sudo -u postgres pgbackrest info
    

配置文件依赖

恢复过程依赖以下配置文件(无需修改,但需确保存在且正确):

  1. pgBackRest 配置文件/etc/pgbackrest.conf):

    [global]
    repo1-path=/var/lib/pgbackrest
    log-level-console=info
    log-level-file=debug
    start-fast=y
    repo1-retention-full=2
    
    [main]
    pg1-path=/var/lib/postgresql/17/main
    
    • 确保 repo1-path 指向正确的备份存储路径。
    • 确保 pg1-path 与 PostgreSQL 数据目录一致(/var/lib/postgresql/17/main)。
  2. PostgreSQL 配置文件/etc/postgresql/17/main/postgresql.conf):

    • 确保以下配置存在(已在设置备份时配置):
      archive_mode = on
      archive_command = 'pgbackrest --stanza=main archive-push %p'
      
    • 恢复后无需修改此文件,但确保其与备份时的配置一致。

注意事项

  • 备份可用性:在恢复前,运行 pgbackrest info 确认备份存在且完整。
  • 数据目录权限:恢复后,确保数据目录 /var/lib/postgresql/17/main 的所有者为 postgres
    sudo chown -R postgres:postgres /var/lib/postgresql/17/main
    sudo chmod -R 700 /var/lib/postgresql/17/main
    
  • PITR(时间点恢复):如果需要恢复到特定时间点,精确的时间戳需要参考备份日志或 pgbackrest info 的输出。
  • 日志检查:恢复日志存储在 /var/log/pgbackrest,如果恢复失败,可检查日志排查问题。
  • 测试恢复:建议定期在测试环境中模拟恢复,确保备份可用。
  • 远程存储:如果备份存储在 S3 等远程存储,确保 /etc/pgbackrest.conf 中的 S3 配置正确,且网络连接正常。

恢复备份的小结

  • 命令总数:4 条(停止服务、清理目录、恢复备份、启动服务)。
  • 配置文件依赖:2 个(pgBackRest 配置文件、PostgreSQL 配置文件)。
  • 关键点
    • 恢复到 PostgreSQL 17 的数据目录 /var/lib/postgresql/17/main
    • 备份存储在 /var/lib/pgbackrest
    • 支持最新备份恢复或时间点恢复(PITR)。
    • 确保以 postgres 用户身份运行命令。
  • 验证:恢复后通过 psql 检查数据完整性。