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 文字に変わった。
-
- 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)も変更が必要???
参考資料
- http://lists.mysql.com/mysql-ja/262
- http://www.mysql.gr.jp/frame/modules/bwiki/index.php?FAQ#content_1_40
- http://www.klab.org/media/mysql/
.....