修复方法简介

关于不同修复方法的详细介绍,请参照 《公众号文章》

Repair Kit

使用 Repair Kit 可以直接从损坏的数据库里尽量读出未损坏的数据,不需要事先准备,但是先备份 Master 信息可以大大增加恢复成功率。 如果有意使用 Repair Kit 恢复数据库,建议备份 Master 信息。

Repair Kit 使用范例,请参照 sample-repairdb

备份 Master 信息只需要调用 RepairKit.MasterInfo.save(…) 即可。备份 Master 信息典型消耗为几kB ~ 几十kB,几毫秒 ~ 几十毫秒,但如果你有非常非常多的表和索引(万数量级),这个过程可能会有点慢,建议放在子线程完成。

恢复损坏数据库

恢复损坏数据库,首先加载之前备份的 Master 信息(如果有)。

  1. RepairKit.MasterInfo master = RepairKit.MasterInfo.load('/path/to/database.db-mbak',
  2. BACKUP_PASSPHRASE, null);
  3. // 加载不成功,可能是不存在或者损坏
  4. }

使用 RepairKit 打开损坏的数据库,使用 打开新的数据库,调用 output(…)即可将损坏数据库的内容转移到新数据库。

Repair Kit 可以只恢复一部分表,只需要在 MasterInfo.load(…) 或者 MasterInfo.make(…)里指定白名单即可。

  1. // 白名单,只有白名单里列到的表才会恢复,表对应的索引也会相应恢复
  2. String[] tables = new String[] {
  3. "t1", "t2" // 只恢复 t1 和 t2 两个表
  4. };
  5. RepairKit.MasterInfo master = RepairKit.MasterInfo.load('/path/to/database.db-mbak',
  6. BACKUP_PASSPHRASE, tables);

备份和恢复

备份完整数据,损坏后使用备份恢复的方案,如没有备份则无法恢复。由于是备份数据本身而不是 Schema,备份本身需要经常更新。备份和恢复操作都非常耗时,请勿在主线程操作,备份大数据库和恢复时可以考虑持有 Wake Lock。

备份

  1. RecoverKit recover = new RecoverKit(
  2. db, // 要恢复到的目标 DB
  3. BACKUP_PASSPHRASE // 加密备份文件的密钥,非 DB 密钥
  4. );
  5.  
  6. int result = recover.run(false); // fatal 参数传 false 表示遇到错误忽略并继续,
  7. // 若传 true 遇到错误则中止并返回 FAILED
  8. switch (result) {
  9. case RecoverKit.RESULT_OK: /* 成功 */ break;
  10. case RecoverKit.RESULT_CANCELED: /* 取消操作 */ break;
  11. case RecoverKit.RESULT_FAILED: /* 失败 */ break;
  12. }
  13. recover.release();

取消操作

由于备份和恢复都比较耗时,WCDB 提供接口中止备份或恢复操作。只需要在另外的线程调用BackupKit.cancel() 或 即可通知备份或恢复线程中止并尽快返回,返回码为 RESULT_CANCELED