有时 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
解决方法是rm -f /var/lib/rpm/__db*
然后下一个“yum”命令重新生成数据。
我的问题是:什么可能导致这种情况?是否有一些常见的任务忽略了锁或有其他导致这种情况的问题?
我们有数百台 CentOS 机器,没有任何模式可以看到这个问题。这可能是一个“百万分之一”的问题,在大范围内经常出现。
注意:我意识到这是一个非常“开放式”的问题,但如果答案找到了原因,我将返回并将问题转化为与特定问题直接相关的更规范的问题。
在一般情况下,当更新 rpmdb 时 rpm(或 yum)崩溃时会发生这种情况,rpmdb 是 Berkeley DB 键值存储,并且非常敏感。发生此类崩溃时,rpmdb 会处于不一致状态并发生此错误。中的所有其他文件都
/var/lib/rpm
包含相同的信息,但格式效率较低,因此数据库很容易重建。您可能在较旧的 CentOS 系统上看到的两个值得注意的错误可能会导致此问题。最大的一个,出现在变更日志中的“共享 mmap 页面写回中令人讨厌和微妙的竞争”,在 2007 年的内核更新中被悄悄修复。不过,这份报告的呈现方式与您的报告略有不同。
你可能会在 2009 年看到的那件事发生在 PackageKit 会在不合时宜的时候杀死 yum,并且也已修复。不过,这更有可能影响带有 GUI 的桌面系统或服务器。
所有这些错误都早于 EL 6,您几乎不会在 EL 6 或 7 上看到这种情况,如果您的 EL 5 系统是最新的,您也不应该看到它。(我不知道 EL 4。如果你有 EL 4,请在它传播之前杀死它。)也就是说,任何导致 yum 或 rpm 在使用 rpmdb 时死掉的东西都可能导致它。这包括你现在最有可能看到的东西,随机的宇宙射线翻转比特,或者有人对
kill -9
.在 RHEL 7 中,yum 在实际事务运行期间捕获更多信号,您将看到消息
(shutdown inhibited)
。这应该有助于防止大多数情况下有人或某事中断事务并导致此问题。