备份当前数据:无论采用哪种恢复方式,都应先备份现有数据库集群,防止恢复过程中数据覆盖或丢失。
执行命令:sudo pg_dumpall -U postgres > /path/to/backup/all-databases.sql
该命令会生成包含所有数据库结构和数据的SQL备份文件。
停止PostgreSQL服务:恢复操作前需停止服务,确保数据一致性。
执行命令:sudo systemctl stop postgresql
逻辑备份通过pg_dump生成可读的SQL或自定义格式文件,恢复时通过psql或pg_restore还原数据。
pg_dump生成自定义格式(支持压缩和并行恢复):pg_dump -Fc laozheng > laozheng.dumppg_dump -Fp laozheng > laozheng.sqlsudo -u postgres pg_restore -d laozheng /path/to/laozheng.dumpsudo -u postgres psql -d laozheng < /path/to/laozheng.sqlsudo -u postgres pg_restore -d laozheng -C /path/to/laozheng.tarpsql -U postgres -d laozheng -c "\dt"验证表结构及数据。物理备份通过pg_basebackup复制数据库集群的物理文件(包括数据目录、WAL日志),恢复速度快,但需停机。
pg_basebackup -Ft -Pv -Xf -z -Z5 -p 5432 -D /backup/full_backup-Ft表示tar格式,-Pv显示进度,-Xf包含WAL日志,-z压缩,-Z5压缩级别5。sudo systemctl stop postgresql/var/lib/postgresql/15/main/):sudo rm -rf /var/lib/postgresql/15/main/*sudo tar -xzf /backup/full_backup/base.tar.gz -C /var/lib/postgresql/15/main/sudo chown -R postgres:postgres /var/lib/postgresql/15/main/sudo systemctl start postgresqlSELECT * FROM key_table LIMIT 10;)。PITR通过WAL(Write-Ahead Logging)日志将数据库恢复到指定时间点(如某时刻、某事务ID),需提前开启WAL归档。
/etc/postgresql/<版本>/main/postgresql.conf),修改以下参数:wal_level = replica archive_mode = on archive_command = 'cp %p /usr/local/pgsql/arch/%f' max_wal_senders = 2 wal_keep_segments = 100 重启服务使配置生效:sudo systemctl restart postgresql。pg_basebackup创建全量备份(如备份到/backup/pitr_base):pg_basebackup -D /backup/pitr_base -Ft -Pv -Xf -z -Z5 -p 5432。sudo systemctl stop postgresqlsudo rm -rf /var/lib/postgresql/15/main/*sudo cp -r /backup/pitr_base/* /var/lib/postgresql/15/main/postgresql.auto.conf文件(用于恢复配置):echo "restore_command = 'cp /usr/local/pgsql/arch/%f %p'" >> /var/lib/postgresql/15/main/postgresql.auto.confecho "recovery_target_time = '2025-10-15 14:30:00+08'" >> /var/lib/postgresql/15/main/postgresql.auto.confrecovery_target_time可根据需求改为事务ID,如recovery_target_xid = '12345')sudo systemctl start postgresqljournalctl -u postgresql -f。若WAL日志损坏导致数据库无法启动,可使用pg_resetwal工具重置WAL日志(需谨慎操作,可能导致数据丢失)。
sudo systemctl stop postgresqlsudo cp -r /var/lib/postgresql/15/main /var/lib/postgresql/15/main_backuppg_resetwal:sudo pg_resetwal -D /var/lib/postgresql/15/main -f-f参数强制重置,无备份时不建议使用)sudo systemctl start postgresqlsudo -u postgres psql -c "\l"。pg_restore -l列出备份内容)。journalctl -u postgresql -f实时查看日志,及时处理错误。