MySQLのバージョンアップ

  • MySQL 4.0 までは、3.X から 4.0 に upgrade しても、なんの影響もなくそのまま古いデータ(/var/lib/mysql)を使えました。
    • ダンプ→リストア不要、「ALTER TABLE」も不要。
  • 4.1 以上にupgradeするときは、日本語キャラクターセットを使っている場合、注意しなくてはならない点が複数存在します。

4.0→5.0

追加機能

詳細: http://lists.mysql.com/mysql-ja/262

    http://www.klab.org/media/mysql/
- ストアドプロシージャ、ストアドファンクションを実装
- トリガーを実装
- ビューを実装
- サーバサイドカーソル機能を実装
- 情報スキーマを実装
- XA 分散・トランザクションの実装
- HEAP(MEMORY) テーブルのインデックスに、BTREE が追加
- サブクエリ の追加
- NDB クラスターの追加
- GIS追加
- utf8 , ucs2 キャラクターセットの追加
- 日本語キャラクタセット cp932 / eucjpms に対応
- 文字コードの自動変換機能が追加
- データベース、テーブル、フィールド、それぞれ個別にキャラクターセットを指定できるようになった。

    .....

変更点

詳細: http://www.mysql.gr.jp/frame/modules/bwiki/index.php?FAQ#content_1_40
- パスワードの保存形式が変わった。(長くなった)

~4.0  12de31820cbc0fce
4.1~  *59170D1E4A5E56267B6ED9C51ED62619FB817E6B
  • CHAR(10) は 10 バイトから 10 文字に変わった。

    • 3.X, 4.0 で char(10) と定義していたフィールドが、 4.1 に uprade した瞬間に、char(3) もしくは char(5) 扱いになってしまいます。
    • ujis は、最大で 3バイトを使用して 1文字を表現する。sjis は最大で 2バイトを使用して sjis 1文字を表現する。
    • 4.0 で CHAR(10) と定義した。これは 10 バイト。
    • 4.1 に upgrade したら、10バイトを、X文字にしなければならない。
    • そこで、ujis の場合は、10バイト -> 3(ujis)文字となる。
char(10) が char(3) になるトリック
 4.0 まで : 12345678910
 内部バイト: ■■■■■■■■■■
 4.1(ujis) : +-++-++-+
    文字数  1  2  3
 4.1(sjis) : ++++++++++
    文字数   1 2 3 4 5
  • char() に、全てのバイト列が入らなくなった。
    • ujis のフィールドには、EUC-JP に定義されるコード空間のバイトしか INSERT できない。
  • データベース名、テーブル名は、OS 上では unicode に直されて保存されるように変わった(ディレクトリ名、ファイル名が、utf8 キャラクターセットで書かれるようになった)。
    • 4.0 まではバイナリ列がそのままデータベース名(=ディレクトリ名)、テーブル名(=ファイル名)になっていた。
  • mysqldump の標準キャラクターセットがどうコンパイルしても utf8 になる
  • timestamp 型の表示フォーマットが変わった。
~4.0 20050116214504
4.1~ 2005-01-16 21:45:50
  • mysqlデータベースのテーブルが変わった

    .....

アップグレード時の問題と対応

詳細: http://www.mysql.gr.jp/frame/modules/bwiki/?Contrib

    http://www.mysql.gr.jp/frame/modules/bwiki/index.php?FAQ#content_1_46
- パスワードの保存形式が変わった

  • mysqld起動オプションで解決:old-password

    • 文字コードの自動変換機能
    • char() に、全てのバイト列が入らなくなった。
    • mysqldump の標準キャラクターセットがどうコンパイルしても utf8 になる
    • パッチで解決: http://www.mysql.gr.jp/frame/modules/bwiki/index.php?plugin=attach&refer=Contrib&openfile=mysql-5.0.33-jp-all.patch2
    • CHAR(10) は 10 バイトから 10 文字に変わった。
  • シェルバッチで解決: http://www.mysql.gr.jp/frame/modules/bwiki/index.php?plugin=attach&refer=Contrib&openfile=mysql_change_char_len.sh

    • timestamp 型の表示フォーマットが変わった。
    • アプリの作り方に注意。
    • データベース名、テーブル名は、OS 上では unicode に直されて保存されるように変わった(ディレクトリ名、ファイル名が、utf8 キャラクターセットで書かれるようになった)。
    • mysqlデータベースのテーブルが変わった
    • 変換コマンドで解決:mysql_fix_privilege_tables

アップデート準備

コンパイル

  • 問題解決パッチ適用
http://www.mysql.gr.jp/frame/modules/bwiki/index.php?plugin=attach&refer=Contrib&openfile=mysql-5.0.33-jp-all.patch2
  • configure時標準オプションに下記オプションを追加
--with-charset=binary

必須作業

my.cnfの設定
- 旧形式のパスワードを利用する

[mysqld-5.0]
old-passwords
  • クライアント、サーバ間等の文字コードを統一し自動変換をしない
[client]
default-character-set=ujis

[mysqld]
skip-character-set-client-handshake
default-character-set=ujis
default-collation=ujis_japanese_ci

[mysqldump]
default-character-set=ujis
hex-blob

[mysql]
default-character-set=ujis

アップグレード方法

MySQLアップデートのみ

/var/lib/mysqlディレクトリのデータを5.0用に変換して利用する
- mysqlテーブルが4.0仕様なので無視して起動

/etc/init.d/mysql start --skip-grant-tables
  • mysqlテーブル4.0→5.0変換処理
mysql_fix_privilege_tables
  • 既存char項目変換処理シェルバッチ
http://www.mysql.gr.jp/frame/modules/bwiki/index.php?plugin=attach&refer=Contrib&openfile=mysql_change_char_len.sh

MySQLアップデート+バックアップデータインポート(構造ごと)

mysqldumpで4.0データを構造ごとエクスポートし5.0上にインポートし再構築
- バックアップデータインポート(構造ごと)
- 権限情報の設定が必要
- mysqlテーブルのデータのみインポート

アップグレード実施結果

MySQLアップデートのみ

※微妙に桁数が変わってしまう:

 4.0→5.0        :varchar(100)→varchar(33)

 mysql_change_char_len.sh:varchar(33)→varchar(101)

MySQLアップデート+バックアップデータインポート(構造ごと)

※データが多い場合時間がかかる:

 クライアント(mysqlclient)も変更が必要???

参考資料

    .....

  • このエントリーをはてなブックマークに追加
Feedforce Developer Blog

新しいブログへ移行しました!こちらもよろしくお願いします。

â–²