After a failed
yum update I was no longer able to run
yum. I received errors that culminated in:
Error: rpmdb open failed
Back up the rpm directory with something like
tar -czvf /var/lib/rpm.bak /var/lib/rpm/
Then use the Berkeley DB tools
db_load to reload the
$ mv /var/lib/rpm/Packages /var/lib/rpm/Packages.borked
$ db_dump -f /var/lib/rpm/Packages.borked /var/lib/rpm/Packages.dump
$ db_load -f /var/lib/rpm/Packages.dump /var/lib/rpm/Packages
The Long Story (and alternative fixes)
When attempting to do pretty much anything with
yum, such as
yum update or
yum-complete-transaction, I would receive a rather nasty looking error:
error: rpmdb: BDB0113 Thread/process 8630/140300564338496 failed: BDB1507 Thread died in Berkeley DB library error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery error: cannot open Packages index using db5 - (-30973) error: cannot open Packages database in /var/lib/rpm CRITICAL:yum.main: Error: rpmdb open failed
These errors were preceded by an attempt to simply
yum update install -y a CentOS 7 machine, however the update failed because the kernel oomkilled the yum process. As a result, the rpm database was a bit unhappy.
Packages file is a Berkeley DB database, so the first thing I did was checked the file with
db_verify /var/lib/rpm/Packages. Oddly, it appeared to be fine.
$ db_verify /var/lib/rpm/Packages BDB5105 Verification of /var/lib/rpm/Packages succeeded.
Attempting to recover the database was of no use since there were apprently no log file to replay:
$ db_recover -fv
BDB2525 No log files found
Another trick is to dump and reload the database.
db_dump has a few options to consider. Most notably
-R — both used for recovery, one being more aggressive than the other. Check man pages for more info.
$ mv /var/lib/rpm/Packages /var/lib/rpm/Packages.borked $ db_dump -f /var/lib/rpm/Packages.borked /var/lib/rpm/Packages.dump $ db_load -f /var/lib/rpm/Packages.dump /var/lib/rpm/Packages
In my specific case, that did the trick, however there were some possible options that remained for me:
db_dump itself has
-R options for recovery from a corrupted database file. I’d strongly suggest 1) Having a backup of the
Packages file (and a backup of the backup), and 2) Reading the man page for
db_dump a few times to have a basic idea of what each flag is going to do.
Another option would be to completely rebuild the RPM database with