Posted by をかもと at 2009年5月11日 月曜日

このサイトを設置している、さくらインターネットのサーバ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

と、ここでも問題が。
ほぼ問題なく、インポートできたんですが一部の文字("〜(波ダッシュ)"、"−(全角マイナス)"等)が"?"になってしまう...

てなわけで、こんな時は古から存在する文字コードコンバータ nkf を使いましょう。

% 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

トラックバック & ピンバック » 表示する

コメント

  • twitter 2009年11月22日 日曜日 1:28 AM

    波ダッシュ問題、これかなぁ・・・http://bit.ly/5vepcV

  • twitter 2009年11月22日 日曜日 1:57 AM

    波ダッシュ問題はこれでいけそうなんだけど、diffでパッチ当てる環境がないという罠。http://bit.ly/5vepcV

  • twitter 2010年1月6日 水曜日 1:48 PM

    RT @wokamoto: @toshiro さくらは MySQL5.1系に移行すれば、アップデート可能です。 http://wp.me/p4w87-dX http://dogmap.jp/yz

  • twitter 2010年1月13日 水曜日 11:28 AM

  • twitter 2010年4月18日 日曜日 4:03 PM

    @toshiro @toshiro そーですねー。私はここを参考にしましたよ。http://bit.ly/9EYfm6

  • twitter 2010年4月18日 日曜日 4:12 PM

    RT @hyam: @toshiro @toshiro そーですねー。私はここを参考にしましたよ。http://bit.ly/9EYfm6

コメントする


Twitter ID を入力すると新しいコメントがあった際、 @dogmap_jp が、あなた宛に@リプライでお知らせします。

入力いただいたメールアドレスから、TwitterGravatar に登録されているアイコンを表示します。
(メールアドレスは公開されません)

改行と段落タグは自動で挿入されます。メールアドレスは表示されません。

:mrgreen: :-P :-D :-) ;-) :-o :-| :-( 8-O :-? 8-) :twisted: :evil: :oops: :roll: :cry: :lol: :-x more »