このサイトを設置している、さくらインターネットのサーバOSが FreeBSD 7.1 にバージョンアップされました。
その際 MySQL も 4.0.x と 5.1.x を選択できるようになりました。
てなわけで、WordPress で使用する DB を MySQL4系から5.1系に移行したわけなんですが、文字コード周りでちょっとハマってしまったので、メモを残しておきます。
今回ハマったのは、"〜"(波ダッシュ)等の文字コードが Win系のUTF-8と標準UTF-8で異なる問題(いわゆる波ダッシュ問題)。
とりあえず、エクスポートした過去エントリのデータを文字コード変換して、さらに今後のエントリのためにForce Wave Dashプラグインを導入しました。
データのエクスポート
普段は、ひろまささんの、エントリにあった backup.sh をさくら用に書き換えたものを cron で日に一度バックアップしています。
これでバックアップされたファイルを元に MySQL に流し込もうとしたのですが、文字化けしてどうしてもうまくいかない。
しょうがないので PHPMyAdmin でエクスポートしました。
この辺は、以下のエントリが参考になります。
HashiMのたわごと(?) : 2009年3月14日(土) – MySQLを4から5へ
データのインポート
次は、データのインポート。
PHPMyAdmin の管理パネルからやってもいいんですが、バックアップファイルが 63.3 MB と巨大になってしまったので、今回は mysql コマンドでインポートしました。
# エクスポートファイルが巨大になった一番の原因は wp-jrelated。
% /usr/local/bin/mysql --host=mysql***.db.sakura.ne.jp -u ******* -p w******* --password=****** < mysql.dump[/plain] と、ここでも問題が。 ほぼ問題なく、インポートできたんですが一部の文字("〜(波ダッシュ)"、"−(全角マイナス)"等)が<strong>"?"</strong>になってしまう... てなわけで、こんな時は古から存在する文字コードコンバータ nkf を使いましょう。 [plain]% nkf -w mysql.dump > mysql.utf8.dump
このファイルをインポートすれば、ほぼ問題なく終了です。
一部文字化けしているところがあったら、適宜、手でなおしていきましょう。
記事エントリ時の文字化け対策
Windows PC から、新規記事をエントリする際、"〜(波ダッシュ)"、"−(全角マイナス)" 等が化けてしまいます。
MySQL4系のときは、そのままのコードで格納されていたため、一見すると正常に表示されていたのですが、MySQL5.1系では、そうは問屋がおろさないようです。
と言うわけで、Force Wave Dashプラグインを導入したのですが、WordPress 2.7.1だと正常に動作しないようです。
このプラグインは "save_post" をフックして文字コード変更しているのですが、このフックが有効になるのは、すでにDBに登録されて post_ID が割り振られた後。
さくらの MySQL サーバでは、この時点で"〜(波ダッシュ)"、"−(全角マイナス)" 等が化けてしまってます。
なので、DB登録前に有効になるフィルタフック "wp_insert_post_data" で、入力された文章の文字コードを変換してやるように修正しました。
以下に Force Wave Dash Ver.0.81 用の差分ファイルを置いておきます。
http://dl.getdropbox.com/u/110305/force_wavedash.diff
この差分ファイルは、Force Wave Dash プラグイン作者のゆりこさんにも送付してあるので、そのうちマージしてもらえるでしょう。
おまけ
backup に使っているシェルスクリプト
#!/bin/sh # 設定(ここを自分に合わせる) DATABASE=******** DBUSERNAME=******** PASSWORD=******** SAKURAUSERNAME=******** BACKUPDIR=backup-mysql KEEPDAY=14d # 初期化(SAKURA用) PREFIX=mysql SERVER=mysql**.db.sakura.ne.jp NOWDATE=`date +%Y%m%d` DESTDIR=/home/$SAKURAUSERNAME/$BACKUPDIR DUMPFILE=$PREFIX.$NOWDATE.dump TARFILE=$PREFIX.$NOWDATE.tar.gz OLDDATE=`date -v-$KEEPDAY +%Y%m%d` # MySQLダンプ/圧縮 cd $DESTDIR /usr/local/bin/mysqldump $DATABASE --host=$SERVER -u $DBUSERNAME --password=$PASSWORD > $DUMPFILE if [ -e $TARFILE ]; then rm -f $TARFILE fi tar zcvf $TARFILE $DUMPFILE > /dev/null 2>&1 # 処理判定 if [ $? != 0 -o ! -e $TARFILE ]; then echo "backup faild -- ($DUMPFILE)" exit 1 fi # 圧縮前ファイル削除 if [ -e $DUMPFILE ]; then rm -f $DUMPFILE fi # n日ローテートを削除 RMFILE=$DESTDIR/$PREFIX.$OLDDATE.tar.gz if [ -e $RMFILE ]; then rm -f $RMFILE fi
ピンバック: WP3.0.5に移行したった at KIKIDOG
ピンバック: MySQL5にバージョンアップ…ってそれ食べられる? - うすよごれ。
ピンバック: Taraco-sell’s 2DIE | Fly,Fly,TSUCHINOKO
ピンバック: MySQLを4から5へ(さくら+WPの場合) « Waviaei
ピンバック: Yuriko.Net » Force Wave Dash 1.0.0 ベータ版(その1)