Erlang Mnesia 数据丢失(并未真正丢失,只是索引丢失)

简介: 从 Ejabberd开源项目中了解到了 Mnesia的用法,之后好多长一段时间都用 Mnesia 设计分布式缓存。前段时间系统上线没有出现问题,过了一段时间发现用户登录出现异常(总结发现都是用户切换网络时候出现)发现用户或设备数据丢失

Mnesia 数据丢失(并未真正丢失,只是索引丢失)

用Mnesia构建的 ws_session,数据读写都有用了dirty操作。

系统刚上线没有出现问题,过了一段时间发现用户登录出现异常(总结发现都是用户切换网络时候出现)。进一步分析发现数据不同步了,例如根据 mnesia:dirty_index_read(ws_session, 2, id) 查数据总是查出空,偶尔在节点上查到数据(后来发现是根据 Key),起初误以为集群节点数据不同步。多次试验后发现 index查不到数据,key 能查到数据,得出结论是索引丢失了,百思不得其解,进一步了解发现是mnesia:dirty_delete_object删除时候只删除了索引,没有删除数据。

原来delete_object时候原来record 已被修改过了,才导致此次删除数据时只删除了索引,现在看上去比较合理,毕竟只丢失了索引。

但是更让人意外的是即使数据重写也不会再生成索引了,必须先根据 Key 把数据删除。

解决方案,删除数据的时候避免采用 delete_object,改为直接根据 Key 删除。查询数据时,先根据索引查询数据,若发现有索引丢失,立马根据 Key 把数据删除,重新生成一份数据,这样才能保证生成索引。

手册中有明确的解释:

delete_object(Tab, Record, LockKind) -> transaction abort | ok 

If a table is of type bag, it can sometimes be needed to delete only some of the records with a certain key. This can be done with the function delete_object/3. A complete record must be supplied to this function.

The semantics of this function is context-sensitive. For details, see mnesia:activity/4. In transaction-context, it acquires a lock of type LockKind on the record. Currently, the lock types write and sticky_write are supported.
目录
相关文章
|
5月前
|
消息中间件 存储 缓存
写入内容丢失,各种数据库或者存储系统如何处理?
写入内容丢失,各种数据库或者存储系统如何处理?
67 0
|
3月前
|
存储 安全 数据挖掘
服务器数据恢复—异常断电导致EVA存储中RAID信息丢失的数据恢复案例
意外断电导致raid硬件损坏或者riad管理信息丢失等raid模块损坏而导致数据丢失的情况非常普遍。正常情况下,磁盘阵列一旦创建完成就不会再对管理模块中的信息进行更改,但是raid管理模块中的信息属于可修改信息,一次或多次的意外断电可能会导致这部分信息被篡改或丢失。断电次数过多甚至会导致raid卡上的元器损坏。
|
2月前
|
算法 Shell
数据魔术师:如何在ClkLog中恢复丢失数据并实现数据更新
​ 在数字化的世界里,数据就是企业的血液,是推动业务发展的关键动力。想象一下,你正在运行你的业务,依赖ClkLog为你提供的数据,突然,由于网络波动或其他原因,定时脚本未能执行,页面上的数据缺失了。或者你刚刚优化了你的算法,但你需要重新计算以前的数据以便与新的算法保持一致。这种情况下,数据的完整性和稳定性就显得尤为重要,它们不仅影响业务的正常运行,而且直接关系到业务决策的准确性和及时性。
数据魔术师:如何在ClkLog中恢复丢失数据并实现数据更新
|
2月前
|
存储 安全 文件存储
【服务器数据恢复】Apple苹果Xsan文件系统卷宗误操作导致文件丢失数据恢复案例
客户因误操作删除了macOS服务器上的重要图片和视频文件,需紧急恢复。Xsan文件系统作为苹果专为高负载环境设计的64位簇文件系统,在未有专门恢复工具的情况下,常规RAW恢复仅能提取小部分连续存储的小文件,且无目录结构。通过专业的数据恢复流程,包括安全挂载、阵列重组,并使用专用工具解析文件系统以恢复目录结构,最终成功恢复丢失的文件。此案例突显了Xsan文件系统的特点及其恢复难度。
31 1
|
2月前
|
运维 Ubuntu Linux
备份以免丢失
备份安装docker-ce
|
3月前
|
存储 数据挖掘 Linux
服务器数据恢复—服务器重装系统导致原分区丢失的数据恢复案例
服务器数据恢复环境&故障: 磁盘柜中有一组通过RAID卡创建的RAID5阵列,分配一个LUN,服务器上层安装Linux操作系统。操作系统层面划分sdc1和sdc2两个分区。通过LVM扩容的方式将sdc1分区加入到了root_lv中;sdc2分区格式化为XFS文件系统。 服务器重装操作系统后,磁盘分区改变,sdc2分区丢失,无法访问。
服务器数据恢复—服务器重装系统导致原分区丢失的数据恢复案例
|
5月前
|
存储 数据挖掘 Windows
服务器数据恢复—异常断电导致raid信息丢失的数据恢复案例
由于机房多次断电导致一台服务器中raid阵列信息丢失。该阵列中存放的是文档,上层安装的是Windows server操作系统,没有配置ups。 因为服务器异常断电重启后,raid阵列可以正常使用,所以未引起管理员的注意。后续出现的多次异常断电导致raid报错,服务器无法找到存储设备,进入raid管理模块进行任何操作都会导致操作系统死机。管理员尝试多次重启服务器,故障依旧。
从堆里找回“丢失”的代码相关命令简介
从堆里找回“丢失”的代码相关命令简介
从堆里找回“丢失”的代码
从堆里找回“丢失”的代码
|
安全 关系型数据库 MySQL
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
118 0