可能只有一点切换,所以我的文件显示的是字母“ Q”而不是“ S”


22

在我们的应用程序中,我们使用Hibernate和PostgreSQL来存储数据。在我们的一个数据库表中,有一个“ discriminator”列,例如“ TIPPSPIEL”。它是固定的字符串,任何用户都不能操纵。

突然,我们在这个巨大的表中有了一个条目,其中的位置是“ TIPPQPIEL”而不是“ TIPPSPIEL”。我们不知道如何发生。

是否有可能以某种方式我们的硬盘正在切换一位,所以我们的字母“ S”不再编码为“ 1010001”,而是突然在硬盘上变成了“ Q”,并且切换了一位:1010011?

我不是硬盘专家,但是我想操作系统或磁盘上要有校验和和其他东西,以确保不会发生这种情况。

可能只有一点切换就可以使我的文件显示字母“ Q”而不是“ S”吗?

更新:我们进行了进一步的分析。我们的从数据库从主数据库获取其WAL记录(PostgreSQL功能)。无论如何:我们的从属服务器应该同步。但是从机在这一特定行上并没有同步。我们可以看到它发生在几天前,而用户对此特定条目没有任何交互。因此,它必须有点翻转。害怕!


我宁愿认为这是由错误的内存引起的。编写该列时,您是否还有日志?
ott--

1
它不太可能但有可能在运输途中以很高的规律性翻转,请参见“抢注”
Sirch

Answers:


10

非常罕见,我们在此站点上看到一个真正有趣的问题,因此首先谢谢您。

我认为您看到的确实存在一个单位错误,您可以发现它确实是个好消息,但您假设第二个最低有效位已被切换(假设您使用的是ASCII)是正确的。无论如何)。

至于校验和等,当它写入磁盘时,很可能已经过验证-我很确定此问题是由于一个简单的磁泄漏错误而引起的。但是您是对的,已经完成了编码检查,制造商对此有所不同,但是在某个地方说“这看起来有些奇怪”时可能会出现错误-但是您的IO链有哪些可用选项?否认你整个块?我将假设这是一个非RAID磁盘,因为当RAID磁盘检测到错误时,它们往往具有更多可用选项。

这很奇怪,尽管这种事情在世界范围内可能每秒发生多次。


1
没错,在这种情况下,它是非RAID磁盘设置。正如我的进一步分析所显示的,它是在记录被写很久之后发生的。
2013年

1
如果我以系统管理员身份工作20年,我已经看到3次单次翻转的情况。其中只有一个可以证明为100%。其他2个被怀疑是翻转位,我们无法确定。(读取文件后,位可能会翻转到内存中。当我们注意到差异时,原始文件不再可用或已被触摸。我敢肯定,它发生的频率比每个人都想像的多,但是很少有人注意到并且通常无法证明,如果注意到的话
Tonny

1
如果驱动器出现不可纠正的错误,则整个驱动器读取操作将失败。扇区的用户数据部分仅发生一次翻转是不可能的,并且不会被检测到。当该位写入磁盘时,该位必须已经翻转。
psusi 2013年

这个问题应该规范吗?
鹿猎人(

@psusi并非不可能,因为您只需要在扇区中进行足够的位翻转即可使ECC正确显示。磁盘制造商不可能(但有可能)引用足够高的错误率,您确实应该期望看到一些错误率。我听说有传言说ZFS员工可以看到它们(由于ZFS级别的数据校验和)...
derobert
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.