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を止めなかったのが原因だろうか。常識的に止めるものと言われればそんな気もするけど、今まで止めたことがなかった。メール負荷のほとんどないサブメールサーバのデータベースは無事。
参考ページ
- Upgrade Cyrus 2.1.16 to 2.2.8 & Berkeley DB woes (Cyrus ML)
- [SOLVED] my cyrus went crazy – “PANIC: DB_RUNRECOVERY: Fatal error” and others (Info-cyrus ML)
対処
-
Cyrus IMAPdを停止する。
# sudo service imapd stop
-
念のため、メールスプールのバックアップを作成する。
# cd /var/cyrus # sudo tar cvfz imap.tar.gz imap
-
cyrusユーザでログインする。
# su - cyrus
-
メールボックスのデータベースを再構築する。
# 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.*
-
Cyrus IMAPdを起動する。
# sudo service imapd start
-
/var/log/messagesにデータベースエラーが書き込まれないことを確認したら、おしまい。