生产环境 SQLite 文件损坏如何用 integrity_check 修复

文章导读
integrity_check 本身是诊断命令,不能直接修复损坏,但它是确认损坏程度和指导后续恢复的关键第一步。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

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

第二步:诊断损坏程度

生产环境 SQLite 文件损坏如何用 integrity_check 修复

连接副本执行检查命令。若返回"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) 数据修复