Yumでsqlite3.DatabaseError: database disk image is malformedエラーが出る場合の解決法

Yumでsqlite3.DatabaseError: database disk image is malformedエラー

障害があったCentOSサーバーでsudo yum upgradeを実行しようとしたのですが、以下のようにPythonのエラーと共に”sqlite3.DatabaseError: database disk image is malformed”というSQLiteのDBエラーが出て中断してしまうことがありました。

$ sudo yum upgrade
…
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 375, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 281, in main
    return_code = base.doTransaction()
  File "/usr/share/yum-cli/cli.py", line 817, in doTransaction
    resultobject = self.runTransaction(cb=cb)
  File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 1944, in runTransaction
    self.verifyTransaction(resultobject, vTcb)
  File "/usr/lib/python2.7/site-packages/yum/__init__.py", line 2076, in verifyTransaction
    self.history.sync_alldb(po)
  File "/usr/lib/python2.7/site-packages/yum/history.py", line 1358, in sync_alldb
    if not self._wipe_anydb(ipkg, "rpm"):
  File "/usr/lib/python2.7/site-packages/yum/history.py", line 1352, in _wipe_anydb
    executeSQL(cur, sql, (pid,))
  File "/usr/lib/python2.7/site-packages/yum/sqlutils.py", line 168, in executeSQLQmark
    return cursor.execute(query, params)
sqlite3.DatabaseError: database disk image is malformed

sudo yum clean allを実行してリポジトリ情報をクリアしても失敗します。最終的には下記のコマンドでエラーなくアップグレードできました。

$ sudo yum clean dbcache

yum clean dbcacheは、Yumのメタデータに高速アクセスするためのsqliteファイルを削除するコマンドです。yum clean allは/var/cache/yum/のエントリを削除するコマンドのため、yum clean allだけでは削除できないDBキャッシュが存在するようです。yum clean dbcacheでそれを削除できました。Yumのキャッシュ削除には以下のコマンドがあるため状況に応じて試してみるのが良いでしょう。

sudo yum clean all          # /var/cache/yumディレクトリ内のエントリを全て削除
sudo yum clean metadata     # XMLメタデータを削除
sudo yum clean dbcache      # SQLiteのDBキャッシュファイルを削除
sudo yum makecache              # キャッシュを再作成