yumやrpmコマンド実行時にエラーが出たときの対処

yumやrpmコマンド実行時にエラーが出たときの対処 はてなブックマーク - yumやrpmコマンド実行時にエラーが出たときの対処


◆久々にRHEL系サーバでyumを使ったらエラー

とあるRHEL系サーバでyumを使ってみると、見慣れないエラーが唐突にはき出されたので、その時の対処をまとめました。結論から書きますと、Red Hat Linux 時代からある対処法で全然オッケーでした。

まず、エラー内容はこんな感じ。

# yum search httpd
Loaded plugins: rhnplugin
rpmdb: Lock table is out of available locker entries
rpmdb: Unknown locker ID: 1477
error: db4 error(22) from dbenv->close: 無効な引数です
error: cannot open Packages index using db3 - メモリを確保できません (12)
error: cannot open Packages database in /var/lib/rpm
Traceback (most recent call last):
File "/usr/bin/yum", line 29, in ?
yummain.user_main(sys.argv[1:], exit_code=True)
File "/usr/share/yum-cli/yummain.py", line 309, in user_main
errcode = main(args)
File "/usr/share/yum-cli/yummain.py", line 157, in main
base.getOptionsConfig(args)
File "/usr/share/yum-cli/cli.py", line 187, in getOptionsConfig
self.conf
File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 665, in <lambda>
conf = property(fget=lambda self: self._getConfig(),
File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 240, in _getConfig
self._conf = config.readMainConfig(startupconf)
File "/usr/lib/python2.4/site-packages/yum/config.py", line 804, in readMainConfig
yumvars['releasever'] = _getsysver(startupconf.installroot, startupconf.distroverpkg)
File "/usr/lib/python2.4/site-packages/yum/config.py", line 877, in _getsysver
idx = ts.dbMatch('provides', distroverpkg)
TypeError: rpmdb open failed

はぁ「rpmdb open failed」というエラーが出ています(;´Д`) しかも、「メモリを確保出来ません」という無慈悲なエラーが出ているので、何かシステムが不安定じゃないかとも思ったり、かなり焦りました。

原因として、よくあるのが、ディスク容量100%だったり、rpmdbそのものが破損という事もあるのですが…見たところ以上はありません。というか、見かけ上、かなり普通なのですが。。

対処法としては、昔の作業を思い出して、/var/lib/rpm の中のファイルをサクッと削除することで対処できました。

/var/lib/rpm の中には

-rw-r--r--  1 root root   450560 12月  4 17:52 __db.003
-rw-r--r--  1 root root  1318912 12月  4 17:52 __db.002
-rw-r--r--  1 root root    24576 12月  4 17:52 __db.001

こんな3つの __db.001, 002, 003 というファイルがあります。これらを容赦無く削除することで、大丈夫でした。

# rm __db.00*
rm: remove 通常ファイル `__db.001'? y
rm: remove 通常ファイル `__db.002'? y
rm: remove 通常ファイル `__db.003'? y

※もし何かあると心配…という場合は、別名で保存しておくなり、/tmp 以下に一時退避しておけば安心です。

以上、備忘録でした。