2008年03月10日
MySQL の max_allowed_packet 問題は解決
前回は、Movable Type のデータベースを
別のデータベースに移そうとして失敗しました。
別のデータベースに移そうとして失敗しました。
具体的には、MySQL サーバの max_allowed_packet の
値が低すぎて、SQL の処理を拒否されてたからでした。
サーバ管理者なら MySQL サーバの設定を変えれば
なんてことない問題ですが、なんせレンタルサーバだから。
レンタルサーバ上だと MySQL に限らず
サーバの設定変更は至難のワザです。
されど別の方法で解決したのでブログに載せます。
初めから結論を書きましょう。
% mysqldump -u ユーザ名 -p --add-drop-table \
--default-character-set=binary --skip-opt \
コピー元データベース名 > 一時ファイル1
% iconv -c -f EUC-JP -t UTF-8 一時ファイル1 > \
一時ファイル2
% mysql -u ユーザ名 -p --default-character-set=utf8 \
コピー先データベース名 < 一時ファイル2
一行で書かなきゃ気が済まないナイスガイ向けは
% mysqldump -u ユーザ名 -p --add-drop-table \
--default-character-set=binary --skip-opt \
コピー元データベース名 | iconv -c -f EUC-JP -t UTF-8 \
| mysql -u ユーザ名 -p --default-character-set=utf8 \
コピー先データベース名
一番肝心なのは、一行目の --skip-opt。
最近の MySQL は何でも高速に処理できるように
一計を案じています。
MySQL のデータダンプ(バックアップ)ソフトの mysqldump とてしかり。
後でデータを MySQL に戻す時のことを考えて SQL を吐いています。
これが時として災いの元になったりするんですね。
今回がそうです。
Movable Type の記事文章をのせたテーブル mt_entry を吐いた
SQL 文をじかに見てみてびっくり。
なんと大体 500 記事分をいっぺんに登録するように書いてありました。
一辺に登録できるようにしてあると、処理が早いんですよね。
逆にデータを一つ一つ登録してるとすごく遅くなっちゃう。
中江のエロリチェックの記事は、一つ一つがかなりでっかいです。
その記事を 500 も一辺に登録しようとすると・・・
MySQL サーバも断りたくもなるもんです。
そこで中江は、記事データを一つ一つ登録するようにするよう
mysqldump に指令を出しました。
それが --skip-opt です。
--skip-opt に対応する --opt は何も書かなかったら
標準で指定されてるかのように mysqldump は受け取ります。
この --opt。色々なことを mysqldump にやらせます。
データを一つ一つじゃなく、いっぺんにに登録しろ、
というのも --opt の機能の一つです。
でも今回、中江はそれじゃ困るから、--opt を解除する
--skip-opt を指名したわけでございます。
一行目の --add-drop-table は単なる趣味。
--default-character-set=binary は元データが EUC だったので。
文字コード変換ソフトは nkf の方が好きなんですが
今回は nkf だと間違った処理をしてたので iconv を使いました。
3行目の --default-character-set=utf8 も単なる趣味です。
これはなくても同じだと思うけど。
んで、max_allowed_packet はクリアできたんですけど
肝心の Movable Type がつまづいてまして。
コピーした先のデータベースを Movable Type 4.1 で
アップグレードしたら、見事に文字化け(泣)
移行はまだまだ先になりそうです。
MySQL の max_allowed_packet 問題は解決 | 14:57
│コメント(0)
│トラックバック(0)
MySQL の max_allowed_packet 問題は解決へのトラックバックURL
http://app.blog.livedoor.jp/uradiet/tb.cgi/51060459



