何もわからないままインストールから運用へと至ったMovableTypeですが、どうも現在のBarkleyDB+Perlよりも、MySQL+PHPの方が何かと良いことがあるようだということで、移行を決意しました。
私にとっての良い事というのは、以下の点でした。
1.リビルドの時間が短くなりそうである。
2.エントリが多いアーカイブのページ分割するにはPHPが必須である。
3.サンプルや参考にできるサイトは、上記の組み合わせが多そうである。
大いなる野望(?)に向けての第一弾として、データベースをBarkleyDBからMySQLへ移行です。と、言うことでレッツ・チャレンジ
参考にしたMySQLへの移行 – おやじまんのだめだこりゃ日記の手順をそのままで、ほぼうまく行きました。感謝です。
忘れた時のために、実際に行った手順を記述しておきます。
1.まずはMySQL等のインストール(OSはVine Linux 3.1)
# apt-get update
# apt-get install MySQL MySQL-client MySQL-devel
2.次にPerlからMySQLへアクセスするためのモジュールのインストール
# apt-get install perl-DBI perl-DBD-MySQL
3.続いてMySQLの初期設定
# mysql_install_db
MySQLのrootユーザのパスワードを’hogehoge’に設定し、設定したパスワードでログイン可能かを確認
# mysqladmin -u root password ‘hogehoge’
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 6 to server version: 4.0.23a-standardType ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.
mysql> create database blogdb;
⇒ blogdbという名前の新しいDatabaseを作成
mysql> grant select,insert,update,delete,create,alter on blogdb.* to mtuser@localhost identified by ‘password’;
⇒ blogdb用の専用のユーザー(mtuser)を作成し、そのパスワードを設定mysql> exit
Bye
4.いよいよMovableTypeの設定変更
ここまででBarkleyDBからMySQLへ移行するためのMySQL側の準備が整ったはずなので、mt-check.cgiでMySQLとDBI::mysqlが使用可能な状態になっていることを確認しました。
mt.cfgの変更です。以下の行を追加しました。
ObjectDriver DBI::mysql
Database 先ほど作成したデータベース名(例ではblogdb)
DBUser 先ほど作成したユーザー名(例ではmtuser)
次にmt-db-pass.cgiの変更です。このファイルは、MySQLへのログインの際に使用するパスワードだけが記述されるファイルです。初期値として記述のあった”database_password”を、先ほど設定したパスワードに変更しました。
またこの段階で、mt.cfgのDatabase ./dbをコメントにしました。色々と調べてみると、この段階では移行の元になるBarkleyDBがどこにあるのか分からなくなるのでコメントにしてはマズイという記述を見つけました。私の場合は、たまたまデフォルトのディレクトリでBarkleyDBを運用していたので良かっただけのようです。本来は、移行用のCGIが上手くいった時点でコメントにする方が良いようです。
5.ついにBarkleyDB⇒MySQL
ブラウザでmt-db2sql.cgiにアクセスしました。が、カテゴリの移行のところでエラーで止まってしまいどうしようもない状態になってしまいました。
ここで野生の感が働きました。私の場合、サブカテゴリを使っています。もしかしたら、これがマズイのでは?と思い、一旦mt.cfgに設定した内容を元に戻して、MovableTypeの管理画面からサブカテゴリを全てトップカテゴリに「移動」しました。
改めて、mt.cfgをMySQL用に書き換えてmt-db2sql.cgiにアクセスすると…バッチリ移行完了できました。
ただし、同様の現象がGoogleで検索しても見当たらなかったので、本当のところどうなの?という感じがしていますが、結果オーライと言うことにしました。
簡単に書きましたが、実は相当ヒヤヒヤものでした。データが無くなってしまっては元も子もありませんので、一旦mt.cfgをBarkleyDB用に戻して管理画面が表示され、データも大丈夫そうだった時にはホッとしました。
6.一応、確認&再構築
管理画面からログインして、全体的に内容を見てみると大丈夫そうでしたので、念のためサイトの再構築をやってみたところ最後のメインページの再構築でエラーが発生してしまいました。
Use of uninitialized value in concatenation (.) or string at lib/MT/ObjectDriver/DBI.pm line 80.
何のことやら全く訳がわかりませんでしたので、Googleで検索しまくってやっと似たような現象の方を見つけました。
調べたところ、どうもMySQL(PostgreSQL)を使用している場合で、recently_commented_on=”n”を使用していると発生するバグの模様。BLOG質問箱のエントリに投稿されていたコメントを参考に、MTディレクトリ下の/lib/MT/Template/Context.pmを下記のように修正することで直りました。
と言うことで早速教えてもらったとおり、MTディレクトリ下の/lib/MT/Template/Context.pm743行目付近を以下のように書き換えました。
} elsif (my $n = $args->{recently_commented_on}) {
$args{‘join’} = [ ‘MT::Comment’, ‘entry_id’,
{ blog_id => $blog_id, visible => 1 },
{ ‘sort’ => ‘created_on’,
direction => ‘descend’,
unique => 1,
limit => $n } ];
$no_resort = 1;
}
↓↓↓
} elsif (my $n = $args->{recently_commented_on}) {
$args{‘join’} = [ ‘MT::Comment’, ‘entry_id’,
{ blog_id => $blog_id }, { unique => 1 } ];
$args{‘sort’} = ‘created_on’;
$args{direction} = ‘descend’;
$args{limit} = $n;
$no_resort = 1;
}
で、改めて再構築を行ったところエラーが発生しなくなりました。本当に感謝です。
再構築の時間が短くなるというのを期待していたのですが、「ちょっとは速くなったかな〜」くらいしか実感できませんでした。エントリ数があまり多くないためかな?と自己解決しています。
長い道のりでしたが、これで一応MySQLへの移行がOKとなりました。次はPHP化です。先は長いな〜^^;
2月 16th, 2006 at 6:56 PM
recently_commented_onのバグ
recently_commented_onのバグ