ちょっと硬派なコンピュータフリークのBlogです。

カスタム検索

2010-07-27

モダンなMySQLの開発環境の構築方法

遅ればせながら


に続いてみる。MySQLは言語じゃないけど。

コンパイラ等

MySQLをソースからビルドするのでなければコンパイラ等は必要ないけど、どうせアプリ開発に必要なので「MySQLなんかいつでもハックしてやるぞ!」という意気込みを示すために入れておこう。OSXならXcode、LinuxならGCC。最新のソースコードじゃないとヤダ!という粋な人にはBazaarのインストールもお勧めしたい。Bazaarは言わずと知れた分散バージョン管理システムであり、MySQL開発チームも採用している。最新のソースコードは次のコマンドでゲット可能だ。
shell> bzr branch lp:mysql-server/5.1 mysql-5.1
WindowsならVCを入れておこう。(詳細は割愛!)

バージョン

どのバージョンのMySQLを使えばいいのか。これは頭の痛い選択肢だろう。現在最新の安定版は5.1であり、今現時点はこのバージョンが王道だ。ただし、日本語の全文検索が欲しいときには5.0系のフォークであるTritonnを使う必要がある。5.1の機能(例えばパーティショニング)を使いつつ、日本語全文検索を使うというのは残念ながらまだ出来ない。

間違っても化石化した古いバージョン(3.23/4.0/4.1)を使おうとは思わないことだ。バグも残っているし処理速度も遅い。

開発版の5.5はどうか。開発版とはいえ、しょっちゅうクラッシュするような品質ではないのだが、もちろん安定版ではないので一定のリスクがつきまとう。(特に予告のない仕様変更がいちばんのリスクだ。)従って、5.5の新機能である4バイトUTF-8などが、そのリスクに見合うだけの価値があると判断出来る場合には、5.5をするといいだろう。もちろんスキモノ諸君による果敢なるチャレンジは大歓迎だ。

ドライバ

公式に配布されているドライバは、以下のサイトで手に入る。
http://dev.mysql.com/downloads/connector/

ここで注目したいのはMySQL native driver for PHP(通称mysqlnd)だ。PHPからMySQLを使う人は多いと思うのだが、そのときドライバはこのmysqlndをチョイスされたい。mysqlndの利点は2つある。ひとつはパフォーマンス。オリジナルのmysql(i)拡張およびPDO_MYSQLよりも速い。そしてライセンス。mysqlndはGPLv2ではなくPHPライセンスなのだ。使い方などはこちらのマニュアルなどを参照して頂きたい。

Perl/Python/Rubyなどの言語用には公式に配布されているドライバは存在しない。そのため、Perlの場合はCPANからDBD::mysqlを、Rubyの場合にはMySQL/RubyもしくはRuby/MySQL(Pure Ruby実装)をgemで、Pythonの場合にはMySQLdbもしくはMySQL Connector/Pythonをインストールしよう。

設定

開発環境であれば、殆どの設定をデフォルトで使ってしまっても問題はない。昨今のマシンの速さは凄まじく、多少の設定変更をほどこした程度では体感速度にほとんど影響はないのである。従って、これだけは設定しておけ!というのは文字コードとInnoDBログファイルサイズだろう。(ログファイルのサイズを後で変更するのは面倒だから。)大きなデータを扱う場合には、InnoDBバッファプールも割り当てておくといい。もちろん、本番環境およびテスト環境ではもっとちゃんとパラメーターを吟味しないといけないけど、開発環境だったら最低限の設定だけで、後はデフォルトでもモウマンタイだ。

文字コードの設定と言えばskip_character_set_client_handshakeオプションを使っているのをよく見かけるが、はっきり言ってこれはバッドノウハウである。MySQLサーバーとの接続に用いる文字はクライアントが決定するべきだ。理由はクライアント側に設定が仕込まれてあれば、クライアント側のコードの移植性が高まるから。(文字コードの変換が必要な場合には、サーバー側でやってくれる。)そもそもskip_character_set_client_handshakeはクライアント側でうまく文字コードの設定が出来なかった時代の遺物であり、モダンな環境での利用は避けるべきなのである。

また、文字コードの設定は、クライアント側ではdefault_character_set、サーバー側ではcharacter_set_serverである。以前のバージョンではサーバー側もdefault_character_setであったが、MySQL 4.1においてオプション名が変更された。MySQL 5.5ではサーバー側でdefault_character_setが使えなくなっている。

以下、設定例(my.cnf)である。
[mysql]
default_character_set=utf8

