Cyrus IMAPdのDBエラー

Cyrus IMAPdがエラーを吐くようになってしまったので、調査。

現象

Cyrus IMAPdが/var/log/messagesに次のようなエラーを吐く。メールは受信している模様。

Jul  7 13:16:57 secondary ctl_cyrusdb[41285]: DBERROR db4: fatal region error detected; run recovery
Jul  7 13:16:57 secondary ctl_cyrusdb[41285]: DBERROR: dbenv->open '/var/imap/db' failed: DB_RUNRECOVERY: Fatal error, run database recovery
Jul  7 13:16:57 secondary ctl_cyrusdb[41285]: DBERROR: init() on berkeley
Jul  7 13:16:57 secondary ctl_cyrusdb[41285]: checkpointing cyrus databases
Jul  7 13:16:57 secondary ctl_cyrusdb[41285]: done checkpointing cyrus databases

原因

何らかの理由により、Cyrus IMAPdのデータベース (Berkley DB) が壊れたらしい。

そう言えば、昨日Cyrus IMAPdのアップデートしたなぁ。と思い出したので、portmasterのログでアップデート日時を確認する。でも、/var/log/messagesファイルを見てみたら、そんなものじゃなくもっとだいぶ前からエラーを吐き続けていた。放置しててごめんなさい。でも普通にメール受信できてたしな…。

アップデートするとき、IMAPdを止めなかったのが原因だろうか。常識的に止めるものと言われればそんな気もするけど、今まで止めたことがなかった。メール負荷のほとんどないサブメールサーバのデータベースは無事。

参考ページ

対処

  1. Cyrus IMAPdを停止する。

    # sudo service imapd stop
  2. 念のため、メールスプールのバックアップを作成する。

    # cd /var/cyrus
    # sudo tar cvfz imap.tar.gz imap
  3. cyrusユーザでログインする。

    # su - cyrus
  4. メールボックスのデータベースを再構築する。

    # cd /var/imap
    # rm db/*
    # rm db.backup?/*
    # rm deliver.db
    # rm tls_sessions.db
    # /usr/local/cyrus/bin/ctl_mboxlist -d > mailboxes.txt
    # mv mailboxes.db mailboxes.db.old
    # /usr/local/cyrus/bin/ctl_mboxlist -u < mailboxes.txt
    # diff mailboxes.db.*
  5. Cyrus IMAPdを起動する。

    # sudo service imapd start
  6. /var/log/messagesにデータベースエラーが書き込まれないことを確認したら、おしまい。

タイトルとURLをコピーしました