新宿の会社で使ってる
Mantisについて、今はBackendのDBをMySQLで使ってるけど、基本的に社内のDBはPostgreSQLで統一するという方針で動かしてる関係で、最近になり「PostgreSQLに移行できないかなぁ?」という話が出てきてしまった。
んでそのあたりを一応試してみたので、その状況をメモ。
1. まずMantisをPostgreSQL環境に新規にインストール
現在MantisのStable版は1.1.7が最新だけど、1.1系でのPostgreSQLサポートはExperimentalなステータスにとどまっていて、実際インストールスクリプトを動かすとCREATE TABLEの途中で落ちるので使い物にならん。
開発版の1.2.0a3で試してみたところ、とりあえずCREATE TABLEは普通に動く。ただしスクリプトにCREATE DATABASEさせるとエンコーディングがDBのデフォルト値になるらしく、会社の環境ではエンコーディングがSQL_ASCIIになってしまう。なので先にエンコーディングにUTF-8を明示的に指定してCREATE DATABASEしておき、それからインストールスクリプトを走らせるのが良いみたい。
ちなみにMantisは1.2からPHP 5.2以上を要求するようになったので、1.1系からの移行の方はご注意。
2. MySQL上にある既存のMantis用DBをバージョンアップ
んでPostgreSQLでDBがうまく生成できることを確認したので、一旦config_inc.phpを削除して、次にMySQL上にある既存のDBを指定してバージョンアップを実施。
1.1系から1.2系に移行するに当たってはいくつかテーブル・カラムの追加、データの変換などが発生するが、そのへんはインストールスクリプトがよきに計らってくれる。
3. MySQL→PostgreSQLにDBをコピー
んで両方のDB共に1.2.0a3用の形になったところで、DBの中身を移す。ただ結構めんどい。
最初はMySQL 5.1付属のmysqldumpで「--compatible=postgresql」を付けてSQLを吐かせればいけるかと思ったんだが、添付ファイル周りのところでSQLがエラーを起こす。添付ファイルはMySQLのblob型カラムの中に保存されているのだが、PostgreSQLでは当該カラムはbytea型で定義されているためエスケープの扱いが異なるらしく、mysqldumpのSQLそのままではうまくデータを突っ込めない。
しかたないのでPHPで簡単なスクリプトを書いて、「MySQLから1行ずつデータを読み出し→PostgreSQL側にinsert」を行うことに。あとMySQL側のDBが、DBのdefault_character_setはutf8だったのに、個別のテーブル側でujis(EUC)のエンコーディングを指定していたため、ついでにスクリプトの中でEUC→UTF-8への変換もやってしまうことにする。
基本的にはこのスクリプトでだいたい問題なくデータは移ったのだが、なんかPostgreSQLのbytea型ってえらく遅くないかという疑いが浮上(ただし今回はPostgreSQL 8.2を使ったので、8.3でやればまた話は違うかも)。
あとデータのinsertが全部終わったら、PostgreSQL側のシーケンス値もそれに合わせて個別に修正しておくこと(これやっとかないと、後でduplicate key existsエラーになる可能性が大)。
ここまで行けば、基本的にはMantis 1.2 + PostgreSQLの環境で生活できるようになると思いますが、メールがちゃんと文字化けしないで飛ぶかとか、細かいところの動作確認はしてない。とりあえず試したのは、「ログインできてユーザの追加ができて、バグレポートが読み書きできて、あと添付ファイルがDLできる(ただしあまり長いファイル名だとDLできなくなることがある模様)」というくらい。この後はしばらくこれがまともに使えるか、個人的にいろいろ試してみるつもり。
あ、ちなみに、config_inc.php内の$g_default_languageの指定が、1.1系では「japanese_utf8」だったものが1.2系では単に「japanese」になっている点も注意した方がいいかも?(japanese_sjis、japanese_ujisはそのままだった気がする)