在我们的应用程序中,我们使用 Hibernate 和 PostgreSQL 来存储数据。在我们的一个数据库表中,我们有一个鉴别器列,例如“TIPPSPIEL”。它是一个固定字符串,任何用户都无法操纵。
突然,我们在这张巨大的表中发现了一条记录,其中的“TIPPQPIEL”被替换成了“TIPPSPIEL”。我们不知道这是怎么发生的。
有没有可能我们的硬盘正在切换一位,所以我们的字母“S”不再被编码为“1010001”,而是突然在硬盘上变成“Q”,并且一位被切换了,如下所示:1010011?
我不是硬盘方面的专家,也不懂一点物理知识,但我猜操作系统或磁盘有校验和和其他东西来确保这种情况不会发生。
是否有可能仅发生一位切换,所以我的文件就会显示字母“Q”而不是“S”?
更新:我们做了进一步分析。我们的从属数据库从主数据库获取其 WAL 记录(PostgreSQL 功能)。无论如何:我们的从属服务器应该同步。但从属服务器对于此特定行不同步。我们可以看到它发生在几天前,而用户对此特定条目没有任何交互。所以它一定有点翻转。可怕!
答案1
我们很少在这个网站上看到真正有趣的问题,所以首先感谢您。
我认为您看到的确实是一个单比特错误,说实话您能发现它真是太神奇了,但您正确地假设第二最低有效位已被切换(假设您使用的是 ASCII)。
至于校验和等,当它被写入磁盘时,很可能已经被验证为正常 - 我很确定这个问题是后来通过简单的磁泄漏错误而产生的。但你是对的,已经进行了编码检查,它因制造商而异,但可能存在错误某处说“这看起来有点奇怪” - 但你的 IO 链有什么可用的选项?拒绝整个块?我假设这是一个单个非 RAID 磁盘,因为 RAID 磁盘在检测到错误时往往有更多可用选项。
这是一个奇怪的事情,但这种事情在世界各地每秒可能都会发生多次。