PostgreSQL 在 CentOS 的备份恢复实践
一 备份策略与准备
二 逻辑备份与恢复
su - postgres -c "pg_dump testdb > /tmp/testdb_$(date +%F).sql"su - postgres -c "createdb testdb_restored",再导入su - postgres -c "psql -d testdb_restored -f /tmp/testdb_2025-12-05.sql"su - postgres -c "pg_dump -F c -f /opt/backup/testdb_$(date +%F).dump testdb"su - postgres -c "pg_restore -d testdb_restored /opt/backup/testdb_2025-12-05.dump"-n schema1、-t schema1.tbl;仅结构:-s;仅数据:-a;包含 DROP:-c;不写属主:-O;压缩传输:pg_dump mydb | gzip > mydb.sql.gz。-1/--single-transaction(一致性事务)、可按需选择对象恢复。三 物理备份与时间点恢复 PITR
su - postgres -c "pg_basebackup -D /opt/pg_base/backup_$(date +%F) -F p -X stream -P -v"-F p 为普通目录复制,-X stream 流式传输 WAL,-P/-v 显示进度与详细信息。systemctl stop postgresql-15(版本号按实际替换)。mv $PGDATA $PGDATA.bak_$(date +%F)。mv /opt/pg_base/backup_YYYY-MM-DD $PGDATA。touch $PGDATA/recovery.signal(PostgreSQL 12+ 使用信号文件;早期版本用 recovery.conf)。$PGDATA/postgresql.auto.conf(或 postgresql.conf):
restore_command = 'cp /var/lib/pgsql/15/archive/%f %p'(路径按实际归档目录调整)。recovery_target_time = '2025-12-05 10:00:00+08'(示例)。recovery_target_action = 'promote'(默认 shutdown)。systemctl start postgresql-15;检查日志:journalctl -u postgresql-15 -f。recovery.signal 并切换为读写模式。pg_archivecleanup 清理已不再需要的 WAL 段,避免磁盘占满。四 自动化与常见注意事项
#!/usr/bin/env bash
set -e
BACKUP_DIR="/opt/pgbackup"
DATE=$(date +%F)
mkdir -p "$BACKUP_DIR"
su - postgres -c "pg_dump -F c -f $BACKUP_DIR/testdb_$DATE.dump testdb"
find "$BACKUP_DIR" -name "testdb_*.dump" -mtime +30 -delete
0 23 * * * /opt/pgbackup/backup.sh。pg_restore -j <N> 并行恢复;纯文本导入可在单事务中执行(-1)以保证一致性。-O 避免目标库用户/属主冲突;跨环境恢复需提前准备角色与表空间。