How does --rebuilddb work when the db is completely unreadable?

Stuart D. Gathman stuart at
Fri Jan 20 19:57:06 UTC 2017

On Fri, 20 Jan 2017, John Walker wrote:

> > It reads the data records, ignoring any indexes, and creates a new
> > database from scratch.  While reading the data records, it discards
> > those that fail basic sanity checks.
> I'm new to rpm internals.  When you say it reads the data records, which data records
> do you mean?  Records from the berkley database named "Packages?"  Records from several
> of the databases in the rpm database directory?  Something else entirely?  

Records from all files in the berkley database.  Most ISAMs
(indexed sequential access method), keep the raw data records in a
simple sequential format.  While interrupting updates may corrupt the
indexes, the data records are a dirt simple format like a text file
or psacct data.  In other database formats, it is possible to read the
database files sequentially (using read(2), *not* using the db access
libraries), extracting raw records which are tagged in each block for
extraction independent of the indexing.

> I feel like I'm misunderstanding something here, because if a rebuild must be able to
> read records from the current database, it wouldn't do much good if the current database
> is unreadable, however, I have found that rpm --rebuilddb does work when the

By "unreadable" do you mean that copying the database files with 'cp'
fails with an ioerr?  Or just that libdbX is unable to open and/or
read the database files?

 	      Stuart D. Gathman <stuart at>
"Confutatis maledictis, flamis acribus addictis" - background song for
a Microsoft sponsored "Where do you want to go from here?" commercial.

More information about the Rpm-list mailing list