WAL-G PostgreSQL 物理备份
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,登录后创建 bucketwal-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。
第六步:恢复数据库到特定时间点
场景:模拟数据丢失并恢复
-
模拟灾难:假设误删了关键表,并记录了误操作时间(如
2023-10-02 14:35:00)。 -
停止 PostgreSQL 并清空数据目录(务必先做练习,不要在生产中直接操作):
sudo systemctl stop postgresql sudo rm -rf /var/lib/postgresql/14/main/* -
执行恢复命令: 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' -
启动数据库并观察恢复过程:
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 ...等信息时,表明恢复完成,数据库会自动提升为读写模式。 -
验证数据:连接数据库检查被删除的表是否已恢复。
第七步:自动化备份计划
使用 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