ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] 说白了所谓的修复也就是copy(思路1:从损坏的sqlite尽可能的恢复数据,思路2:从平时的备份中的恢复数据) ## 迁移 SELECT sqlcipher\_export ## sqlite\_master 首先我们来看 SQLite 的架构。SQLite 使用 B+树 存储一个表,整个 SQLite 数据库就是这些 B+树 组成的森林。对于每个表的元数据(表名、根节点地址、表 scheme 等),都记录在一个叫 sql\_master 的表中。这个 sql\_master 表(下简称 master 表) 本身也是一个 B+树 存储的普通表。 ## 官方的dump修复 不难搜到使用.dump命令恢复DB的方法。.dump命令的作用是将 整个数据库的内容输出为很多 SQL 语句,只要对空 DB 执行这些语句就能得到一个一样的 DB。 .dump命令原理很简单:每个SQLite DB都有一个sqlite\_master表,里面保存着全部table 和index的信息(table本身的信息,不包括里面的数据哦),遍历它就可以得到所有表的名称和 CREATE TABLE ...的SQL语句,输出CREATE TABLE语句,接着使用SELECT \* FROM ... 通过表名遍历整个表,每读出一行就输出一个INSERT语句,遍历完后就把整个DB dump出来了。 这样的操作,和普通查表是一样的,遇到损坏一样会返回SQLITE\_CORRUPT,我们忽略掉损坏错误, 继续遍历下个表,最终可以把所有没损坏的表以及损坏了的表的前半部分读取出来。将dump 出来的SQL语句逐行执行,最终可以得到一个等效的新DB。由于直接跑在SQLite上层,所以天然 就支持加密SQLCipher,不需要额外处理。 ## 备份恢复方案 损坏的数据无法修复,最直观的解决方案就是备份,于是备份恢复方案被提上日程了。备份恢复这个 方案思路简单 ## 解析B-tree恢复原理 可以理解为微信以仿造编写读取数据库的逻辑,包括: * SQLCipher的解密逻辑 * B-tree解析逻辑 ## 最终wcdb的方案 ![](https://img.kancloud.cn/33/d3/33d3595947f3b566ec4c379db926025e_640x355.png)