indexeddb 无内置迁移备份机制,需手动遍历对象存储、序列化数据为 json/blob 实现导出;导入需在 onupgradeneeded 中读取旧数据、转换结构后写入新 store;可通过版本标记+独立备份库实现增量快照;注意事务生命周期、内存限制及二进制数据处理。

IndexedDB 本身不提供内置的数据迁移或备份导出机制,但可以通过遍历数据库、序列化数据并生成可持久化格式(如 JSON 或 Blob)来实现。关键在于手动控制事务、游标遍历和跨版本升级逻辑。
数据导出:遍历所有对象存储并序列化
导出本质是读取全部数据并转为标准格式(如 JSON 字符串),适合用户下载或存入其他存储系统。
- 打开数据库只读事务,对每个 objectStore 使用
openCursor()遍历所有记录 - 用
IDBKeyRange.all()确保获取全部条目,避免遗漏 - 将每条记录推入数组,最后
JSON.stringify()序列化;注意过滤掉不可序列化的值(如函数、undefined、循环引用) - 生成 Blob 并创建下载链接:
const blob = new Blob([jsonStr], {type: 'application/json'}); URL.createObjectURL(blob)
数据导入/迁移:按目标版本重建结构并写入
迁移常发生在 schema 升级后,需把旧版数据转换格式写入新版 store。不能直接复用旧数据,必须显式读取 → 转换 → 写入。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 在
onupgradeneeded中检查旧版本号,决定是否需要迁移逻辑 - 先用只读事务从旧 store 读取全部数据(同导出方式),再用 readwrite 事务写入新 store
- 若字段名或结构变化(如
userName→user.name),在写入前做字段映射转换 - 大容量数据建议分块处理(如每次 100 条),避免阻塞主线程或触发事务超时
增量备份与版本快照
IndexedDB 不支持时间点回滚,但可通过定期导出 + 版本标记模拟轻量备份。
- 导出时附带元信息:数据库名、版本号、导出时间戳、各 store 记录数
- 将备份 JSON 存入另一个 IndexedDB 数据库(如
backup_db),keyPath 设为时间戳,便于检索历史快照 - 恢复时,先删当前库(
indexedDB.deleteDatabase()),再按备份结构重建并导入数据
注意事项与限制
IndexedDB 的异步特性与事务边界容易引发常见问题,导出/迁移过程需特别留意。
- 游标遍历必须在事务活跃期内完成,事务结束则游标失效;不要在游标回调中开启新事务
- 导出大库时避免一次性加载全部数据到内存,改用流式拼接或分页导出
- 无法导出二进制数据(如 File、Blob)的原始内容,需用
arrayBuffer()或text()显式读取后再序列化 - 跨域或隐身模式下可能被禁用,导出前应检测
indexedDB.open是否成功
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










