终极指南数据库腐败虽然我写这篇文章是一个PostgreSQL DBA,任何人都可以读到这个页面,因为腐败是相同的在每个数据库的概念。

读完这篇文章时,我们应该了解什么是数据库损坏,以及它如何可能发生。

dba,腐败是我们不想见到的东西在我们的系统;然而,有许多系统腐败再次使用非常频繁。当它发生在大数据库,对我们来说具有挑战性的检测和修复我们可以看到没有它的迹象。在我15年经验的DBA,我认为腐败是最艰难的螺母裂纹,因为表面上任何腐败的原因实际上是不可以预测的。换句话说,我们可能不知道这个问题的真正原因;因此,它是非常困难的RCA。

在这个系列的博客,我要覆盖各种类型的腐败和方法来找到并修复它们。

这篇文章将把一些基本的数据库损坏。

概念和类比

以一个简单的方式来解释它,我将西班牙语的一个例子。下图中的文本。

在这里,上面的文字是用西班牙语。对于那些不懂西班牙语,有可能为他们读吗?简单的答案是“不”。

有人会问“怎么可能一个人没有知识的西班牙读吗?”。结束的好奇心,图像用英语写着“再见”。

同样的事情也发生在软件产品。所有软件编程读和写在自己的预定义的格式,它可能无法在其他格式,支持其他软件产品。例如,Python代码不能编译或阅读,或执行,在C语言中,Java或Perl。

在数据库中,它是关于格式的数据存储在磁盘上。当一个数据库产品,如PostgreSQL, MySQL,或MongoDB,写到磁盘上,它使用某种格式执行操作。

在阅读从一个磁盘,数据库产品预计相同的格式;任何部分的数据在磁盘上,不是在一个适当的格式是腐败。

总结,腐败只是一个格式或不当的序列数据。

它是如何发生的?

正如在上一节中提到的,腐败是一个不可读数据格式的结果。我们知道,数据存储在磁盘上的比特的形式。现在,在整数或数字的情况下,转换是很简单的。但对于字符,每台机器的目的是将数据字节的形式,这是一群八个比特,这样每一个字节代表一个字符。每个字节的有256个不同的组合,从00000000 (0)00000000 (255)。

读取字节的字符,有些格式设计,如ASCII、EBCDIC、BCD,等等。他们也被称为编码方案。所有这些计划,ASCII(美国标准信息交换)更受欢迎。在这种格式中,每个字节(所有256种组合)被分配一个特定的角色。

就像,

01000001 (65)-

00101100 (44),

下面是链接来查看所有的ASCII码。

https://www.rapidtables.com/code/text/ascii-table.html

这里,如果任何字节存储一个意想不到的比特序列,机器就会读不同的字符。

例如,

假设字符一个(65)被存储为11000001(193),而不是11000001 (65),“一个”(不是英文字母)。

现在,在这些提到的编码方案,一些人物是人类可读的,其余的不是。但是,需要注意的另一点是,所有的软件产品的目的,不是为了破译所有的人物。所以,在任何情况下,如果一个字节在任何位置会发生改变,有可能是数据库可能无法读取字符,因此数据。那些不可读或non-parsable数据视为损坏数据。

例如,

以防你好吗?存储为你害怕、性格中可用“害怕”不是英语,因此那些只能解析英语字符集可能无法认识到性格。所以,它将无法阅读文本和抛出一个错误标记它不可读。在这里,只有一个字符是面目全非,但整个文本将被标记为损坏数据。

原因

它真的是神秘的,因为我们可能永远不会知道的实际原因任何形式的腐败。正如我上面提到的,腐败是归因于比特/字节的变化,但真的很难让它特定的进程/线程导致这一变化。这就是为什么任何测试用例相关的腐败实际上并不是可重复的。我们唯一能做的就是探索可能的原因。

一些可能的原因如下。

硬件问题:

当RAID磁盘设计不当或控制器故障,它可能无法正确写入数据磁盘。在raid磁盘,机械设备应正常工作,因为比特存储不当是由于错误的磁盘。

腐败也可能出现由于沉重的I / o。

错误的操作系统:

场合,由于车内核或代码,系统编码数据错误,后来写入磁盘。场合,操作系统产生的数据虽然是stem I / o效率低下。

错误的数据库产品:

在许多情况下,产品本身有时商店里错误的磁盘上的数据,或者由于低效算法,它在错误的格式保存数据。

类型的腐败

每个数据库都包含不同类型的文件,如数据文件、WAL文件,提交日志,等等。这些文件包含的数据对各种数据库对象,如表、索引、物化视图,WAL记录,等。当这些数据库文件去腐败,一些查询检索错误数据或返回错误,或一些操作(如。复苏,重播)可能不会像预期的那样工作。作为一名DBA,需要识别哪些对象是由于腐败的影响。为了便于理解,腐败是分为不同的类型;其中有一些是如下。

腐败指数:

一般来说,索引使指针(s)为特定值(或一组值)在一个列中。每当一个索引被要求返回指针(ctid PostgreSQL, rowid Oracle),获取这些指针并将它们返回给请求者。

在腐败的情况下,错误的指针保存在磁盘上的任何值由于错误的位在磁盘上。因此,它返回一个错误的记录。

数据损坏:

当数据/面包页面错误的数据存储(格式)而言,它读取相同的数据时可能会变得面目全非。因此,他们得到错误的数据库。

细胞膜腐败:

细胞膜/重做/事务日志文件存储数据在一个特定的格式,并在阅读他们,WAL条目解析和应用。对于WAL腐败,影响细胞膜的WAL条目不解析,回复操作。

页眉的腐败:

存储在数据库块的最低单位/页面,这实际上存储实际的记录。为了维护数据完整性,一些信息存储在一个单独的部分,被称为“页眉”。任何不当的信息在一个页眉标题腐败。这影响了数据的完整性。

总结

腐败比特/字节变化的结果,同时将数据存储在磁盘上。当一个数据库产品(例如MySQL、PostgreSQL)没有得到预期中的数据格式,这是腐败。

数据库中的数据可能会由于各种原因损坏,如错误的硬件和车操作系统内核/数据库产品。由于这一点,数据不小心改变了之前存储在磁盘上。虽然错误地存储在磁盘上,因此文件,它影响软件产品的各种功能;轻松地了解特定地区受到影响,腐败是分为不同类型,如腐败指数,数据损坏,等等。

这是本系列的第一篇文章的数据库损坏博客;其他博客很快就会发布。请继续关注!

订阅
通知的
客人

3评论
最古老的
最新的 大多数投票
内联反馈
查看所有评论
费尔南多事项

非常有趣的帖子,Ninad,路要走!

Abdul细哔叽

有趣的和有用的帖子。使用上面的细节,我们可以避免/防止DB腐败和克服这些腐败问题。