Debian系统恢复PostgreSQL数据的通用步骤
在进行任何恢复操作前,务必备份当前数据库集群,防止恢复过程中出现意外导致数据进一步丢失。
sudo pg_dumpall -U postgres > /path/to/backup/all-databases.sql
恢复操作需要确保数据一致性,因此需先停止PostgreSQL服务:
sudo systemctl stop postgresql
.dump/.sql格式备份)pg_dumpall生成的all-databases.sql文件,可使用psql直接恢复:sudo -u postgres psql < /path/to/backup/all-databases.sql
pg_dump生成的数据库级备份(如database_name.dump),需指定数据库名和备份文件路径:sudo -u postgres pg_restore -U postgres -d database_name /path/to/backup/database_name.dump  # 二进制格式(.dump)
# 或
sudo -u postgres psql -U postgres -d database_name < /path/to/backup/database_name.sql  # SQL格式(.sql)
pg_basebackup生成的完整数据目录备份)若使用pg_basebackup做过物理备份(如备份到/backup/full_backup目录),需替换当前数据目录内容并修复权限:
sudo rm -rf /var/lib/postgresql/<版本号>/main/*  # 清空当前数据目录(需替换<版本号>,如16/main)
sudo cp -r /backup/full_backup/* /var/lib/postgresql/<版本号>/main/  # 复制备份文件
sudo chown -R postgres:postgres /var/lib/postgresql/<版本号>/main/  # 修复所有权
恢复完成后,启动服务并检查数据完整性:
sudo systemctl start postgresql
# 验证数据库列表
sudo -u postgres psql -c "\l"
# 连接目标数据库并检查表数据
sudo -u postgres psql -d database_name -c "\dt"
sudo -u postgres psql -d database_name -c "SELECT * FROM table_name LIMIT 5;"
若需恢复到某一特定时间点(如误删数据前的状态),需提前配置WAL归档并完成以下步骤:
postgresql.conf文件(位于/etc/postgresql/<版本号>/main/或$PGDATA目录):wal_level = replica
archive_mode = on
archive_command = 'cp %p /usr/local/pgsql/arch/%f'  # 归档路径需提前创建(sudo mkdir -p /usr/local/pgsql/arch)
max_wal_senders = 2
重启服务使配置生效:sudo systemctl restart postgresql。pg_basebackup生成全量备份(如备份到/backup/pitr_backup):sudo -u postgres pg_basebackup -Ft -Pv -Xf -z -p 5432 -D /backup/pitr_backup
pg_switch_wal()生成新的WAL日志文件:SELECT pg_switch_wal();
postgresql.auto.conf文件(位于数据目录)设置恢复参数:sudo rm -rf /var/lib/postgresql/<版本号>/main/*
sudo cp -r /backup/pitr_backup/* /var/lib/postgresql/<版本号>/main/
echo "restore_command = 'cp /usr/local/pgsql/arch/%f %p'" >> $PGDATA/postgresql.auto.conf
echo "recovery_target_time = '2025-10-01 12:00:00+08'" >> $PGDATA/postgresql.auto.conf  # 替换为目标时间
echo "recovery_target_timeline = 'latest'" >> $PGDATA/postgresql.auto.conf
sudo systemctl start postgresql
# 检查恢复状态(日志中会显示“recovery complete”)
journalctl -u postgresql -f
pg_restore -l查看备份内容);--clean选项(pg_restore --clean -d database_name backup.dump);/var/log/postgresql/postgresql-<版本号>-main.log)定位问题。