PostgreSQL 在 CentOS 上的备份与恢复策略
一、策略总览与选型
二、逻辑备份与恢复步骤
pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -f /backups/mydb_$(date +%F).dump mydbcreatedb -O owner mydb,再 pg_restore -d mydb /backups/mydb_YYYY-MM-DD.dumppg_dumpall -U postgres > /backups/pg_all_$(date +%F).sqlpsql -f /backups/pg_all_YYYY-MM-DD.sql postgrespg_dump -t schema.table db > table.sqlpg_dump -n schema db > schema.sqlpg_dump -s db > schema.sql;仅数据:pg_dump -a db > data.sqlpg_dump db | gzip > db.sql.gz(恢复:gunzip -c db.sql.gz | psql db)pg_dump -j 4 -F d -f out.dir db(恢复:pg_restore -j 4 -d db out.dir)-1/--single-transaction 将转储作为单个事务执行,避免部分成功。/opt/scripts/pg_dump.sh:#!/usr/bin/env bash
set -e
BACKUP_DIR=/backups
DATE=$(date +%F_%H-%M-%S)
mkdir -p "$BACKUP_DIR"
pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c --file "$BACKUP_DIR/mydb_$DATE.dump" mydb
# 保留近30天
find "$BACKUP_DIR" -name "mydb_*.dump" -mtime +30 -delete
0 2 * * * /opt/scripts/pg_dump.sh三、物理备份与时间点恢复 PITR
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /var/lib/pgsql/12/archive/%f && cp %p /var/lib/pgsql/12/archive/%f'
max_wal_senders = 3
wal_keep_segments = 32
mkdir -p /var/lib/pgsql/12/archive && chown postgres:postgres /var/lib/pgsql/12/archivepg_basebackup -h 127.0.0.1 -U postgres -D /backups/base_$(date +%F) \
-F p -P -v -R -X stream
-R 会在目标目录生成 standby.signal(PostgreSQL 12+ 使用 recovery.signal 机制),便于直接进入恢复模式。$PGDATA 下创建 recovery.signal(PostgreSQL 12+):touch $PGDATA/recovery.signalpostgresql.auto.conf):restore_command = 'cp /var/lib/pgsql/12/archive/%f "%p"'
recovery_target_time = '2025-12-19 10:00:00'
# 或按事务ID:recovery_target_xid = '123456'
# 或按还原到最新:recovery_target_action = 'promote'
pg_ctl -D $PGDATA start
tail -f $PGDATA/log/postgresql-*.log
recovery.conf,参数如 restore_command、recovery_target_time 写入该文件。postgresql.conf/postgresql.auto.conf 管理恢复。四、备份与恢复验证及运维要点
pg_restore -l 预览内容、pg_restore --schema-only/-data-only 做结构/数据校验;