CodeGym /课程 /SQL SELF /恢复后数据完整性检查

恢复后数据完整性检查

SQL SELF
第 44 级 , 课程 1
可用

恢复数据库其实没那么简单:看起来好像都恢复成功了,但日志里突然冒出错误,有些表没了,或者数据看着怪怪的。所以恢复后一定要检查下,确保一切真的没问题。

有时候部分数据可能根本没恢复——比如备份文件本身坏了。有时候表结构乱了:外键没了,索引丢了,或者出现奇怪的值。就算表面上一切正常,日志也可能暗示数据库其实有点毛病。

完整性检查就像修车后的年检。花点时间确认一切OK,总比上线后突然踩坑强多了。

恢复日志分析

pg_restore 恢复数据时,PostgreSQL 一定会生成日志。日志里有很多恢复过程的信息,包括警告和错误。比如这样指定日志文件的命令:

pg_restore -U username -d database_name backup_file.dump > restore_log.txt 2>&1

注意 > restore_log.txt 2>&1 —— 这样标准输出和错误都进一个文件。

日志里要看啥?

  1. 错误。 重点关注像 "ERROR" 或 "FATAL" 这种关键词。比如:

    ERROR:  关系 "students" 不存在
    
  2. 警告。 有时候你会看到 "WARNING"。虽然不致命,但最好也看看——可能有坑:

    WARNING:  无法为表 "grades" 授权
    
  3. 数据不一致。 检查所有关键对象是否都恢复了:表、索引、外键。

grep 快速查日志

如果日志文件太长(有时候比《战争与和平》还长),可以用 grep 搜关键词:

grep -i "error" restore_log.txt
grep -i "warning" restore_log.txt

日志错误分析

来看个真实日志例子:

ERROR:  约束 "fk_student_course" 针对关系 "enrollments" 不存在
DETAIL:  键 (course_id)=(2) 在表 "courses" 里不存在。

这错误啥意思? 就是 PostgreSQL 想往 enrollments 表插入一行,但 courses 表里没有对应的 course_id

怎么解决? 可能 courses 表的数据坏了或者没恢复。你得手动补上缺的行,或者重来一遍恢复。

用校验和检查完整性

想确认备份文件恢复前后都没坏,可以用校验和。

校验和就是个小数字,代表文件里的数据。哪怕只改一个比特,校验和也会变。这样就能判断文件有没有损坏。

生成校验和可以用 md5sum。比如:

md5sum backup_file.dump

结果像这样:

4c9b5f5d31ae2b53e9e3d56dfedc3fe4  backup_file.dump

对比校验和

如果你提前记下了校验和,可以和现在的比一下:

md5sum -c checksum.md5

checksum.md5 文件里要有校验和和文件名:

4c9b5f5d31ae2b53e9e3d56dfedc3fe4  backup_file.dump

校验和一样就会显示 OK,不一样说明文件坏了。

数据库层面检查数据

校验和和日志都不错,但怎么确认数据本身没问题?可以这样:

  1. 对比行数

对比恢复前后的表行数。比如:

-- 统计 students 表的行数
SELECT COUNT(*) FROM students;

行数不一样,说明恢复不完整。

  1. 检查键的完整性

检查表之间的关系,确保外键都正常:

-- 检查选了课程的学生
SELECT *
FROM enrollments e
LEFT JOIN courses c
ON e.course_id = c.course_id
WHERE c.course_id IS NULL;

如果有结果,说明 enrollments 里有些行找不到对应课程。

  1. 和原始数据对比

如果你有数据副本(比如另一个库的 dump),可以对比下:

-- 检查 courses 表的数据
SELECT * FROM courses WHERE course_id NOT IN (
  SELECT course_id FROM courses_backup
);

真实恢复案例

实际案例:有次 DBA Bob 想在服务器挂了后用备份恢复数据。他执行了:

pg_restore -U admin -d my_database my_backup.dump

但分析日志时恢复报错:

ERROR:  无法创建文件 "base/16385/pg_internal.init": 设备空间不足

意思是磁盘满了。清理出空间后再恢复,他发现有些表还是没恢复。好在 Bob 之前生成了校验和,还开了 WAL 归档,最后数据库全都恢复回来了。

完整性检查总结

恢复后完整性检查要做这些:

  1. 日志,看有没有错误和警告。
  2. 校验和,确认文件没坏。
  3. 对比数据库 行数关系完整性
  4. 有问题就查错,重来一遍恢复。

现在你已经完全可以自己做彻底检查,确保数据恢复得和你预期一样。毕竟做数据库管理员,最重要的就是对备份有信心!

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