私設データベース解析の都合で、今年になってMySQL-5.0.xから解析ツールの豊富なMySQL-5.1.xにアップデートしたばかりだったのだが、最新バージョンであるMySQL-5.5の機能(英文)に気になるものが追加されていたので、アップグレードすることにした。
新機能の概要については「MySQL 5.5 Reference Manual :: 1.4 What Is New in MySQL 5.5(英文)」に詳細がある。
筆者が興味を持ったのは、その中の、ユニコードサポートの変更である。
MySQL-5.5では、「ucs2」「utf8」「utf16」「utf32」に加えて、新しく「utf8mb4」というキャラクタセットが定義されている。
これは何かというと、4バイトユニコードの文字を使えるということである。
これまでのMySQLでは、3バイトの範囲のユニコードで定義された文字しか、ユニコードの文字としては扱えなかった。
3バイト以下のユニコード文字は、いわゆる基本面に定義されている文字で、具体的には、基本から拡張Aまでの文字群である。つまり、これまでは、ユニコードで定義した文字項目でも、拡張B、拡張Cの文字を登録しようとすると、文字化けを起こしていたのである。
どうしても拡張B以降の定義文字を使用したい場合は、項目のキャラクタセットをbinaryにして入出力するなどの工夫が必要だった。
筆者の場合、古文献などの文字をそのままデータベースに使いたい場合が侭あるので、4バイトユニコードが使えるようになるのは有難い。
しかし、utf8mb4は使用可能な文字範囲が増える代わりに、同一文字数で使用する領域が増えるので、例えば、MyISAMのデータベースにおける1行(1レコード)の最大領域は65535バイト(E.10.4. Table Column-Count and Row-Size Limits)なので、1文字当り従来型キャラクタセットで3バイトだったものが、4バイトに変われば、当然のことながら、1レコードで扱える最大文字数は少なくなる。
その他にもレプリケーション関連など、かなり大胆に機能強化を図ったようだが、反面、使用する資源も相当増えていると思われるし、機能によっては動作速度の低下も覚悟しておかないといけない。そういったメリット・デメリットを比較して、MySQL-5.5に移行するかどうかを考えればいいと思う。いずれは新しいバージョンに移行せざるを得ない時が来るのだが、慌てる必要は無いのである。
注意すべき点を一つ挙げれば、MySQL-5.5では、既定データベースエンジンがInnoDBになった。 筆者の様な日曜プログラマ的な使用では、トランザクションを必要とする程のシステムはいらないので、ちょっと余計なお世話に感じる。筆者としては、MySQLでトランザクション機能を使うというのは「無理な方向の使い方」に思えて仕方ないのだが、今回の機能変更などを見ると、Oracleは必ずしもそうは考えていないような印象で、むしろ、このまま肥大化の道をたどりそうな気配も感じる。
さて、実際に導入する手順を記しておく。
筆者が現在使用しているサーバは、FreeBSD-7-STABLEとCentOS-5.7の2種類のOSを使用しているので、それぞれについて記述する。
1.共通
作業前の基本、バックアップを行う。# mysqldump -p --all-databases > ./all-data_20111203.sql
# cp -p /etc/my.cnf /etc/my.cnf_20111203_old
http://dev.mysql.com/downloads/mysql/#downloadsから該当するOS用のMySQL-5.5最新パッケージを取得する。
※1 FreeBSDのportsを介して導入する場合は不要。
※2 CentOSの場合は、次のrpmパッケージを取得する(i86マシン+64bit OSの場合)。※※ remiリポジトリを使ってyumで導入する方法もある。(参照: Install MySQL 5.5.18 on Fedora 16/15, CentOS/Red Hat (RHEL) 6/5.7)
- MySQL-server-5.5.18-1.linux2.6.x86_64.rpm
- MySQL-client-5.5.18-1.linux2.6.x86_64.rpm
- MySQL-devel-5.5.18-1.linux2.6.x86_64.rpm
- MySQL-shared-compat-5.5.18-1.linux2.6.x86_64.rpm
オプションファイル(/etc/my.cnf)の一部修正を行う。
次のオプション指定行はコメントアウトする(下線行を追加した)。[mysqld]
character-set-server=utf8mb4
#default-character-set=utf8
collation-server=utf8mb4_general_ci
#collation-server=utf8_general_ci
#log-long-format
2.CentOS-5.7
データベースを停止する。# /etc/rc.d/init.d/mysqld stop
既存データベースの関連ファイル群を削除する。
# yum remove mysql-server.x86_64 mysql-devel.x86_64
perl-DBD-MySQL.x86_64などのMySQLドライバが共連れで削除されてしまった場合は、新データベース導入時にあらためて導入し直すこと。
新しいデータベースを導入する。
# rpm -ivh MySQL-server-5.5.18-1.linux2.6.x86_64.rpm MySQL-client-5.5.18-1.linux2.6.x86_64.rpm MySQL-devel-5.5.18-1.linux2.6.x86_64.rpm MySQL-shared-compat-5.5.18-1.linux2.6.x86_64.rpm
データベースドライバ(perl-DBD-MySQL-4.014-1.el5.rfx.x86_64.rpm)を導入する。
# yum localinstall perl-DBD-MySQL-4.014-1.el5.rfx.x86_64.rpm
データベースを起動する。
# /etc/rc.d/init.d/mysql start
Oracle提供のrpmパッケージの場合、起動ファイルがCentOSのbaseリポジトリ配布版と異なる名前(/etc/rc.d/initd/mysql)で作成されるので、必要に応じて、名前を変更するなどの対応を行う。
Oracleのrpmパッケージでは、導入時に自動起動設定が削除されるので、あらためて自動設定を行う必要がある。# /sbin/chkconfig --add mysql
# /sbin/chkconfig mysql on
# /sbin/chkconfig --list mysql
mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off
3.FreeBSD-7-STABLE
/usr/local/etc/pkg_tools.confにビルドオプションを追記(太字部)する。MAKE_ARGS = {
'databases/mysql41-client' => 'WITH_CHARSET=ujis WITH_XCHARSET=all',
'databases/mysql41-server' => 'WITH_CHARSET=ujis WITH_XCHARSET=all',
'databases/mysql50-client' => 'WITH_CHARSET=ujis WITH_XCHARSET=all',
'databases/mysql50-server' => 'WITH_CHARSET=ujis WITH_XCHARSET=all',
'databases/mysql51-client' => 'WITH_CHARSET=ujis WITH_XCHARSET=all',
'databases/mysql51-server' => 'WITH_CHARSET=ujis WITH_XCHARSET=all',
'databases/mysql55-client' => 'WITH_CHARSET=ujis WITH_XCHARSET=all',
'databases/mysql55-server' => 'WITH_CHARSET=ujis WITH_XCHARSET=all',
'editors/openoffice.org-2' => 'LOCALIZED_LANG=alllangs',
'*' => 'WITHOUT_IPV6=yes',
}
データベースを停止する。
# /usr/local/etc/rc.d/mysql-server stop
旧バージョンのMySQL関連モジュールをportsシステムを介して削除する。
# pkg_deinstall -fv mysql-client-5.1.60 mysql-server-5.1.60 p5-DBD-mysql51-4.019
新バージョンのMySQL関連モジュールをportsシステムを介して導入する。
# portinstall -vp databases/mysql55-server databases/p5-DBD-mysql55
データベースを起動する。
# /usr/local/etc/rc.d/mysql-server start
4.共通
mysql_upgradeでテーブルフォーマットのアップグレードを行う。# mysql_upgrade -p
Enter password:Looking for 'mysql' as: mysql Looking for 'mysqlcheck' as: mysqlcheck Running 'mysqlcheck with default connection arguments Running 'mysqlcheck with default connection arguments books.booklist error : Table upgrade required. Please do "REPAIR TABLE `booklist`" or dump/reload to fix it! epco_advisory.Company error : Table upgrade required. Please do "REPAIR TABLE `Company`" or dump/reload to fix it! events.Event OK mysql.columns_priv OK mysql.db OK mysql.event OK mysql.func OK mysql.general_log OK mysql.help_category error : Table upgrade required. Please do "REPAIR TABLE `help_category`" or dump/reload to fix it! mysql.help_keyword error : Table upgrade required. Please do "REPAIR TABLE `help_keyword`" or dump/reload to fix it! mysql.help_relation OK mysql.help_topic error : Table upgrade required. Please do "REPAIR TABLE `help_topic`" or dump/reload to fix it! mysql.host OK mysql.ndb_binlog_index OK mysql.plugin OK mysql.proc error : Table upgrade required. Please do "REPAIR TABLE `proc`" or dump/reload to fix it! mysql.procs_priv OK mysql.servers OK mysql.slow_log OK mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK mysql.time_zone_name error : Table upgrade required. Please do "REPAIR TABLE `time_zone_name`" or dump/reload to fix it! mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK test.userpref OK test_inno.data OK Repairing tables books.booklist OK mysql.help_category OK mysql.help_keyword OK mysql.help_topic OK mysql.proc OK mysql.time_zone_name OK Running 'mysql_fix_privilege_tables'... OK #
apache等、MySQLを参照するアプリケーション動作させている場合は、それぞれをリスタートさせる。
5.プログラム中SQLの一部修正
テーブルロックを行っている場合で、プログラム中でviewを参照している時、LOCK TABLESにviewの定義も加えないと、実行時エラーになるようである。
また、筆者の環境の一つ(Oracle版rpmパッケージ)では、クライアント側のキャラクタ設定コマンドSET NAMES eucjpmsを、SET NAMES ujisに変更しなければならなかった。
これはビルドオプションの関係で、eucjpmsが組み込まれずに構築された為と考えられる。キャラクタセットの定義上、eucjpmsは変らず存在する(参照: 9.1.14. Character Sets and Collations That MySQL Supports)。
MySQLにログインした後、次の様にすると、その環境で使用可能なキャラクタセットが確認できる。
mysql> SHOW CHARACTER SET;
(12月5日追記)と、書いておきながら、調べてみると、Oracle版パッケージでも、ちゃんとeucjpmsは組み込まれていた。
してみると、Perl-DBD-mysqlドライバ辺りが原因かもしれない。
(12月11日追記)perl-DBD-MySQL-4.014-1.el5.rfx.x86_64.rpmを導入した所、eucjpmsの障害は解消した。やはり、ドライバが古いせいだった様である。
ソースからビルドしたい方はこちらのサイトを参考にされたい。
データベースをアップグレードした直後にCGIがエラーになった場合は、上記の点を確認して欲しい。








コメントする