利用 pgBackRest 有效率的备份 PostgresQL
我是用的 pgsql 版本是 17,所以路径里有 17,你可以自行替换版本和路径。
使用的命令
以下是在设置 pgBackRest 和 crontab 过程中需要运行的命令,共 12 条(包括安装、配置、初始化、备份和 crontab 设置):
更新系统并安装依赖:
sudo apt update sudo apt install -y perl libbz2-dev liblz4-dev libpq-dev libssl-dev libxml2-dev zlib1g-dev添加 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安装 pgBackRest:
sudo apt install -y pgbackrest验证 pgBackRest 安装:
pgbackrest version编辑 PostgreSQL 配置文件(假设 PostgreSQL 版本 17):
sudo nano /etc/postgresql/17/main/postgresql.conf(在文件中添加或修改
archive_mode和archive_command,见下文配置文件部分)重启 PostgreSQL:
sudo systemctl restart postgresql创建备份存储目录并设置权限:
sudo mkdir -p /var/lib/pgbackrest sudo chown postgres:postgres /var/lib/pgbackrest sudo chmod 750 /var/lib/pgbackrest创建 pgBackRest 配置文件:
sudo mkdir -p /etc/pgbackrest sudo nano /etc/pgbackrest.conf(配置文件内容见下文)
创建 Stanza:
sudo -u postgres pgbackrest --stanza=main stanza-create检查配置:
sudo -u postgres pgbackrest --stanza=main check执行第一次完整备份:
sudo -u postgres pgbackrest --stanza=main --type=full backup配置 crontab:
sudo -u postgres crontab -e(在 crontab 中添加定时任务,见下文配置文件部分)
配置文件内容
以下是你需要创建或修改的两个配置文件的内容:
PostgreSQL 配置文件(
/etc/postgresql/17/main/postgresql.conf): 添加或修改以下配置:archive_mode = on archive_command = 'pgbackrest --stanza=main archive-push %p'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/maincrontab 文件(通过
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,可用于排查问题。
- PostgreSQL 版本 17,数据目录为
如果日后需要查看备份状态,可以运行:
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 条(包括停止服务、清理目录、恢复备份和启动服务):
停止 PostgreSQL 服务: 在恢复之前,必须停止 PostgreSQL 服务以避免数据冲突:
sudo systemctl stop postgresql(可选)清理数据目录: 如果要恢复到空的数据目录(例如模拟灾难恢复),需要清空 PostgreSQL 数据目录:
sudo -u postgres rm -rf /var/lib/postgresql/17/main/*注意:此操作会删除现有数据,请确保备份可用且无需保留当前数据目录内容。
执行恢复: 使用 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
启动 PostgreSQL 服务: 恢复完成后,启动 PostgreSQL 服务:
sudo systemctl start postgresql
验证恢复
- 检查数据库:连接到 PostgreSQL,确认数据是否恢复:
sudo -u postgres psql -c "SELECT * FROM your_table;" - 查看备份信息:确认恢复的备份版本:
sudo -u postgres pgbackrest info
配置文件依赖
恢复过程依赖以下配置文件(无需修改,但需确保存在且正确):
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)。
- 确保
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用户身份运行命令。
- 恢复到 PostgreSQL 17 的数据目录
- 验证:恢复后通过
psql检查数据完整性。