[mysqld]
character_set-server=utf8
innodb_log_file_size=64M
innodb_buffer_pool_size=128M
また、インストールしたら最後の仕上げとしてmysql_secure_installationを実行しておこう。

InnoDBを使おうず。

モダンなアプリケーションではInnoDBを利用するべきだ。MyISAMはクラッシュ時に破損するおそれがあるし、更新性能がスケールしない。最近は参照性能でもInnoDBに水をあけられつつある。InnoDBを利用すると言うことはトランザクションに対応しなければならないということを示すので、アプリに手を入れる必要があったりして少々面倒かも知れない。(参考: MyISAMからInnoDBへ切り替えるときの注意点)しかし、性能や耐障害性を考えると、デフォルトはInnoDBを利用するべきである。MyISAMは日本語全文検索やレポーティング用のデータ抽出など特定の用途に利用するといいだろう。

MySQL 5.1.46以降のバージョンを利用するなら、InnoDBの次期バージョンであるInnoDB Plugin 1.0がGAになっている。このバージョンではクラッシュリカバリの性能が大幅に向上しているので、新機能が必要ない場合でもこのバージョンにしておくだけでメリットがあるだろう。設定方法などについてはこちらの記事を参照のこと。

MySQL Sandbox

複数のインスタンスをひとつのホストにインストールしたい場合には、MySQL Sandboxを利用しない手はない。tar.gz版のパッケージがあれば、コマンドひとつでテスト環境を自動的に構築してくれる。異なるバージョン間で挙動の違いなどを確認したい場合には至極便利である。インストール等はドキュメントの指示に従って欲しい。(以下はドキュメントの抜粋。もちろんcpanで一発インストールしてもOK。)
   # as root
   perl Makefile.PL 
   make
   make test
   make install

   # as normal user
   export PATH=$HOME/usr/local/bin:$PATH
   export PERL5LIB=$HOME/usr/local/lib/perl5/site_perl/5.8.8
   perl Makefile.PL PREFIX=$HOME/usr/local
   make
   make test
   make install
使い方は至極簡単だ。例えばMySQL 5.5.5をインストールしてインスタンスを設定してログインするには次の2つのコマンドを実行すれば良い。
shell> make_sandbox mysql-5.5.5-m3-osx10.6-x86_64.tar.gz
shell> sb 5.5.5
まあ細かいことはドキュメントを見るべし。サンドボックスを使う場合、設定値はほとんどデフォルトに近いので、自分のオリジナルの設定値を最初から追加しておきたい場合には-mオプションを使うといい。

使用例
shell> make_sandbox 5.5.5 -m $HOME/tmp/my-orig.cnf

mysqlコマンドのカスタマイズ

生産性を向上させたいと思ったら、ツールをカスタマイズするのが良い。mysqlコマンドは常用するツールであるからカスタマイズの効果は高い。以下のページなどを参考にして、いろいろカスタマイズするといいだろう。
なお、カスタマイズの味付けは人によって好みがわかれるため、設定は/etc/my.cnfのような共通のファイルではなく~/.my.cnfで行うようにしよう。

MySQL Workbench

GUIがいいか、CLIがいいかは好みが分かれるところである。やっぱりGUIがいいぜ!という人には、ぜひMySQL Workbenchの利用をお勧めしたい。最新バージョンの5.2では、EER図によるモデリング、SQLの実行とテーブルデータの編集、サーバー管理などの機能を兼ね備えている。特にEER図によるモデリングはCLIでは出来ないワザであり、視覚的にテーブルの設計をしたい諸氏には必携アイテムであると言えよう。(参考: そろそろMySQL Workbench 5.2についてひとこと言っておくか。

レプリケーション

MySQLの魅力は「安い・速い・止まらない」ということが真っ先に挙げられるが、さらにその上が存在する。それがレプリケーションである。これほどまで簡単に、そして気軽にレプリケーションが出来るRDBMSプロダクトは他にないだろう。MySQLを本番環境で使う場合、レプリケーションを「使わない」ということは希ですらある。

先日、hbstudy #13においてレプリケーションについて話をする機会を頂いた。スライドをSlideshareにアップしておいたので参照されたい。
Art of MySQL Replication

Maatkit

Maatkitは人気の高い社外製ツール群である。便利なツールが多いので、日々の管理業務において幸せになれること請け合いである。機能や使い方については、marqs氏のスライド実践ハイパフォーマンスMySQL 第2版などを参照のこと。

0 コメント:

コメントを投稿