yum update で自動的にパッケージを更新していたら、更新に失敗した通知が届いた。該当のサーバーにログインして yum update してみると、以下のようなエラーが発生した。サーバーは、さくらインターネットの VPS を利用しており、CentOS 6.5を利用している。
[root@server ~]# yum update rpmdb: PANIC: fatal region error detected; run recovery error: db3 error(-30974) from dbenv->open: DB_RUNRECOVERY: Fatal error, run database recovery error: cannot open Packages index using db3 - (-30974) error: cannot open Packages database in /var/lib/rpm CRITICAL:yum.main: Error: rpmdb open failed
エラーが発生したのは、
- 前日の更新で kernel パッケージの更新が発生
- 再起動するが、kernel パニックで起動せず
- コンソールでログインして以前の kernel で起動
という一連の作業を実施した翌日の出来事だ。おそらく rpm のデータベースが壊れたのであろうと推測し、エラーの回復方法を調べてみると「/var/lib/rpm/__db.*」を消せばよいという情報が見つかった。他のサイトの情報なども合わせて、ざっと要約すると「/var/lib/rpm/__db.* ファイルは Berklay DB にアクセスするときに生成されるファイルで、rpm コマンドが強制終了したときに残る」ということのようだ。
再生成されると書いてあるので消しても問題ないだろうと思って、
[root@server ~]# rm /var/lib/rpm/__db.* [root@server ~]# yum update rpmdb: PANIC: fatal region error detected; run recovery ...
さっくりと消したが、yum update は成功しない。気を取り直して、ファイル削除、rpm のデータベース再作成、yum の順に実行したところ成功した。
[root@server ~]# rm /var/lib/rpm/__db.* [root@server ~]# rpm --rebuilddb [root@server ~]# yum update
rpm の「–rebuilddb」はデータベース再作成オプションで、インストールされているパッケージのへッダーからデータベースのインデックスを再作成する。
なお、今回は場当たり的に対処してしまったが、正しく行うのであればシングルユーザーモードで起動、「/var/lib/rpm」のバックアップを取得、「/var/lib/rpm/__db.*」ファイルの削除、データベースの再作成という順序で行う。