Mysqld multiで異なるバージョンのMySQLを起動する。
提供:MySQL Practice Wiki
mysqld_multiはperlで記述されたプログラムで、複数のmysqldインスタンスを起動・停止するのに便利である。
同じバージョンのサーバーインスタンス(つまりbasedirが同じ)を起動する分には問題ないが、basedirが異なるMySQLサーバーを起動しようとするとたまにエラーが起こる。その際、以下のようなエラーメッセージがログに記録されることがある。
080509 17:44:54 mysqld started 080509 17:44:54 [ERROR] Error message file '/usr/local/mysql-5.0.51b-osx10.5-x86/share/mysql/english/errmsg.sys' had only 475 error messages, but it should contain at least 476 error messages. Check that the above file is the right version for this program! 080509 17:44:54 [ERROR] Aborting
[mysqldN](Nは正の整数)セクションでbasedirをしてもこのようなエラーが起きる。違うバージョンのMySQLサーバーをmysqld_multiを使って起動することは出来ないのか?いや、そんなことはない。
原因
上記のようなエラーが出るのは、mysqld_safeの制限に起因するものだ。mysqld_safeはカレントワーキングディレクトリにあるmysqldとデータディレクトリを探すようになってしまっている。そのため、希にインストールディレクトリ(basedir)へ移動してから実行してやる必要があるのだ。以下のように。
shell> cd /usr/local/mysql-5.0.51b-osx10.5-x86 shell> bin/mysqld_safe &
詳細はこちらのマニュアルを参照。
ではどうすればいいのか。
対策
mysqld_multiの設定には、[mysqldN](Nは正の整数)というセクションを使う。このセクションではbasedir以外にも、起動するmysqld_safeまたはmysqldをインスタンスごとに設定することができる。以下のように書くとエラーになるが、
[mysqld10] basedir=/usr/local/mysql-5.0.51b-osx10.5-x86 mysqld=/usr/local/mysql-5.0.51b-osx10.5-x86/bin/mysqld_safe socket=...
以下のように書けば問題なくインスタンスを起動できる。
[mysqld10] basedir=/usr/local/mysql-5.0.51b-osx10.5-x86 mysqld="cd /usr/local/mysql-5.0.51b-osx10.5-x86; bin/mysqld_safe" socket=...