在进行任何恢复操作前,必须备份当前数据库集群,防止恢复过程中数据覆盖或丢失。
sudo pg_dumpall -U postgres > /path/to/current_backup.sql # 备份所有数据库
恢复操作需确保数据一致性,需先停止PostgreSQL服务:
sudo systemctl stop postgresql
PostgreSQL恢复主要分为逻辑备份恢复(.dump/.sql/.tar格式)和物理备份恢复(pg_basebackup生成的目录),以下是具体步骤:
.dump/.sql/.tar格式)逻辑备份是通过pg_dump/pg_dumpall生成的文本或归档文件,恢复时需根据格式选择命令:
.dump/.sql格式:sudo -u postgres psql -d target_database -f /path/to/backup_file.sql # SQL格式
.tar格式:sudo -u postgres pg_restore -d target_database /path/to/backup_file.tar # tar归档格式
.dump格式(自定义格式):sudo -u postgres pg_restore -U postgres -d target_database /path/to/backup_file.dump
pg_basebackup生成的目录)物理备份是通过pg_basebackup生成的数据目录(包含所有数据文件),恢复步骤如下:
sudo systemctl stop postgresql
sudo rm -rf /var/lib/postgresql/<version>/main/* # 清空当前数据目录(替换<version>为PostgreSQL版本,如15)
sudo cp -r /path/to/pg_basebackup_backup/* /var/lib/postgresql/<version>/main/
sudo chown -R postgres:postgres /var/lib/postgresql/<version>/main/
恢复完成后,启动服务以验证数据:
sudo systemctl start postgresql
登录PostgreSQL并检查数据库、表及数据是否恢复成功:
sudo -u postgres psql
\l # 列出所有数据库
\c target_database # 连接到目标数据库
\dt # 列出所有表
SELECT * FROM table_name LIMIT 10; # 查询表数据(替换table_name为目标表名)
若恢复失败,可通过PostgreSQL日志排查问题(日志路径通常为/var/log/postgresql/postgresql-<version>-main.log):
sudo tail -n 100 /var/log/postgresql/postgresql-$(pg_lsclusters -h | awk 'NR==2{print $2}').log
.tar文件或读取.sql内容)。postgresql.conf中的archive_mode、archive_command等参数),并在恢复时配置restore_command和recovery_target_time(参考搜索结果中的PITR步骤)。postgres用户或具有足够权限的用户执行,避免权限不足导致失败。