今天遇到数据丢失,之前从未遇过,先记录一下。
关于损失
- 其实没啥损失,因为一开始就发现异常了。
- 其实一开始发现的异常并不是数据丢失,而是引用块功能的异常,当时本想稳定复现一下,到论坛来反馈。
- 随后发现这个异常只是表面现象,根本原因是数据异常。
使用场景
- 个人使用习惯有个文档页是当作工作日志记录内容的,所以几乎每天都在这个文档中更新内容。
- 有多设备同步需求,使用的是国内阿里云的 S3。
- 每次关闭 siyuan 的时候不会关闭所有页面,方便下次启用时不用专门去打开。
- 每次关闭会等到保存完毕,不会去强制关闭。
发现异常的过程
- 错误只存在于这个记录工作日志的文档,昨晚在家的电脑记录完内容后保存关闭。
- 今天在单位的电脑同步之后准备记录点内容。接着在昨天的内容末尾继续记录,(正在编辑的这个内容快我不确定是昨天创建的还是今天创建的了。)
- 操作习惯上我会使用【【然后输入文档名称的方式创建引用块,结果发现跟平常不一样,没有列出可能的引用的文档,也没有“新建文档 XXXX”的选项。而是一个意思是“没有找到相关内容”之类的提示,当时没有截图。
- 于是我尝试选择文本(昨天在家创建的同一天的不同内容块,后面会说为什么要提一嘴这个。)然后在浮动工具栏最左边的引用按钮创建块,也是一样的提示,因为平时通常习惯这样创建文档,一时之间不知道该怎么创建文档了,我以为这个功能砍掉了。
- 然后我别的已经开启的文档(几天前创建的)中尝试相同的操作是正常的,所以意识到这个文档出了问题,于是关闭了文档重新打开,记得刚才为了创建文档块输入的文本内容吗,那些内容已经消失了。
- 于是我开始排查问题,首先最开始发现问题的这个文档下的这个块我没有删除,我觉得删除了可能复现不了问题,然后重复多次尝试确定无法创建块,关闭文档再次开启文档后依然存在问题,于是关闭思源再次打开,问题依旧。
- 由于为了保护”现场“,发现异常后我没在该文档块编辑过其他内容,异常发现前本日也没编辑过内容。
- 然后我去查看数据历史,找文件历史,搜索这个文档,没有找到当日的记录,也就是说。结合关闭文档后重新打开文档那个块的文本就丢失的现象来看,其实文本一开始没有成功插入过 SqlLite。这就能解释为什么既不能创建对别的内容的引用也没提示创建文档,而是提示”找不到相关内容“之类的,因为选中的内内容是 null 值。但是这解释不了为什么”昨天在家创建的同一天的不同内容块“选中后浮动框也无法引用别的文档和创建文档。这部分内容能在页面关闭后重新打开还能存在说明肯定是在数据库中的。
- 随后我看能不能提交这个库给开发者研究一下,于是去将我家里电脑的那个库的 data 文件夹直接复制过来到公司的电脑上打开。(因为配置了同步的原因,我如果直接在家里电脑打开思源再导出 data 的话,会因为开启的同时就进行同步了,可能会源数据被改变,所以选择直接复制 data 文件夹。)遗憾的是新创建的库中的这个块并没有问题,可能是本地重新创建了索引导致的,或者家里电脑的那个库本来就没有问题,问题是在同步到单位电脑之后产生的,这不得而知了。
- 前面提到”昨天在家创建的同一天的不同内容块“也无法引用别的文档和创建文档,这是因为随后我尝试在同一文档块选中以往(前几天)的内容看是否能够引用或创建文档,结果居然可以。
- 但是这个操作把前面提到的异常”修复“了,回到原本发现异常的内容块执行相同的操作,已经无法复现之前的问题。再次查看文件历史,这时候能发现这个文档块有文件历史记录了。
- 那没有办法了,为了复现问题,只好尝试回滚快照了,我回滚到了早上异常发生之前,但是也没有办法复现了。
可能有帮助的信息
最初出问题的块:
{"ID":"20240322004006-cy6tdmm","Type":"NodeListItem","ListData":{"BulletChar":42,"Marker":"Kg=="},"Properties":{"id":"20240322004006-cy6tdmm","updated":"20240322145143"},"Children":[{"ID":"20240322004006-t6uui34","Type":"NodeParagraph","Properties":{"id":"20240322004006-t6uui34","updated":"20240322145143"},"Children":[{"Type":"NodeText","Data":"【【调试"}]}]}]},
根据以上信息,查看了日志,多次提示到找不到这个块:20240322004006-t6uui34(UI 没有提示。)然后用 AI 总结了一下今天的运行日志:
- 系统启动和配置: 日志记录了应用程序的启动,包括版本信息、操作系统(Windows 11 Pro)、处理器 ID、运行模式、工作目录、数据库版本等信息。
- 网络代理使用: 使用系统网络代理进行通信。
- 文件同步: 记录了本地与云端的文件同步过程,包括文件数量、大小和最新的更新时间。同步过程中,日志显示了文件的上传和下载活动。
- Pandoc 初始化: 初始化了内置的 Pandoc 工具,这可能是用于文件转换的工具。
- 磁盘使用情况: 记录了磁盘的总空间、已用空间和剩余空间。
- 异常情况 - 未找到的块: 日志中出现了多条“未找到块”的警告(例如:
not found block [20240322004006-t6uui34]
),这可能表示系统尝试访问或处理不存在的数据块。这些记录表明可能存在数据一致性问题或引用了已被删除或尚未同步的数据。 - 重复索引的警告: 日志中还记录了多条有关重复索引的警告(例如:
exist more than one ref duplicated [20240220104328-bzicm49], reindex it
),指出了多个重复引用的存在,并提示需要重新索引。这可能表明索引管理或数据完整性方面的问题。
如果开发者需要今天的完整运行日志的话,我可以发邮件。
写在最后
- 由于没有截图,也无法提供能复现问题的文档文件了,所以即便详细描述了整个过程,开发者要排查这个 bug 我相信还是很困难的。
- 由于使用习惯的问题,及时发现异常所以没有造成任何损失无疑是幸运的。
- 这个问题看起来和时间属性有一定关系。
- 这种 BUG 真的很无解,文件历史没有记录,恢复快照也没用,所以丢了就是丢了,没有任何办法。
- 关于网络代理,直连。
- 所以无论使用什么工具,个人还是要做好数据备份的工作。
- 当时排查异常时唯一留下的截图,该文档是不存在今天的历史的。
- 补充一个示意图,异常情况下,那个选择框不是”新建文档“,而是”未找到相关内容“。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于