RPMデータベースを再構築する|rpm --rebuilddb で「rpmdb open failed」を復旧する完全手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, RPM, システム管理 > RPMデータベースを再構築する|rpm --rebuilddb で「rpmdb open failed」を復旧する完全手順

この記事のポイント

・rpm --rebuilddb でRPMデータベースを安全に再構築できる
・実行前に /var/lib/rpm を必ずバックアップする
・rpm -qa の応答停止や「db5 error」「rpmdb open failed」が再構築の合図
・RHEL 9 / Rocky Linux 9 / AlmaLinux 9でも同じ手順で通用する

「dnf installしようとしたら rpmdb open failed と出てパッケージが入らない」
RPM系ディストロを長年運用していると、いずれ一度はRPMデータベース破損に遭遇します。yum / dnfの裏で動いているRPM DBが壊れると、インストール・更新・削除のすべてが止まります。

この記事では、RPMデータベースを再構築する方法を、rpm --rebuilddbコマンドの基本動作と前後のバックアップ手順、よくあるトラブル対処までまとめて解説します。RHEL 9 / Rocky Linux 9 / AlmaLinux 9 / CentOS Stream 9で動作確認済みです。

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜRPMデータベースの再構築が必要になるのか

RPMデータベースは /var/lib/rpm 配下にBerkeley DB(RHEL 7まで)またはsqlite(RHEL 9以降)として格納されています。インストール済みパッケージのメタ情報、ファイル所有関係、依存関係などが詰まった、yum / dnfにとっての心臓部です。

このRPMデータベースは、以下のようなタイミングで壊れることがあります。

パッケージ作業中の電源断・強制再起動:書き込み途中で異常終了するとロックファイルとデータの不整合が残ります
ディスクフル:/varが100%になった状態でyum/dnfが落ちると半端な状態で停止します
古いカーネル時代のNFS越しマウント:RPM DBをNFS上に置くと、ロック動作が壊れることがあります
rpm --rootオプションの誤用:別ルートに対するインストールが噛んでDBが二重化する事例があります

壊れたまま放置すると、rpm -qaの応答停止、yum updateの永久ハング、dnf installのrpmdb open failed連発など、運用が一気に詰みます。再構築コマンド rpm --rebuilddb は、こうした破損から復旧する公式手段です。

RPMデータベースを再構築する基本的な使い方

RPMデータベース再構築の基本は、root権限で「rpm --rebuilddb」を1回実行するだけです。事前のバックアップと事後の動作確認を含めた3ステップで運用します。

1. RPMデータベースをバックアップする

再構築は内部的に /var/lib/rpm を作り直す処理です。万が一に備えて事前にバックアップを必ず取ります。

# /var/lib/rpm を丸ごとバックアップ [pakira@Tiger ~]$ su - パスワード: [root@Tiger ~]# cp -a /var/lib/rpm /var/lib/rpm.bak_$(date +%Y%m%d) [root@Tiger ~]# ls -ld /var/lib/rpm.bak_* drwxr-xr-x. 3 root root 4096 May 18 19:00 /var/lib/rpm.bak_20260518

cp -a で権限・タイムスタンプを保ったままバックアップします。問題が起きたらこのディレクトリを /var/lib/rpm に書き戻すだけで元の状態に戻せます。

2. rpm --rebuilddb を実行する

バックアップが取れたら、本体の再構築コマンドを実行します。

# RPMデータベースを再構築する [root@Tiger ~]# rpm --rebuilddb [root@Tiger ~]#

正常終了すると何もメッセージを出さずにプロンプトへ戻ります。インストール済みパッケージ数が数千を超えるサーバーでは、完了まで数分から十数分かかることがあるので、無言の状態でも焦らず待ちます。

3. RPMデータベースの整合性を確認する

再構築後はrpm -qa(全パッケージリスト出力)が問題なく流れるか確認します。

# 全パッケージ数を数える [root@Tiger ~]# rpm -qa | wc -l 1483 # 個別パッケージのクエリ [root@Tiger ~]# rpm -q openssh-server openssh-server-8.7p1-34.el9.x86_64

壊れた状態だと rpm -qa が途中で停止したりエラーを返したりします。スムーズに件数が表示されれば、再構築は成功です。

RPM再構築まとめ早見表

やりたいことコマンド
RPMデータベースを再構築するrpm --rebuilddb
RPMデータベースを初期化する(重度破損時)rpm --initdb
RPM DBをバックアップするcp -a /var/lib/rpm /var/lib/rpm.bak_$(date +%Y%m%d)
RPM DBのロックファイルを削除するrm -f /var/lib/rpm/__db.*
全パッケージ数を確認するrpm -qa | wc -l
個別パッケージの存在確認rpm -q パッケージ名
RPM DBのファイルサイズ確認du -sh /var/lib/rpm
コマンド単独形式で覚えておけば、本番で迷わず実行できます。

応用・実務Tips

1. rpm --rebuilddb の前にロックファイルを掃除する

ロックファイル /var/lib/rpm/__db.* が残っていると、再構築が始まらないことがあります。再構築前に必ず削除します。

