integrity_check 本身是诊断命令,不能直接修复损坏,但它是确认损坏程度和指导后续恢复的关键第一步。
先说结论:遇到报错先备份原文件,再用 integrity_check 评估损坏等级,轻微损坏尝试 VACUUM,严重损坏需导出 SQL 重建。
- 先确认:执行 PRAGMA integrity_check 查看具体错误信息
- 先处理:务必复制损坏文件后再操作,严禁直接覆盖原文件
- 再验证:修复完成后再次运行检查命令,确保返回 ok
命令速用版
# 检查完整性
sqlite3 your_db.db "PRAGMA integrity_check;"
# 尝试轻微修复
sqlite3 your_db.db "VACUUM;"
# 导出数据(重建法)
sqlite3 your_db.db ".dump" > recovery.sql
为什么会这样
SQLite 是文件式存储,没有独立服务器进程保护,以下场景容易导致文件结构破坏:
- 意外中断:系统崩溃、断电或程序异常终止,导致写入操作未完成,破坏数据库页结构。
- 并发冲突:多个进程同时写入且未正确使用锁机制,容易造成页分配错误。
- 存储问题:磁盘空间满、文件系统错误或存储介质老化坏道,引发读写异常。
损坏后常见报错为"database disk image is malformed",此时数据库无法正常读写。
分步处理
第一步:备份原文件
所有修复操作必须在副本上进行,保留原件作为最后退路。
cp your_db.db your_db.db.bak
第二步:诊断损坏程度
连接副本执行检查命令。若返回"ok",可能只是临时异常;若返回具体错误(如 page corrupted),则存在页面损坏。
sqlite3 your_db.db.bak "PRAGMA integrity_check;"
第三步:尝试修复
若检查返回 ok 或仅轻微碎片,执行 VACUUM 清理碎片。若损坏严重,需导出 SQL 重建。
sqlite3 your_db.db.bak "VACUUM;"
第四步:数据导出与重建(严重损坏时)
将内容导出为 SQL 文件,再导入新数据库。若导出过程中报错,可尝试手动修改 SQL 文件末尾,将"ROLLBACK;"改为"COMMIT;"。
sqlite3 your_db.db.bak ".dump" > recovery.sql
sqlite3 new_db.db ".read recovery.sql"
怎么验证是否生效
对新数据库文件再次运行完整性检查,确保输出结果为"ok",且业务程序能正常读写数据。
sqlite3 new_db.db "PRAGMA integrity_check;"
常见坑
- 直接操作原文件:修复失败会导致数据彻底丢失,务必先备份。
- 磁盘空间不足:修复过程可能需要额外空间,确保根分区未满。
- 忽略 WAL 文件:若启用 WAL 模式,需确保日志文件与主数据库同步,否则可能引发损坏。
参考来源
- SQLite 数据库损坏修复指南——解决"database disk image is malformed"报错
- SQLite 数据库损坏怎么办?PHP 环境下数据恢复的 4 种紧急方案-CSDN 博客
- sqlite 数据库文件提示损坏修复方法_转
- 修复 sqlite3 数据库 db 文件 (sqlite3 的 db 文件打不开)
- sqlite 提示 Runtime error: database disk image is malformed (11) 数据修复