PostgreSQL数据恢复方法及步骤
PostgreSQL数据恢复需根据备份类型(逻辑/物理)、场景(完整恢复、时间点恢复、误删除恢复)选择合适方法。以下是常见场景的具体操作指南:
.sql/.dump、物理备份如pg_basebackup生成的目录、WAL归档日志)。sudo systemctl stop postgresql
/var/lib/pgsql/data),防止操作失误导致二次丢失。逻辑备份是通过pg_dump导出的SQL或自定义格式文件,适用于跨版本、跨平台恢复。
使用psql命令直接导入:
sudo -u postgres psql -f /path/to/backup.sql
使用pg_restore命令,支持选择性恢复(如特定表、数据):
sudo -u postgres pg_restore -d your_database_name /path/to/backup.dump
users表):sudo -u postgres pg_restore -U username -d your_database_name --table=users /path/to/backup.dump
sudo -u postgres pg_restore -U username -d your_database_name --data-only /path/to/backup.dump
若备份时启用了时间点恢复(PITR),可通过--stop-at选项指定时间:
pg_dump -U username -d database_name --stop-at='2025-10-01 12:00:00' > partial_backup.sql
物理备份是数据库目录的完整副本,适用于大型数据库或需要快速恢复的场景。
若备份是pg_basebackup生成的目录,直接替换原数据目录并启动服务:
# 停止服务后,删除原数据目录(谨慎操作)
rm -rf /var/lib/pgsql/data/*
# 解压或复制备份目录到数据目录
tar -xzvf /path/to/backup.tar.gz -C /var/lib/pgsql/data/
# 启动服务
sudo systemctl start postgresql
若备份后有WAL归档日志,需编辑postgresql.conf配置恢复参数,然后重启服务触发恢复:
# 编辑postgresql.conf
sudo nano /var/lib/pgsql/data/postgresql.conf
# 添加以下内容(根据需求选择其一)
recovery_target_time = '2025-10-01 12:00:00' # 恢复到指定时间
recovery_target_xid = '123456' # 恢复到指定事务ID
recovery_target_name = 'my_recovery_point' # 恢复到指定恢复点名称
# 设置恢复命令(从归档目录复制WAL文件)
restore_command = 'cp /path/to/wal_archive/%f %p'
# 保存后创建recovery.signal文件(PostgreSQL 12+)
touch /var/lib/pgsql/data/recovery.signal
# 启动服务,自动进入恢复模式
sudo systemctl start postgresql
# 监控日志确认恢复完成
tail -f /var/log/postgresql/postgresql.log
若数据误删除且无有效备份,可尝试以下方法:
适用于数据库崩溃或WAL日志损坏的情况,会丢失未提交事务:
# 停止服务并备份数据目录
sudo systemctl stop postgresql
cp -R /var/lib/pgsql/data /var/lib/pgsql/data_backup
# 重置WAL日志
sudo -u postgres pg_resetwal -D /var/lib/pgsql/data -f
# 启动服务
sudo systemctl start postgresql
# 重新创建数据库并恢复数据
若数据未被覆盖,可通过扩展访问已删除行(仅适用于未VACUUM的表):
-- 创建扩展
CREATE EXTENSION IF NOT EXISTS pg_dirtyread;
-- 查询已删除数据(示例)
SELECT * FROM tablename USING pg_dirtyread('tablename');
Barman是PostgreSQL专用备份管理工具,支持物理备份和时间点恢复。
# 安装Barman
sudo yum install barman
# 配置Barman(编辑/etc/barman.conf)
barman register /var/lib/pgsql/data
# 恢复到指定目录
barman recover my_server /var/lib/pgsql/recovery --target-time='2025-10-01 12:00:00'
# 恢复完成后,将数据目录同步到PostgreSQL数据目录
sudo -u postgres psql -c "\l" # 列出所有数据库
sudo -u postgres psql -c "\dt" # 列出所有表
sudo -u postgres psql -c "SELECT COUNT(*) FROM your_table;" # 检查表行数
sudo -u postgres psql -c "SELECT * FROM your_table LIMIT 10;" # 抽样检查数据
postgres用户或具有足够权限的用户执行。免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。