这个坑值得记一笔。lancedb 0.13 打开 0.9 版本写的表,报 lance error: Not found,路径指向 _versions 下的 manifest 文件,降回 0.9 就能读,表存放在 S3。
刚开始盯着「并发写产生了新版本,旧进程读到半成品」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。表格式版本升级后与旧 SDK 不兼容;对象存储里的 manifest 没有同步过来;本地缓存了旧元数据。
上来先确认 SDK 版本和表的格式版本
python -c "import lancedb;print(lancedb.__version__)"
然后备份表目录后再用新版本打开
aws s3 sync s3://bucket/kb.lance ./backup/kb.lance
接着用迁移脚本重写一份新表
python migrate_lance.py --src s3://bucket/kb.lance --dst s3://bucket/kb_v2.lance
末了切换前抽样比对行数和主键
python compare_tables.py --a kb.lance --b kb_v2.lance --sample 100
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
怎么算真的好了,看的是同一批现象。新版本能稳定打开新表,行数与主键校验一致,写入和查询都不再报 manifest 缺失。
列式向量库的表格式变动比较频繁,跨版本读写要做灰度,直接在原表上升级一旦失败很难回退,先复制一份更安全。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
