mysqlサーバを複数インスタンス立ち上げる

レプリケーションの練習をしたいとか、spiderエンジンを試してみたいとかの動機があったので複数のmysqlサーバが必要となった。使わなくなって久しいPentiumのPCをサーバにするとかも考えたけれど面倒なのでMacvmwareでなんとかしようと思ったが2Gのメモリだと複数の仮想サーバはやはりつらい。何とかならないかと思っていたところに1つのホストで複数のインスタンスを立ち上げる手法があったのでちょっと調べてみた。

2013-05-07追記
最近のmysqlの環境構築は以下の2つがよいかなと思ってます。

<<MySQL Sandbox>>
簡単に複数の検証用環境を立ち上げることができます。
CPANからインストールできる。(http://search.cpan.org/~gmax/MySQL-Sandbox-3.0.17/lib/MySQL/Sandbox.pm)
Perlerでない場合は
wget http://search.cpan.org/CPAN/authors/id/G/GM/GMAX/MySQL-Sandbox-3.0.19.tar.gz
tar zxvf MySQL-Sandbox-3.0.19.tar.gz
cd MySQL-Sandbox-3.0.19
perl Makefile.PL
make
make test
sudo make install


<<mysqlenv>>
http://blog.livedoor.jp/xaicron/archives/54459954.html

mysqld_multiコマンド

読んだとおりのコマンドが/usr/local/mysql/binに存在している。
mysqlサーバを複数立ち上げるときに気をつけなければならないのはリソースの競合で、下記に挙げたものをそれぞれのインスタンスごとに用意する必要がある

datadir
tmpdir
port
socket
pid_file

手順その1 「mysqld_multi --example」でmy.cnfの設定例を確認

実際に/etc/my.cnfに設置したのは下記

[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = root
password = root


[mysqld]
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log-bin=mysql-bin
binlog_format=mixed

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

[mysqld1]
datadir = /var/mysql-1
port = 3307
socket = /tmp/mysql-1.sock
tmpdir = /var/mysql-1/tmp
server_id = 1

[mysqld2]
datadir = /var/mysql-2
port = 3308
socket = /tmp/mysql-2.sock
tmpdir = /var/mysql-2/tmp
server_id = 2

手順その2 各インスタンスのデータ等を初期化

細かい権限設定等は端折った。。mysqld_multiコマンドは[mysqld_multi]セクションの情報が使われるのでパスワード等は設定しておく必要がある。

mkdir /var/mysql-1
mkdir /var/mysql-1/tmp
chmod 777 /var/mysql-1/tmp
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/var/mysql-1


mkdir /var/mysql-2
mkdir /var/mysql-2/tmp
chmod 777 /var/mysql-2/tmp
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/var/mysql-2

手順その3 起動・終了

mysqld_multi {start|stop|report}

ログがdatadir以下に記録されているので、意図通りにうごかない場合はそれをチェックすること。また、mysqld_multiはperlスクリプトなので必要とあらばどういうコマンドに変換しているのかをwarnで出力してみるなどすればよいかも。

手順その4 クライアントの接続

今回設定したmy.cnfに則れば、各サーバインスタンスへの接続は下記コマンドとなる

mysql -u root -p -S /tmp/mysql-1.sock -P 3307
mysql -u root -p -S /tmp/mysql-2.sock -P 3308

ぶっちゃけこの本読みました。

まいど〜