故障有很多种:硬件挂了、断电、代码出错,或者更常见的,某个不靠谱的管理员手滑把数据库删了,想着“清理点旧东西”。这种时候,备份和靠谱的恢复流程就是你的“魔法棒”。
我们来像组装IKEA家具一样,一步步拆解恢复流程:别慌,按说明来就行。
第1步. 分析故障原因
在你火急火燎地去恢复数据之前,先搞清楚到底发生了啥。
应用还是数据库出错?
去查查你应用和PostgreSQL的日志(一般在/var/log/postgresql/或者你系统对应的目录)。找找有没有报错的线索。硬件故障?
如果服务器真的坏了(比如硬盘出问题),先确认硬件没问题。如果硬盘坏了,换个盘,把数据从备份恢复回来。网络或访问问题?
如果是网络导致的故障——那你的服务器暂时还不用恢复操作。人为操作:
老实说……是不是有人执行了DROP DATABASE?如果是的话,还有机会用备份恢复回来。
记住,搞清楚故障原因,能帮你以后避免同样的坑。
第2步. 检查备份可用性
现在该确认下我们手里有没有靠谱的备份了。找找你用pg_dump或pg_basebackup做的最近的数据库备份。检查下它们是不是完整的。如果你还不知道怎么查,给你个小提示:
- 用
ls -l命令看看文件大小。如果文件特别小,可能有问题。 - 用
file命令查查文件类型。例如:
你应该能看到文件信息,显示这是个SQL dump。file backup_file.sql
如果是tar归档,试试能不能解包:
tar -tf backup.tar
没报错?那就OK,可以继续了。
第3步. 停止PostgreSQL
恢复前一定要先停掉PostgreSQL服务器,保证过程安全。用下面的命令(用服务器管理员账号):
sudo systemctl stop postgresql
停掉数据库能保证没有进程干扰恢复。
第4步. 准备新数据库用于恢复
如果你的数据库已经被删光或者损坏,先新建一个。命令示例:
createdb -U postgres new_database
把new_database换成你的数据库名。
第5步. 恢复备份
我们来看两种主要的恢复场景:
如果你用的是SQL备份(
pg_dump): 恢复用这个命令psql -U username -d new_database -f backup_file.sql
username— 你的PostgreSQL用户。new_database— 要导入数据的数据库。backup_file.sql— 你的备份文件。
- 如果你用的是二进制备份(
pg_basebackup或pg_dump的custom格式):
恢复用这个:
注意这种备份不是文本格式,而是“打包”的数据。pg_restore -U username -d new_database backup_file.dump
补充:
- 如果只备份了数据,用
--data-only。 - 只想恢复结构,加
--schema-only。
第6步. 启动PostgreSQL并测试
恢复命令跑完后,启动服务器:
sudo systemctl start postgresql
现在要做测试了。用psql或pgAdmin连上恢复好的数据库。随便查几条数据,看看是不是正常:
SELECT * FROM your_table_name LIMIT 10;
如果一切OK,恭喜你:数据恢复成功!
第7步. 检查数据完整性
恢复后一定要确认数据是完整的。比如:
对比表里的行数和备份:
和备份里的记录数比比看(如果有的话)。SELECT COUNT(*) FROM your_table_name;用校验和: 如果你之前给表做过校验和,现在可以对比一下:
md5sum backup_file.sql检查表之间的关联: 确认恢复后的FOREIGN KEY关系都没问题。
第8步. 测试应用
现在测试下你的应用能不能正常用这个数据库。把主要功能都跑一遍。有报错吗?显示都正常吗?
真实恢复错误案例
来看看几个实际案例,帮你避坑:
PostgreSQL版本不兼容。
比如你在12版本做的备份,服务器升级到15了。恢复时就会报错。
解决办法:用和备份一样的PostgreSQL版本,或者查查官方文档的兼容性:PostgreSQL Documentation。备份损坏。 如果你的备份坏了,部分数据可能丢失。
解决办法:用多份备份做冗余(比如保留多个版本)。恢复单表时报错。
如果你只恢复一张表,但依赖(比如外键)没恢复,过程可能会失败。
解决办法:总是按顺序恢复表,先恢复父表。
GO TO FULL VERSION