WAL-G PostgreSQL 物理备份

FreeGuideOnline 最新 2026-07-13

bash

下载最新版本(替换 VERSION 为实际版本号,如 v2.0.1)

wget https://github.com/wal-g/wal-g/releases/download/v2.0.1/wal-g-pg-ubuntu-20.04-amd64.tar.gz tar -xzf wal-g-pg-ubuntu-20.04-amd64.tar.gz sudo mv wal-g-pg-ubuntu-20.04-amd64 /usr/local/bin/wal-g sudo chmod +x /usr/local/bin/wal-g


验证安装:
```bash
wal-g --version

第二步:配置对象存储(以 S3/MinIO 为例)

WAL-G 通过环境变量或配置文件获取存储凭证。这里使用 MinIO 搭建本地 S3 服务。

启动 MinIO(Docker 方式)

docker run -d --name minio \
  -p 9000:9000 -p 9001:9001 \
  -e "MINIO_ROOT_USER=minioadmin" \
  -e "MINIO_ROOT_PASSWORD=minioadmin" \
  quay.io/minio/minio server /data --console-address ":9001"

创建 Bucket:

  • 访问 http://your_ip:9001,登录后创建 bucket wal-g-backup

配置 WAL-G 环境变量

为 PostgreSQL 用户(通常是 postgres)设置环境变量。编辑 /var/lib/postgresql/.profile/etc/wal-g.d/env(需手动创建目录和文件)。

创建配置目录并编辑:

sudo mkdir -p /etc/wal-g.d
sudo vi /etc/wal-g.d/env

写入以下内容:

# S3 兼容配置
export WALG_S3_PREFIX=s3://wal-g-backup
export AWS_ENDPOINT=http://127.0.0.1:9000
export AWS_ACCESS_KEY_ID=minioadmin
export AWS_SECRET_ACCESS_KEY=minioadmin
export AWS_S3_FORCE_PATH_STYLE=true
export AWS_REGION=us-east-1

# WAL-G 行为配置
export WALG_COMPRESSION_METHOD=brotli
export WALG_DELTA_MAX_STEPS=5
export WALG_UPLOAD_CONCURRENCY=4
export PGUSER=postgres
export PGPORT=5432
export PGHOST=/var/run/postgresql

使环境变量对 postgres 用户生效:

sudo -u postgres bash -c 'source /etc/wal-g.d/env'

第三步:准备 PostgreSQL 基础配置

物理备份要求 PostgreSQL 处于归档模式,WAL 文件会被持续归档到同一存储位置。

编辑 postgresql.conf(通常在 /etc/postgresql/14/main/):

wal_level = replica                    # 或 logical
archive_mode = on
archive_command = 'wal-g wal-push %p >> /var/log/postgresql/wal-g-push.log 2>&1'
archive_timeout = 60                   # 60 秒强制切换 WAL
max_wal_senders = 5                    # 若有流复制需求

重启 PostgreSQL:

sudo systemctl restart postgresql

验证归档:

sudo tail -f /var/log/postgresql/wal-g-push.log
# 同时强制切换 WAL 测试
sudo -u postgres psql -c "SELECT pg_switch_wal();"

日志中应出现 successfully uploaded 字样。


第四步:执行全量备份(Base Backup)

使用 postgres 用户执行备份命令。WAL-G 会连接到本地数据库并创建基础备份。

sudo -u postgres /usr/local/bin/wal-g backup-push /var/lib/postgresql/14/main

参数说明:

  • backup-push:触发全量备份
  • 最后的路径是 PostgreSQL 数据目录

备份完成后,可通过以下命令查看存储中的备份列表:

sudo -u postgres wal-g backup-list

输出示例:

name    last_modified        wal_status    time
base_0000000100000000000000F2  2023-10-01T12:00:00Z  OK   2023-10-01T12:00:00Z

第五步:理解增量备份(Delta Backup)

WAL-G 支持基于 LSN 的增量备份,仅上传自上次全量或增量备份以来发生变更的数据文件块。这极大减少了备份大小和上传时间。

创建增量备份:

sudo -u postgres wal-g backup-push --delta-from-name base_0000000100000000000000F2 /var/lib/postgresql/14/main

也可以使用 --delta-from-user-data 从特定备份标记增量,但更常见的方式是让 WAL-G 自动选择最后一次备份作为基准:

sudo -u postgres wal-g backup-push --delta-from-last /var/lib/postgresql/14/main

增量备份也会出现在 backup-list 中,其 wal_status 可能为 DELTA


第六步:恢复数据库到特定时间点

场景:模拟数据丢失并恢复

  1. 模拟灾难:假设误删了关键表,并记录了误操作时间(如 2023-10-02 14:35:00)。

  2. 停止 PostgreSQL 并清空数据目录(务必先做练习,不要在生产中直接操作):

    sudo systemctl stop postgresql
    sudo rm -rf /var/lib/postgresql/14/main/*
    
  3. 执行恢复命令: WAL-G 的 backup-fetch 命令能够拉取全量备份,并自动将数据目录准备好。若需要 PITR,则配合 recovery.conf 配置文件或环境变量。

    最简单的恢复到最新状态:

    sudo -u postgres wal-g backup-fetch /var/lib/postgresql/14/main LATEST
    

    若要恢复到指定时间点,先使用 LATEST 拉取备份,然后在数据目录下创建恢复配置:

    sudo -u postgres wal-g backup-fetch /var/lib/postgresql/14/main LATEST
    cd /var/lib/postgresql/14/main
    sudo -u postgres touch recovery.signal
    sudo -u postgres vi postgresql.auto.conf
    

    添加以下内容到 postgresql.auto.conf(或独立的 recovery.conf):

    restore_command = 'wal-g wal-fetch %f %p'
    recovery_target_time = '2023-10-02 14:34:00'   # 恢复到误操作前1分钟
    recovery_target_action = 'promote'
    
  4. 启动数据库并观察恢复过程

    sudo systemctl start postgresql
    sudo tail -f /var/log/postgresql/postgresql-14-main.log
    

    当日志显示 database system is ready to accept connections 且出现 recovery stopping before commit of transaction ... 等信息时,表明恢复完成,数据库会自动提升为读写模式。

  5. 验证数据:连接数据库检查被删除的表是否已恢复。


第七步:自动化备份计划

使用 cron 定时执行全量和增量备份。以 postgres 用户身份添加计划任务:

sudo crontab -u postgres -e

添加以下行(根据你的环境调整路径):

# 每天凌晨 2 点全量备份
0 2 * * * /usr/local/bin/wal-g backup-push /var/lib/postgresql/14/main

# 每 6 小时增量备份
0 */6 * * * /usr/local/bin/wal-g backup-push --delta-from-last /var/lib/postgresql/14/main

# 清理 7 天前的备份(可选)
0 3 * * * /usr/local/bin/wal-g delete retain FULL 7 --confirm