深色模式
PostgreSQL 备份 pg_basebackup 与 pg_dump
摘要:PG 备份分两类:
pg_dump导出 SQL(灵活、可跨版本),pg_basebackup拷贝整个数据目录(快、配合 WAL 归档可做时间点恢复)。本文给出两种方式与归档配置。
适用环境
bash
# 确认版本与数据目录
psql -U postgres -c "SELECT version(); SHOW data_directory;"
# 备份目录留出足够空间
mkdir -p /data/pgbackup/{logical,physical,wal}
df -h /data/pgbackup1
2
3
4
5
6
2
3
4
5
6
操作步骤
1. 逻辑备份:pg_dump
bash
# 单库备份(自定义格式,-Fc 支持并行与选择性恢复)
pg_dump -U postgres -Fc -d shopdb -f /data/pgbackup/logical/shopdb_$(date +%F).dump
# 纯 SQL 文本格式,便于人工查看
pg_dump -U postgres -d shopdb > /data/pgbackup/logical/shopdb_$(date +%F).sql
# 只备份某个大表
pg_dump -U postgres -d shopdb -t orders -Fc -f /data/pgbackup/logical/orders.dump1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
2. 逻辑备份恢复
bash
# 先建空库,再用 pg_restore 还原(自定义格式支持并行)
createdb -U postgres shopdb_restore
pg_restore -U postgres -d shopdb_restore -j 4 /data/pgbackup/logical/shopdb_2026-10-09.dump1
2
3
2
3
3. 开启 WAL 归档(做时间点恢复的前提)
bash
# postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /data/pgbackup/wal/%f && cp %p /data/pgbackup/wal/%f'1
2
3
4
2
3
4
bash
sudo systemctl restart postgresql
psql -U postgres -c "SELECT pg_switch_wal();" # 触发一次归档
ls /data/pgbackup/wal | head1
2
3
2
3
危险
归档目录写满会导致 WAL 无法归档、数据库停止写入。必须监控归档目录空间,并配置定期清理与异地副本。
4. 物理备份:pg_basebackup
bash
pg_basebackup -U postgres -D /data/pgbackup/physical/full_$(date +%F) \
-Ft -z -P -X stream # -Ft 打包成 tar,-z gzip 压缩,-X stream 同时取 WAL1
2
2
bash
# 使用复制权限的专用账号更安全
psql -U postgres -c "CREATE USER bkp WITH REPLICATION PASSWORD 'BkpPass!2026';"1
2
2
5. 物理备份恢复
bash
sudo systemctl stop postgresql
mv /var/lib/pgsql/data /var/lib/pgsql/data_bak_$(date +%s)
mkdir /var/lib/pgsql/data
tar -xf /data/pgbackup/physical/full_2026-10-09/base.tar.gz -C /var/lib/pgsql/data
sudo chown -R postgres:postgres /var/lib/pgsql/data
sudo systemctl start postgresql1
2
3
4
5
6
2
3
4
5
6
验证
bash
# 逻辑备份完整性
pg_restore -l /data/pgbackup/logical/shopdb_2026-10-09.dump | head -n 20
# 物理备份基础校验
ls -lh /data/pgbackup/physical/full_2026-10-09/
pg_isready
psql -U postgres -c "SELECT count(*) FROM orders;"1
2
3
4
5
6
7
2
3
4
5
6
7
常见坑
WARNING
pg_dump 默认是单库备份,不会导出 role 与表空间定义;迁移环境要额外用 pg_dumpall --globals-only。
WARNING
WAL 归档与物理备份必须配套:只有基础备份没有 WAL,只能恢复到备份那一刻。
DANGER
恢复前务必先备份(或改名保留)当前数据目录,直接覆盖会导致无法回退。