![为何 yum 索引会损坏?](https://linux22.com/image/638484/%E4%B8%BA%E4%BD%95%20yum%20%E7%B4%A2%E5%BC%95%E4%BC%9A%E6%8D%9F%E5%9D%8F%EF%BC%9F.png)
有时 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 机器,但这个问题没有固定的模式。这可能是“百万分之一”的问题,在大规模情况下经常出现。
注意:我意识到这是一个非常“开放式”的问题,但如果答案找到了原因,我会回过头来将问题转变为与具体问题直接相关的更规范的问题。
答案1
一般情况下,这种情况发生在 rpm(或 yum)在更新 rpmdb 时崩溃时,rpmdb 是 Berkeley DB 键值存储,非常敏感。发生此类崩溃时,rpmdb 将处于不一致状态,并发生此错误。所有其他文件都包含/var/lib/rpm
相同的信息,尽管格式效率较低,因此数据库很容易重建。
您可能在旧 CentOS 系统上看到过两个值得注意的错误,它们可能会导致这种情况。大的那个,正如变更日志中显示的那样,“共享 mmap 页面写回中存在严重且微妙的竞争”,在 2007 年的内核更新中悄悄修复了。 这个呈现方式略有不同比你的报告更糟糕。
这你可能会在 2009 年看到当 PackageKit 不合时宜地杀死 yum 时,就会发生这种情况,并且也已修复. 但这更有可能影响带有 GUI 的桌面系统或服务器。
所有这些错误都早于 EL 6,你应该几乎在 EL 6 或 7 上永远不会看到这种情况,如果您的 EL 5 系统是最新的,您也不应该看到这种情况。(我不知道 EL 4。如果您有一个,请在它传播之前将其杀死。)话虽如此,任何事物导致 yum 或 rpm 在使用 rpmdb 时死机的原因可能是这些原因。这包括您最近最有可能看到的情况,随机宇宙射线翻转比特,或者某人对 过于热心kill -9
。
在 RHEL 7 中,yum 在实际事务运行期间会捕获更多信号,您将看到消息(shutdown inhibited)
。这应该有助于防止大多数情况下某人或某事中断事务并导致此问题的情况。