この記事のポイント
・rpm --rebuilddb でRPMデータベースを安全に再構築できる
・実行前に /var/lib/rpm を必ずバックアップする
・rpm -qa の応答停止や「db5 error」「rpmdb open failed」が再構築の合図
・RHEL 9 / Rocky Linux 9 / AlmaLinux 9でも同じ手順で通用する
RPM系ディストロを長年運用していると、いずれ一度はRPMデータベース破損に遭遇します。yum / dnfの裏で動いているRPM DBが壊れると、インストール・更新・削除のすべてが止まります。
この記事では、RPMデータベースを再構築する方法を、rpm --rebuilddbコマンドの基本動作と前後のバックアップ手順、よくあるトラブル対処までまとめて解説します。RHEL 9 / Rocky Linux 9 / AlmaLinux 9 / CentOS Stream 9で動作確認済みです。
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ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
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再構築まとめ早見表
| やりたいこと | コマンド |
|---|---|
| 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
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 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
本記事のまとめ
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でもそのまま使えます。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:LinuxでIPv6アドレスを確認・設定する方法|ip -6 addrとnmcliの設定手順
- 前のページへ:RPMパッケージの状態を表示する
- この記事の属するカテゴリ:Linuxtips・RPM・システム管理へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます