MySQL-5.5に更新してみた

| コメント(0)

私設データベース解析の都合で、今年になって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の場合)。
  • 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
※※ remiリポジトリを使ってyumで導入する方法もある。(参照: Install MySQL 5.5.18 on Fedora 16/15, CentOS/Red Hat (RHEL) 6/5.7

オプションファイル(/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がエラーになった場合は、上記の点を確認して欲しい。

コメントする

このブログ記事について

このページは、山椒魚が2011年12月 3日 17:44に書いたブログ記事です。

ひとつ前のブログ記事は「お、地震だ」です。

次のブログ記事は「Movable Type config using utf8mb4」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

おすすめサイト

おすすめ

サーバ/OS技術書

技術書一般

  • 長沢工:天体の位置計算 増補版

    長沢工:天体の位置計算 増補版

    天体の視位置を計算する「位置天文学」の入門書。ロングセラー。刊行が古いために、具体的計算に使われている星表等の定数は、1984年以前の計算システムによるものである。しかし、現在、新刊で入手可能な同種の書籍は限られており、天体位置計算の考え方が変った訳ではないので、現在でも充分に役立つだろう。

いろいろ