为什么 yum 索引会损坏?

Tom*_*ime 10 centos yum rpm data-consistency

有时 yum 的缓存会损坏,我们会看到如下错误:

error: db3 error(-30974) from dbenv->failchk: DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db3 -  (-30974)
error: cannot open Packages database in /var/lib/rpm
Run Code Online (Sandbox Code Playgroud)

解决方法是rm -f /var/lib/rpm/__db*然后下一个“yum”命令重新生成数据。

我的问题是:可能导致这种情况的原因是什么?是否有一些常见的任务会忽略锁或有其他问题导致这种情况?

我们有数百台 CentOS 机器,没有任何模式可以看出这个问题。这可能是一个“百万分之一”的问题,经常看到大规模的问题。

注意:我意识到这是一个非常“开放式”的问题,但是如果答案找到了原因,我将返回并将问题变成与特定问题直接相关的更规范的问题。

Mic*_*ton 6

在一般情况下,这种情况发生在更新 rpmdb 时 rpm(或 yum)崩溃,这是一个 Berkeley DB 键值存储,非常敏感。当发生这样的崩溃时,rpmdb 处于不一致的状态并发生此错误。中的所有其他文件都/var/lib/rpm包含相同的信息,尽管格式效率较低,因此很容易重建数据库。

您可能在较旧的 CentOS 系统上看到的两个显着错误可能导致此问题。最大的问题是“共享 mmap'ed 页面写回中令人讨厌和微妙的竞争”,它出现在变更日志中,在 2007 年的内核更新中悄悄修复。不过,这份报告本身与您的报告略有不同

您可能会在 2009 年看到的那个发生在 PackageKit 在不合时宜的时候杀死 yum 时,并且也被修复了。不过,这更有可能影响带有 GUI 的桌面系统或服务器。

所有这些错误都早于 EL 6,您几乎不会在 EL 6 或 7 上看到这种情况,如果您的 EL 5 系统是最新的,您也不应该看到它。(我不知道 EL 4。如果你有一个,在它传播之前杀死它。)也就是说,在使用 rpmdb 时任何导致 yum 或 rpm 死机的东西都可能导致它。这包括你现在最有可能看到的东西、随机宇宙射线翻转位,或者有人对kill -9.

在 RHEL 7 中,yum 在实际事务运行期间捕获更多信号,您将看到消息(shutdown inhibited)。这应该有助于防止某人或某事中断事务并导致此问题的大多数情况。

  • 我敢打赌,问题是过度使用“kill -9”。谢谢! (2认同)