恢复数据库其实没那么简单:看起来好像都恢复成功了,但日志里突然冒出错误,有些表没了,或者数据看着怪怪的。所以恢复后一定要检查下,确保一切真的没问题。
有时候部分数据可能根本没恢复——比如备份文件本身坏了。有时候表结构乱了:外键没了,索引丢了,或者出现奇怪的值。就算表面上一切正常,日志也可能暗示数据库其实有点毛病。
完整性检查就像修车后的年检。花点时间确认一切OK,总比上线后突然踩坑强多了。
恢复日志分析
用 pg_restore 恢复数据时,PostgreSQL 一定会生成日志。日志里有很多恢复过程的信息,包括警告和错误。比如这样指定日志文件的命令:
pg_restore -U username -d database_name backup_file.dump > restore_log.txt 2>&1
注意 > restore_log.txt 2>&1 —— 这样标准输出和错误都进一个文件。
日志里要看啥?
错误。 重点关注像 "ERROR" 或 "FATAL" 这种关键词。比如:
ERROR: 关系 "students" 不存在警告。 有时候你会看到 "WARNING"。虽然不致命,但最好也看看——可能有坑:
WARNING: 无法为表 "grades" 授权数据不一致。 检查所有关键对象是否都恢复了:表、索引、外键。
用 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,不一样说明文件坏了。
数据库层面检查数据
校验和和日志都不错,但怎么确认数据本身没问题?可以这样:
- 对比行数
对比恢复前后的表行数。比如:
-- 统计 students 表的行数
SELECT COUNT(*) FROM students;
行数不一样,说明恢复不完整。
- 检查键的完整性
检查表之间的关系,确保外键都正常:
-- 检查选了课程的学生
SELECT *
FROM enrollments e
LEFT JOIN courses c
ON e.course_id = c.course_id
WHERE c.course_id IS NULL;
如果有结果,说明 enrollments 里有些行找不到对应课程。
- 和原始数据对比
如果你有数据副本(比如另一个库的 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 归档,最后数据库全都恢复回来了。
完整性检查总结
恢复后完整性检查要做这些:
- 查 日志,看有没有错误和警告。
- 用 校验和,确认文件没坏。
- 对比数据库 行数 和 关系完整性。
- 有问题就查错,重来一遍恢复。
现在你已经完全可以自己做彻底检查,确保数据恢复得和你预期一样。毕竟做数据库管理员,最重要的就是对备份有信心!
GO TO FULL VERSION