サーバ移転の話続き。Cyrus IMAPのデータ移行方法についてのヒントをメモ。

ここ数年で、

  1. ThinkPad T23 から T43p へ移動 (両方NetBSDで別筐体)
  2. T43p の上で動いていたNetBSDからOpenSolarisへ移動(別筐体)
  3. OpenSolarisからFreeBSD 8.1への移行(バックアップとりつつ同一筐体)

と、3度IMAPサーバの移転をしています。

1 はコピーで済んだのですが、2と3は、OS自体が違うので、色々探した後で見付けたimapsync を使って IMAP経由でコピーしてました。他のはダメだったけれど、imapsyncは優秀で、ちゃんと未読情報もコピーできていた。IMAP使ってやるなら、これを使うのが良いと思う。

ただ、こいつはperlで書いてあることもあり、20Gもあるメールボックスを速攻で移動するのは無理ということで、とても困ってたのですが、良い記事 見付けて、気づきました。というか、ちゃんとドキュメント読めって話ですが、どういうことかというと、

  • ファイル管理は、全体統括するDBと、メールボックスが置かれるパーティション(複数)の二種
  • それぞれ、imapd.conf に場所を設定する
  • 全体統括のDBの方の肝心要なのは mailboxes.dbで、他はreconstructで救える。mailboxesにパーティション名が入っている
  • mailboxes.db は ctl_mboxlist(8)コマンドを使ってtextに、あるいは text から db にインポートできる

そんなわけで、

  1. mailboxes.db をソースのサーバで dumpする
  2. メールボックスパーティションをコピーする
  3. 必要に応じてmailboxes.dbのダンプ結果をいじる。
  4. 新サーバで、mkimap した後で mailboxes.db を restore
  5. ユーザ毎に reconstruct 実行

以上で、移動出来るのでした。mailboxes作るところの操作は、うちのサーバの場合は

old# ${SOMEWHERE}/ctl_mboxlist -d -f /var/imap/mailboxes.db > /tmp/mailboxes.txt
new# /usr/local/cyrus/bin/mkimap
new# cat /tmp/mailboxes.txt | /usr/local/cyrus/bin/ctl_mboxlist -u
new# /usr/local/cyrus/reconstruct -r -f shigeya

という感じの操作になります(メールボックスのコピーは省略)

ただし、この方法だと未読情報が飛びます。多分、方法あるんだと思うのですが、時間ないので諦めました。方法あったら教えて欲しいかもしれないけど、もうサーバ移動は二度としたくないなぁ。。(毎回思うのだけど:d)

しかし、最近、Cyrusのドキュメントがダメになっていてちょっと困ってる。Wiki になってメンテナンスが行き届いてないと、発見したい情報を見付けられなくなるいう典型的悲しいパターンに陥っている。。


Archived comments:

obache 11 Aug 2010

configdirectory の下に user というディレクトリがありますが、その中にユーザごとのメッセージの既読情報とメールボックスの購読情報がありますので、それを持って行っておけばよかったですね。reconstruct では、メールボックスの一覧やメッセージヘッダのキャッシュなどの情報は再生成できますが、そういった imap 的な意味でのメタデータはどうにもなりません。

shigeya 12 Aug 2010

あの情報、なんかの方法でtextに出来ますか? cyrus の skiplist format って、プラットフォーム間でバイナリ互換性が無い(少なくとも OpenSolaris 2009.06 と FreeBSD 8.1 ではダメ)ようなので、単純コピーだとだめのような。これができるなら、mailboxes.dbもそのままいけたはずなので。。

obache 22 Sep 2010

すいません、質問されているのに気付いていませんでしたので、いまさらですが。。。

データベースのフォーマット変換は cvt_cyrsdb コマンドでできます。バイナリ互換のない間では、flat 形式に一旦変換すればいいでしょう。

blog comments powered by Disqus