RPM DB 修复

2016-12-01 linux devops command

在一些 Linux 的发行版本中,例如 CentOS、SUSE 中,会采用 RPM 来管理软件包,不过在使用过程中,经常会出现由于各种各样的原因导致 RPM DB 被损坏。

这里简单介绍一下其修复方法。

简介

RPM 会使用自己的 DB 保存元数据,经常在宕机、kill -9 时会损坏 DB ,那么就可能会导致已经安装的包丢失、更新 RPM 被 hang 住、查询包信息失败,失败信息一般如下。

rpmdb: /var/lib/rpm/Packages: unexpected file type or format
error: cannot open Packages index using db3 - Invalid argument (22)
rpmdb: Thread/process 14357/139885775857408 failed: Thread died in Berkeley DB library
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
rpmdb: Thread/process 14357/139885775857408 failed: Thread died in Berkeley DB library
error: db3 error(-30974) from dbenv->failchk: DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages database in /var/lib/rpm

修复过程

接下来需要着手进行修复。

1. 首先确保没有RPM进程
# ps -ef | grep -i rpm

在修复时,如果存在其它进程同时在使用,那么可能会同样导致失败,如果有必要可以通过 kill -9 关闭进程。

2. 删除锁文件
# rm -rf /var/lib/rpm/__db*
# /usr/lib/rpm/rpmdb_verify Packages

删除存留的锁文件,并校验 DB 是否有损坏,此时就可以检查 RPM 相关的命令是否可以执行。

3. 备份 RPM 数据库
# cd /var/lib
# mkdir rpm-backup
# rsync -av ./rpm/. ./rpm-backup/.
4. 重新构建 RPM 数据库
# rpm -vv --rebuilddb > /tmp/rpmrebuilddb.log 2>&1
5. 最后重新校验
# /usr/lib/rpm/rpmdb_verify /var/lib/rpm/Packages

参考

RPM Database Recovery 官方提供的修复方案。