# ロックファイルを削除して再構築 [root@Tiger ~]# ls /var/lib/rpm/__db.* /var/lib/rpm/__db.001 /var/lib/rpm/__db.002 /var/lib/rpm/__db.003 [root@Tiger ~]# rm -f /var/lib/rpm/__db.* [root@Tiger ~]# rpm --rebuilddb

__db.*ファイルは再構築時に自動で再生成されるため、削除しても問題ありません。ただし他のyum / dnf / rpmプロセスが裏で動いていないことだけは事前に確認します。

2. 動作中プロセスがないことを確認する

RPMデータベースに同時に書き込もうとするプロセスが存在すると、再構築が破壊的に失敗します。再構築前にpsで残存プロセスをチェックします。

# yum / dnf / rpm の残存プロセス確認 [root@Tiger ~]# ps aux | grep -E "(yum|dnf|rpm)" | grep -v grep [root@Tiger ~]#

出力ゼロを確認してから再構築に進むと、二重書き込み事故を防げます。

3. RHEL 9以降のsqlite DBにも同じコマンドが使える

RHEL 9 / Rocky Linux 9 / AlmaLinux 9以降ではRPM DBの実装がBerkeley DBからsqliteに切り替わっていますが、rpm --rebuilddb コマンドは同じインターフェースのまま機能します。実装はrpmコマンド側で吸収されているため、運用者側は意識不要です。

# RHEL 9系のRPM DB実体(sqlite) [root@Tiger ~]# ls -lh /var/lib/rpm/ total 1.2M -rw-r--r--. 1 root root 0 May 18 19:00 .dbenv.lock -rw-r--r--. 1 root root 0 May 18 19:00 .rpm.lock -rw-r--r--. 1 root root 1.2M May 18 19:00 rpmdb.sqlite -rw-r--r--. 1 root root 32K May 18 19:00 rpmdb.sqlite-shm -rw-r--r--. 1 root root 80K May 18 19:00 rpmdb.sqlite-wal

ファイル名がrpmdb.sqliteであっても、再構築コマンドはRHEL 7時代と同じ rpm --rebuilddb です。

「rpmdb open failed」「db5 error」が出た時の対処法

RPM DB破損で最もよく見るのが、yum/dnfが「rpmdb open failed」「db5 error」を吐いて止まるパターンです。

# 破損状態でdnf updateを実行した例 [root@Tiger ~]# dnf update error: rpmdb: BDB0113 Thread/process 1234/0x7f... 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 Error: Error: rpmdb open failed

このメッセージが出たら、以下のフローで復旧します。

1. /var/lib/rpm をバックアップ
2. ロックファイル __db.* を削除
3. rpm --rebuilddb で再構築
4. rpm -qa で件数確認

これで9割の破損ケースは復旧します。それでもダメな場合は、rpm --initdbで初期化し、バックアップから Packages ファイルだけを書き戻して再構築する重度復旧手順に進みます。

RPM再構築でも復旧しない場合の最終手段

rpm --rebuilddb で復旧しない場合、Packagesファイルだけを残してDB環境を作り直す方法があります。リスクが高いので必ず事前バックアップを取ったうえで実行します。

# 重度破損時のリカバリ手順 # 1. 緊急バックアップ [root@Tiger ~]# cp -a /var/lib/rpm /var/lib/rpm.broken_$(date +%Y%m%d) # 2. Packagesファイル以外を削除 [root@Tiger ~]# cd /var/lib/rpm [root@Tiger rpm]# ls Basenames Conflictname Dirnames Group Installtid Name Obsoletename Packages Providename Pubkeys Requirename Sha1header Sigmd5 Triggername __db.001 __db.002 __db.003 [root@Tiger rpm]# rm -f /var/lib/rpm/__db.* /var/lib/rpm/Basenames /var/lib/rpm/Conflictname /var/lib/rpm/Dirnames /var/lib/rpm/Group /var/lib/rpm/Installtid /var/lib/rpm/Name /var/lib/rpm/Obsoletename /var/lib/rpm/Providename /var/lib/rpm/Pubkeys /var/lib/rpm/Requirename /var/lib/rpm/Sha1header /var/lib/rpm/Sigmd5 /var/lib/rpm/Triggername # 3. Packagesから他のインデックスを再構築 [root@Tiger rpm]# rpm --rebuilddb [root@Tiger rpm]# rpm -qa | wc -l 1483

これでも復旧しなければ、最終手段としてOSの再インストールが必要なレベルなので、その前に必ずバックアップの存在を確認してください。

本記事のまとめ

RPMデータベースを再構築する手順は、本番環境でも怖くない定型作業です。

rpm --rebuilddb:再構築の本体コマンド。root権限で実行
cp -a /var/lib/rpm /var/lib/rpm.bak_YYYYMMDD:事前バックアップは必須
rm -f /var/lib/rpm/__db.*:ロックファイル掃除で再構築の確実性を上げる
rpm -qa | wc -l:再構築後の動作確認の定番

yum / dnf / dnf5のどれを使うディストロでも、内部のRPMデータベースは共通の構造です。本手順はRHEL 7 / 8 / 9系全てに有効で、Rocky Linux / AlmaLinux / CentOS Streamでもそのまま使えます。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。