3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

レンタルサーバ アイルでのMySQL4.0→5.1へのバージョンアップ

アイルというレンタルサーバ(iCLUSTAプラン)の MySQL のバージョンアップ作業を依頼されました。

現状は MySQL4.0 を使ってるっぽいんですが、 MySQL5 に移行するようアイル側から通知があったそうです。

バージョン4は夏ごろに利用不可になるとか。。(そもそもパッチ提供がとっくに終わっている4.0をここまで引っ張るのも問題ですが...)

で、アイルのWEBサイトでDBバージョンアップについての情報を探してみましたが、ほとんど見当たりません。

仕方ないので、問い合わせることに。。

Q1:バージョンアップ時に、既存のテーブル構造、データを移行するようなシステムはあるのか?

A: ない。DBManagerから、ダンプ・リストアをユーザ側でやって。

Q2:ストレージエンジンは選べる?

A: MyISAM,InnoDBが選べる。

Q3:テーブルの文字コードは選べる?

A :MySQL5側のデフォルト文字コードは ujis。文字コードの変更は不可。

Q4:DBへの接続情報は変わる? 変わる場合は前もってわかるの?

A :データベースサーバ名、ポート番号が変更。DB名は変わらない。バージョンアップ後に新しいDB名、ポート名を表示するよ。

なんというかアイル結構不親切だなと思った今日この頃です。

まず、DBのデータ移行くらいはしてほしかったですね。

また、文字コードが選べないのも問題です。特に、アイルのシステムはWEBサーバ,DBともに EUC を強要するんですが、配置してるHTMLやWEBアプリケーションはすべて UTF-8 で書いてます。

(よって、MySQL4.0 の時は無理やり UTF-8 のデータを放り込んでます。アイル付属のDB管理ツールDBManagerから見たら文字化けしまくりです。)

(でも、よく考えたら、MySQL4.1移行は SET NAMES が使えるので文字コード選べなくても問題ないですね。。。。)

それから、新しい接続情報を前もって教えてくれないってどゆことですか。これじゃ、バージョンアップしてから接続情報確認して、phpのソース書き換えてしないといけなくなり、その間データ移行も必要で、結局WEBアプリ停止時間が長くなってしまいます。

まあ、愚痴ばかり言ってもしかたないので、実作業のメモ。

まず、DBManager → databaseのバックアップ から既存のデータをダンプしてローカルに保存します。(このとき、ちゃんとUTF-8の情報も文字化けせずダンプできました。これが、テーブル毎で文字コード異なってるとおおごとなんでしょうね。)

この後、DBを使ってるページにメンテナンス中であることを表示させます。

次に、iCLUSTAのPlanManager → ユーティリティ → データベース設定 で MySQL のバージョンアップを実行します。

これで、データは全部消えちゃいます。

この時にパスワードの変更が要求されたので、前と同じパスワードを設定します。

それで、新DBサーバ名と、ポート番号が表示されるので忘れずにメモします。

ダンプしておいたファイルを DBManager → databaseのリストア から復元さしたのですが、案の定データが文字化けしてしまいました。

ということで一旦文字化けしたテーブル消し、phpMyAdmin を使用することとしました。(これも config.inc.php でDB接続先を新しいのに変更する必要あります)

phpMyAdminutf-8でログインし、インポートからダンプファイルを選択し、文字セットを utf8 にします。

これでインポートすると、ujisのテーブルに、ujisに変換してインポートしてくれます。

最後はDBにつなぐPHPファイルでDB接続情報の変更です。今回、DBにつなぐ部分はCakePHPだけだったので、database.php を修正するだけで済みました。

下記のような感じです。

var $default = array(

'driver' => 'mysql',

'persistent' => false,

'host' => '新サーバ名:ポート番号',

'login' => 'ログイン名は変わらず',

'password' => 'パスワード',

'database' => 'DB名も変わらず',

'encoding' => 'utf8', //これ重要。WEBアプリ側はUTF8の文字を要求。

'prefix' => '',

);

重要なのは 'encoding' => 'utf8' でしょうかね。

これを指定しないと、MySQLが勝手に考えた別の文字コードで返してくるので、文字化けしてしまいます。(HTML,PHPUTF-8で作ってるので。。)

これで、なんとか無事に MySQL のバージョンアップが完了しました。