2012年12月27日木曜日

mysqld_multiを使って強引に4つのメジャーバージョンを使い分ける

ちょこちょこ試したりする為に1つのVMにいくつもMySQLを入れてたりするけれど、
いちいちmy.cnfを書き分けるのが嫌になったのでついにmysqld_multiを使うことに。

mysqld_multiはたぶん1つのバイナリで複数のインスタンスを立ち上げることをメイン用途として想定している気がするけれど、意外と何とかなったのでメモ。


# ls -l /usr/mysql

合計 16
drwxr-xr-x 10 mysql mysql 4096 12月 27 16:23 2012 5.0.96
drwxr-xr-x 10 mysql mysql 4096 12月 27 11:26 2012 5.1.66
drwxr-xr-x 13 mysql mysql 4096 12月 27 11:44 2012 5.5.29
drwxr-xr-x 13 mysql mysql 4096 12月 27 16:48 2012 5.6.9

ソースコンパイルの時に、./configure --prefix=/usr/mysql/x.x.xxだったり
cmake -DCMAKE_INSTALL_PREFIX=/usr/mysql/x.x.xxだったりでまるっと突っ込んでいる。


強引にいったmy.cnfはこちら。



[mysqld_multi]
user       = mysqld_multi
password   = mysqld_multi
log        = /var/log/mysqld_multi.log

[mysqld]
user = mysql

log-error = error.log
log-warnings = 1
log-bin = bin
relay-log = relay
loose-binlog-format = mixed
loose-skip-general-log
loose-general-log-file = general.log
loose-slow-query-log
loose-slow-query-log-file = slow.log
long-query-time = 1
loose-log-output = FILE

character-set-server = utf8

innodb-buffer-pool-size = 1G
innodb-log-file-size = 128M
innodb-file-per-table = 1

[client]

[mysql]
no-auto-rehash

[mysqldump]
single-transaction
triggers
routines
events

[mysqld50]
basedir    = /usr/mysql/5.0.96
mysqld     = /usr/mysql/5.0.96/bin/mysqld_safe
socket     = /usr/mysql/5.0.96/data/mysql.sock
port       = 64050
pid-file   = /usr/mysql/5.0.96/data/mysql.pid
datadir    = /usr/mysql/5.0.96/data
log-slow-queries = slow.log
skip-log = general.log

[mysqld51]
basedir    = /usr/mysql/5.1.66
mysqld     = /usr/mysql/5.1.66/bin/mysqld_safe
socket     = /usr/mysql/5.1.66/data/mysql.sock
port       = 64051
pid-file   = /usr/mysql/5.1.66/data/mysql.pid
datadir    = /usr/mysql/5.1.66/data

[mysqld55]
basedir    = /usr/mysql/5.5.29
mysqld     = /usr/mysql/5.5.29/bin/mysqld_safe
socket     = /usr/mysql/5.5.29/data/mysql.sock
port       = 64055
pid-file   = /usr/mysql/5.5.29/data/mysql.pid
datadir    = /usr/mysql/5.5.29/data

[mysqld56]
basedir    = /usr/mysql/5.6.9
mysqld     = /usr/mysql/5.6.9/bin/mysqld_safe
socket     = /usr/mysql/5.6.9/data/mysql.sock
port       = 64056
pid-file   = /usr/mysql/5.6.9/data/mysql.pid
datadir    = /usr/mysql/5.6.9/data


5.0~5.6まで共通で使う部分を[mysqld]セクション、
バージョンごと個別の部分を[mysqldxx]セクションに書き込む。

[mysqldxx]セクションは[mysqld-x.x]セクション
(x.x以上のバージョンだったらこのセクション読む、というやつ)と違ってただの名前付けなので、
mysqld_multiから起動した時にだけ個々のセクションを読みに行く。
ので、動作確認でbin/mysqld_safeから上げた時に「あれれ?」となったり。。

この状態で、

# /usr/mysql/5.5.29/bin/mysqld_multi start 56

とかやると、5.6のインスタンスが起動できたり、
(mysqld_multiはただのラッパーなので、取り合えずGAバージョンのmysqld_multiを使っている)

# /usr/mysql/5.5.29/bin/mysqld_multi stop 51-56

とかやると5.1, 5.5, 5.6のインスタンスがいっぺんに止められたりする。


ちなみに.bashrcもひどいことになった。


alias mysqld_multi=/usr/mysql/5.5.29/bin/mysqld_multi
alias mysql50="/usr/mysql/5.0.96/bin/mysql -S /usr/mysql/5.0.96/data/mysql.sock -P 64050"
alias mysql51="/usr/mysql/5.1.66/bin/mysql -S /usr/mysql/5.1.66/data/mysql.sock -P 64051"
alias mysql55="/usr/mysql/5.5.29/bin/mysql -S /usr/mysql/5.5.29/data/mysql.sock -P 64055"
alias mysql56="/usr/mysql/5.6.9/bin/mysql -S /usr/mysql/5.6.9/data/mysql.sock -P 64056"
alias mysqladmin50="/usr/mysql/5.0.96/bin/mysqladmin -S /usr/mysql/5.0.96/data/mysql.sock -P 64050"
alias mysqladmin51="/usr/mysql/5.1.66/bin/mysqladmin -S /usr/mysql/5.1.66/data/mysql.sock -P 64051"
alias mysqladmin55="/usr/mysql/5.5.29/bin/mysqladmin -S /usr/mysql/5.5.29/data/mysql.sock -P 64055"
alias mysqladmin56="/usr/mysql/5.6.9/bin/mysqladmin -S /usr/mysql/5.6.9/data/mysql.sock -P 64056"



localhost向けにはsocket、-hでTCP/IP接続を使う場合と両方に備えて-Sと-Pが両方してあったり。
(つまり、この1台以外にもこんな環境が)

年末の大掃除の代わりに、ってことで。。(掃除しろ。。)



0 件のコメント :

コメントを投稿