株式会社フィードフォース技術チームのサイト。社内勉強会資料や開発の様子および成果の公開など。

MySQL4.0系→MySQL5.0系

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

アップデート準備

コンパイル

  • 問題解決パッチ適用
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)も変更が必要???

参考資料

    .....

No comments yet.

(required)

(required)


Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

powered by WordPress
copyright(c) 2006-2010 feedforce