1. 使用pg_dump/pg_restore进行逻辑恢复
这是PostgreSQL最常用的逻辑备份恢复方法,适用于常规数据丢失场景。首先通过pg_dump导出数据库为SQL或自定义格式(.dump)文件,再通过pg_restore或psql导入到目标数据库。若需恢复特定时间点数据,可使用pg_dump的--stop-at选项指定时间点(如--stop-at='2025-10-17 14:30:00'),仅导出该时间点前的数据;恢复时添加--data-only选项可仅恢复数据(不包含表结构)。操作前需停止PostgreSQL服务以保证数据一致性。
2. 物理备份与WAL日志恢复(时间点恢复)
物理备份通过pg_basebackup工具创建数据库集群的完整副本(包含数据目录),结合WAL(Write-Ahead Logging)日志可实现任意时间点恢复。步骤如下:停止PostgreSQL服务,使用pg_basebackup备份数据目录(pg_basebackup -h hostname -U username -D /path/to/backup -F t -z -P -X stream -R);将备份恢复到数据目录后,利用WAL日志重放后续变更(通过pg_resetwal或pg_waldump工具查看并应用WAL日志)。此方法适用于大规模数据库或需要精确到秒级恢复的场景。
3. 使用pg_dirtyread扩展恢复已删除数据
若数据被DELETE或UPDATE操作删除但未被VACUUM清理,可通过pg_dirtyread扩展读取MVCC(多版本并发控制)机制下的“dead”元组。操作步骤:安装扩展(CREATE EXTENSION IF NOT EXISTS pg_dirtyread;);通过扩展查询表数据(SELECT * FROM tablename USING pg_dirtyread('tablename');)。注意:此方法仅能恢复未被覆盖的数据,且需数据库处于运行状态。
4. 使用pg_resetwal修复WAL日志问题
当WAL日志文件损坏或丢失导致数据库无法启动时,可使用pg_resetwal工具重置WAL日志和pg_control文件。操作前需停止PostgreSQL服务并备份数据目录(cp -R /var/lib/pgsql/data /var/lib/pgsql/data_backup);执行命令(pg_resetwal -D /var/lib/pgsql/data -f)重置WAL日志;启动PostgreSQL服务后,需重新创建数据库或从备份恢复数据。此方法会丢失未提交事务,需谨慎使用。
5. 第三方工具辅助恢复
barman.conf文件,添加服务器信息(如[barman]部分设置ssh、port、dbname等);通过barman backup dbname命令执行备份;恢复时使用barman recover dbname /path/to/recovery.conf命令恢复到指定目录。pg_rewind快速同步。安装工具(sudo yum install postgresql12-pg_rewind);执行命令(pg_rewind --target-pgdata=/var/lib/pgsql/data --source-server='host=source_host dbname=database_name user=username password=password')同步数据。6. 恢复前的关键注意事项
pg_dump导出到新文件),防止恢复过程中数据进一步损坏。postgres用户);备份与恢复的PostgreSQL版本需一致,避免兼容性问题。VACUUM或VACUUM FULL,MVCC元组可能已被清理,恢复成功率会降低。