Debian 上 PostgreSQL 数据恢复实战指南
一、恢复方式总览与选择
二、逻辑恢复步骤(pg_dump/pg_restore)
sudo -u postgres createdb -O owner dbnamesudo -u postgres pg_dump -U user -F c -f dbname.dump dbnamesudo -u postgres pg_restore -U user -d dbname -j 4 dbname.dumpsudo -u postgres pg_dump -U user -F p -f dbname.sql dbnamesudo -u postgres psql -U user -d dbname -f dbname.sql-t 表名 仅恢复某表;-n 模式名 仅恢复某模式;-j N 并行恢复(自定义格式);必要时加 --clean 先清理对象。三、物理恢复与时间点恢复 PITR(推荐用于误删/误更新)
wal_level = replica|archive(或更高)、archive_mode = on、archive_command 将 WAL 段复制到安全目录(如 /var/lib/postgresql/archive/wal),并重启生效。sudo -u postgres pg_basebackup -D /backup/base -Ft -Pv -Xf -z -Z5 -p 5432sudo systemctl stop postgresqlrestore_command = 'cp /var/lib/postgresql/archive/wal/%f %p'recovery_target_time = '2025-08-26 12:00:00'recovery_target_name = 'before_drop_table'recovery_target_timeline = 'latest'sudo systemctl start postgresql(或 pg_ctl -D $PGDATA start),数据库将自动回放 WAL 到目标点。SELECT pg_wal_replay_resume(); 结束恢复并对外提供读写(或按你的流程重建备机/切换)。SELECT pg_current_wal_lsn();、SELECT * FROM pg_replication_origin_status; 等)。四、无备份的紧急恢复思路(条件苛刻,尽快尝试)
ROLLBACK;。CREATE EXTENSION pg_dirtyread;CREATE TABLE recovered AS SELECT * FROM pg_dirtyread('tbl') WHERE <条件>;INSERT INTO tbl SELECT * FROM recovered;pg_dirtyread 提取;此法复杂且依赖版本/配置,成功率有限。五、关键注意事项与排错清单
recovery_target_timeline;恢复完成后用 pg_replication_origin_status 等确认。pg_restore --list、校验 WAL 连续性),避免真正故障时才发现不可用。