2004年11月05日

「データベースをMySqlに移行」MT導入と改造

たいして量があるわけではないのに、リビルドがずいぶん遅くなってしまっていた。 全体リビルドをするとなんかのタイムアウトでエラーになるという、 なんだかトホホな状況に陥ってしまっていた。 それに、アクセス記録が予想以上に増加していて、perlだけで統計情報を計算するのには そろそろ限界に来ていたというのもあるので、データベースをBerkeleyDBからDBI::mysqlに 移行することにした。

MySqlインストール

インストール自体はWindows Installerで行えることもあり、すんなり終わった。

しかし、サンプルのperlスクリプトでテストしてみるとconnectができない。

どうやらパスワードがあるとだめであることがわかったのでパスワードなし。 これはあんまり気持ちがよくないので、なるべくはやく解決する事にして、次へ。

MTデータベース移行

使っているMTは2.6なのだが、MT3.0用のmt-db2sql.cgiで簡単にデータベースの引越しができる、はず。 しかし、そうは問屋が卸してくれない。 まずここで使っているMTはデータベースのスキーマに手を加えてあるので、ここを変更して あげないといけない。 みようみまねでスキーマをいじってとりあえずはスキーマの変更は終了。

しかしmt-db2sql.cgiを動かすと「DBIにconnectなんかないよ」といって怒られてしまう。 これにはかなり手間取ったが、どうやらトップレベルのモジュールで「use DBI;」がないために ライブラリーのスコープがMT内部にあるMT::DBIモジュールと混乱してしまっているようである ことがわかった。よってトップレベルのモジュールには件のuseを入れてやることで解決。

これがわかるまでにCPANでDBIを何度インストールしなおしたことか…。

文字セットの怪

ここのMTはutf8を文字セットに使っているのだが、どうやらこれがデータベースに入る時に 化けてしまう。データベースの設定ではちゃんとutf8にしているのになぜだ?

MySqlのマニュアルをみてテーブルごとにデフォルト文字セットをutf8にするとか、 カラムごとにやってみるとかいろいろやったが、どうもうまくいかない。

結局ワークアラウンドとしてMT側のDBIのオブジェクトドライバーのmysqlのやつに、 クラスにドライバーをセットしたときに"SET NAMES 'utf8'"を実行してやることで解決。

日付の怪

MT内部では日付はYYYYMMDDHHMMSSのフォーマットになっている。 一方、データベース側ではYYYY-MM-DD HH:MM:SSなので、MT内部のmysqlのオブジェクトドライバーでこの違いを吸収するようにしてある。 しかし、この機構が働いていない。もしかするとトップレベルモジュールで強引にuse DBIを してしまったことが原因なのだろうか…。 いずれにせよ、リビルドができないのは困るので、オブジェクトドライバーの各DBの共通コード側で 「tr/\- ://d」してしまうことにした。 せっかく汎用に作られているのに、ここで使う特定環境下でのmysqlの都合を押し付けてしまうのは非常に心苦しいのだが、しょうがない。

MySqlの効果は?

リビルドの速度はどの程度はやくなっただろうか?

気持ちはやくなったのかも知れないという程度かもしれない。 なので、あんまりご利益はないかなぁ…。

次はアクセス記録の部分をMySql対応にする。 現在ページを表示する時間の大部分はここで費やされているので、こっちは効果があるだろう。あるはずだ。

追記:

何回かリビルドした感じでは明らかに早くなっている。 エントリーやコメントの単体リビルドだとあまり違いがわからないが、 全体リビルドだと違いは明確だ。 データベースを移行したかいがあった。

今後の改造

  • 禁止IPリストをレンジで指定できるようにする。
  • アクセスログのデータもMySqlに移行する
  • MT3.1へ移行
この記事のトラックバック用 Ping URL: http://www.mediaware.jp/blog/mt-tb.cgi/77
「データベースをMySqlに移行」へのコメント  コメントを書く
「データベースをMySqlに移行」へのトラックバック
コメントを書き込む









メールアドレスを記憶する?


この記事の評価
悪い あんまり 普通 まあまあ 良い





@@@@