修复方法简介
关于不同修复方法的详细介绍,请参照 《公众号文章》
Repair Kit
使用 Repair Kit 可以直接从损坏的数据库里尽量读出未损坏的数据,不需要事先准备,但是先备份 Master 信息可以大大增加恢复成功率。 如果有意使用 Repair Kit 恢复数据库,建议备份 Master 信息。
Repair Kit 使用范例,请参照 sample-repairdb
。
备份 Master 信息只需要调用 RepairKit.MasterInfo.save(…)
即可。备份 Master 信息典型消耗为几kB ~ 几十kB,几毫秒 ~ 几十毫秒,但如果你有非常非常多的表和索引(万数量级),这个过程可能会有点慢,建议放在子线程完成。
恢复损坏数据库
恢复损坏数据库,首先加载之前备份的 Master 信息(如果有)。
- RepairKit.MasterInfo master = RepairKit.MasterInfo.load('/path/to/database.db-mbak',
- BACKUP_PASSPHRASE, null);
- // 加载不成功,可能是不存在或者损坏
- }
使用 RepairKit
打开损坏的数据库,使用 打开新的数据库,调用 output(…)
即可将损坏数据库的内容转移到新数据库。
Repair Kit 可以只恢复一部分表,只需要在 MasterInfo.load(…)
或者 MasterInfo.make(…)
里指定白名单即可。
- // 白名单,只有白名单里列到的表才会恢复,表对应的索引也会相应恢复
- String[] tables = new String[] {
- "t1", "t2" // 只恢复 t1 和 t2 两个表
- };
- RepairKit.MasterInfo master = RepairKit.MasterInfo.load('/path/to/database.db-mbak',
- BACKUP_PASSPHRASE, tables);
备份和恢复
备份完整数据,损坏后使用备份恢复的方案,如没有备份则无法恢复。由于是备份数据本身而不是 Schema,备份本身需要经常更新。备份和恢复操作都非常耗时,请勿在主线程操作,备份大数据库和恢复时可以考虑持有 Wake Lock。
备份
- RecoverKit recover = new RecoverKit(
- db, // 要恢复到的目标 DB
- BACKUP_PASSPHRASE // 加密备份文件的密钥,非 DB 密钥
- );
- int result = recover.run(false); // fatal 参数传 false 表示遇到错误忽略并继续,
- // 若传 true 遇到错误则中止并返回 FAILED
- switch (result) {
- case RecoverKit.RESULT_OK: /* 成功 */ break;
- case RecoverKit.RESULT_CANCELED: /* 取消操作 */ break;
- case RecoverKit.RESULT_FAILED: /* 失败 */ break;
- }
- recover.release();
取消操作
由于备份和恢复都比较耗时,WCDB 提供接口中止备份或恢复操作。只需要在另外的线程调用BackupKit.cancel()
或 即可通知备份或恢复线程中止并尽快返回,返回码为 RESULT_CANCELED
。