CodeGym /课程 /SQL SELF /故障后数据恢复

故障后数据恢复

SQL SELF
第 44 级 , 课程 2
可用

故障有很多种:硬件挂了、断电、代码出错,或者更常见的,某个不靠谱的管理员手滑把数据库删了,想着“清理点旧东西”。这种时候,备份和靠谱的恢复流程就是你的“魔法棒”。

我们来像组装IKEA家具一样,一步步拆解恢复流程:别慌,按说明来就行。

第1步. 分析故障原因

在你火急火燎地去恢复数据之前,先搞清楚到底发生了啥。

  1. 应用还是数据库出错?
    去查查你应用和PostgreSQL的日志(一般在/var/log/postgresql/或者你系统对应的目录)。找找有没有报错的线索。

  2. 硬件故障?
    如果服务器真的坏了(比如硬盘出问题),先确认硬件没问题。如果硬盘坏了,换个盘,把数据从备份恢复回来。

  3. 网络或访问问题?
    如果是网络导致的故障——那你的服务器暂时还不用恢复操作。

  4. 人为操作:
    老实说……是不是有人执行了DROP DATABASE?如果是的话,还有机会用备份恢复回来。

记住,搞清楚故障原因,能帮你以后避免同样的坑。

第2步. 检查备份可用性

现在该确认下我们手里有没有靠谱的备份了。找找你用pg_dumppg_basebackup做的最近的数据库备份。检查下它们是不是完整的。如果你还不知道怎么查,给你个小提示:

  • ls -l命令看看文件大小。如果文件特别小,可能有问题。
  • file命令查查文件类型。例如:
    file backup_file.sql
    
    你应该能看到文件信息,显示这是个SQL dump。

如果是tar归档,试试能不能解包:

tar -tf backup.tar

没报错?那就OK,可以继续了。

第3步. 停止PostgreSQL

恢复前一定要先停掉PostgreSQL服务器,保证过程安全。用下面的命令(用服务器管理员账号):

sudo systemctl stop postgresql

停掉数据库能保证没有进程干扰恢复。

第4步. 准备新数据库用于恢复

如果你的数据库已经被删光或者损坏,先新建一个。命令示例:

createdb -U postgres new_database

new_database换成你的数据库名。

第5步. 恢复备份

我们来看两种主要的恢复场景:

  1. 如果你用的是SQL备份(pg_dump): 恢复用这个命令

    psql -U username -d new_database -f backup_file.sql
    
  • username — 你的PostgreSQL用户。
  • new_database — 要导入数据的数据库。
  • backup_file.sql — 你的备份文件。
  1. 如果你用的是二进制备份(pg_basebackuppg_dumpcustom格式):
    恢复用这个:
    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步. 检查数据完整性

恢复后一定要确认数据是完整的。比如:

  1. 对比表里的行数和备份:

    SELECT COUNT(*) FROM your_table_name;
    
    和备份里的记录数比比看(如果有的话)。

  2. 用校验和: 如果你之前给表做过校验和,现在可以对比一下:

    md5sum backup_file.sql
    
  3. 检查表之间的关联: 确认恢复后的FOREIGN KEY关系都没问题。

第8步. 测试应用

现在测试下你的应用能不能正常用这个数据库。把主要功能都跑一遍。有报错吗?显示都正常吗?

真实恢复错误案例

来看看几个实际案例,帮你避坑:

  1. PostgreSQL版本不兼容
    比如你在12版本做的备份,服务器升级到15了。恢复时就会报错。
    解决办法:用和备份一样的PostgreSQL版本,或者查查官方文档的兼容性:PostgreSQL Documentation

  2. 备份损坏。 如果你的备份坏了,部分数据可能丢失。
    解决办法:用多份备份做冗余(比如保留多个版本)。

  3. 恢复单表时报错
    如果你只恢复一张表,但依赖(比如外键)没恢复,过程可能会失败。
    解决办法:总是按顺序恢复表,先恢复父表。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION