为数百万用户动态修复数据库

主要观点:

  • 讲述一款被数十亿用户使用的消息应用程序,遵循强隐私模式,用户数据不在服务器留存,通信端到端加密。
  • 安卓用户常卸载重装应用,为防止丢消息,消息备份到用户 SD 卡,因 SD 卡为公共存储空间,备份需加密。
  • 突然出现用户抱怨消息恢复失败,虽有内部指标确认但需样本调试,样本加密正常但 SQLite 数据库损坏,包括主键约束违反和错误 Unicode 字符等,低端安卓手机易出现数据库损坏。
  • 通过反复阅读 SQLite Shell 手册,发现可将数据库转储为忠实重现数据库的 SQL 命令序列,最终决定牺牲少量坏消息以恢复其他所有消息,通过识别并删除坏行来实现,流程为用户先尝试正常恢复,失败后进行一系列操作,如使用 SQLite Shell 转储和恢复数据库,且该修复层代码约 200 行已安装在数十亿设备上。

关键信息:

  • 应用程序的隐私模式和数据存储方式。
  • 安卓用户的行为及消息备份机制。
  • 数据库损坏的情况及表现。
  • 解决数据库损坏的方法和过程。

重要细节:

  • Android 安全模型中 SD 卡为公共存储空间。
  • 数据库损坏在低端安卓手机上较常见。
  • 通过 SQLite Shell 手册找到解决办法,如使用.bail off命令。
  • 最终修复过程的具体步骤和代码片段。
  • 修复后对数据库的测试结果,大部分用户仅丢失少量消息且大部分数据库得以恢复。
阅读 14
0 条评论