Linux系统下PostgreSQL数据库恢复指南
PostgreSQL数据库恢复需根据备份类型(逻辑备份、物理备份、WAL日志)选择对应方法,以下是详细操作步骤及注意事项:
pg_dump生成的SQL文件(如db_backup.sql)或自定义格式文件(如db_backup.dump);pg_basebackup生成的数据库集群副本(如/var/lib/postgresql/12/main目录);pg_wal目录下的文件),用于点恢复。sudo systemctl stop postgresql
pg_dump --version验证);/tmp目录),并确保PostgreSQL用户(通常为postgres)有读取权限。逻辑备份是最常用的恢复方式,适用于需要迁移数据库或恢复特定对象的场景。
.sql文件):psql命令直接导入备份文件,需指定数据库名和备份文件路径:sudo -u postgres psql -f /path/to/db_backup.sql
.dump文件):pg_restore命令,支持选择性恢复(如特定表、数据):sudo -u postgres pg_restore -d your_database_name /path/to/db_backup.dump
常用选项:
--table=table_name:仅恢复指定表;--data-only:仅恢复数据(不包含表结构);--schema=schema_name:恢复到指定模式。物理备份是数据库集群的完整副本,适用于大规模数据恢复或系统崩溃场景。
/var/lib/postgresql/12/main),避免旧数据冲突;sudo systemctl start postgresql
pg_basebackup重新同步数据:sudo -u postgres pg_basebackup -h hostname -U username -D /var/lib/postgresql/12/main -R
其中-R表示自动配置recovery.conf(PostgreSQL 12及以上版本已整合到postgresql.conf)。若需要恢复到特定时间点(如误删除数据的时间)或事务ID,需结合物理备份和WAL日志进行点恢复。
postgresql.conf文件,设置恢复模式及目标:restore_command = 'cp /path/to/archive/%f %p' # 从归档目录复制WAL日志
recovery_target_time = '2025-10-01 12:00:00' # 恢复到指定时间(可选)
recovery_target_xid = '123456789' # 恢复到指定事务ID(可选)
recovery_target_name = 'recovery_point' # 恢复到指定恢复点名称(可选)
说明:
restore_command:用于从归档目录获取WAL日志(需提前将WAL日志归档到指定路径);recovery_target_name > recovery_target_time > recovery_target_xid。sudo -u postgres touch /var/lib/postgresql/12/main/recovery.signal
或修改postgresql.conf中的pause_at_recovery_target为on,暂停在目标点以便验证:pause_at_recovery_target = on
recovery.signal为recovery.done,并进入正常运行状态。可通过日志文件(/var/log/postgresql/postgresql-12-main.log)监控恢复进度。sudo -u postgres psql -c "\l" # 列出所有数据库
sudo -u postgres psql -d your_database_name -c "\dt" # 列出指定数据库的所有表
sudo -u postgres psql -d your_database_name -c "SELECT COUNT(*) FROM your_table;"
sudo -u postgres psql -d your_database_name -c "SELECT * FROM your_table LIMIT 10;"
postgres用户或具有足够权限的用户执行,避免权限不足导致文件无法访问。