1つのサーバで複数のMySQLのインスタンスを立ち上げるために mysqld_multi を使ったときのメモです。
使用した版は 5.1.61-1.el6_2.1 (CentOS6) です。
設定ファイルを作成します。
vi /etc/my.cnf
とりあえず以下の様に作成します、基本的な設定のみです。
# クライアントの設定 [client] default-character-set = utf8 # mysqld_multiの設定 [mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin log = /var/log/mysql/multi.log # 全てのインスタンスで共通の設定 [mysqld] character-set-server = utf8 default-storage-engine = INNODB log-warnings general_log # インスタンス1の設定 [mysqld1] port = 3306 datadir = /var/lib/mysql1 pid-file = /var/lib/mysql1/mysql.pid socket = /var/lib/mysql1/mysql.sock log-error = /var/log/mysql/error1.log general_log_file = /var/log/mysql/query1.log # インスタンス2の設定 [mysqld2] port = 3307 datadir = /var/lib/mysql2 pid-file = /var/lib/mysql2/mysql.pid socket = /var/lib/mysql2/mysql.sock log-error = /var/log/mysql/error2.log general_log_file = /var/log/mysql/query2.log
mysqld1 とか mysqld2 のような、mysqldN のセクションが、インスタンスごとの設定です。この例では 1 と 2 が設定されています。
それぞれのインスタンス用のデータディレクトリを作成します。
mysql_install_db --datadir=/var/lib/mysql1 --user=mysql mysql_install_db --datadir=/var/lib/mysql2 --user=mysql chown -R mysql:mysql /var/lib/mysql1 /var/lib/mysql2
ログディレクトリを作成します。
mkdir /var/log/mysql chown mysql:mysql /var/log/mysql |<< 以下のコマンドで、全てのインスタンスが起動します。 >|| mysqld_multi start
以下のように指定することもできます。
mysqld_multi start 2 ※ 2 のみ mysqld_multi start 2-5 ※ 2〜5 全て mysqld_multi start 3,5 ※ 3 と 5 mysqld_multi start 1-3,5 ※ 1〜3、及び、5
以下のコマンドで、起動状態を表示します。
mysqld_multi report
起動していれば以下のように「is running」表示されます。
Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running
それぞれのインスタンスに接続できるか確認します。それぞれ異なるデータディレクトリが表示されれば成功です。
mysql -h 127.0.0.1 --port 3306 -e "SHOW VARIABLES LIKE 'datadir'" mysql -h 127.0.0.1 --port 3307 -e "SHOW VARIABLES LIKE 'datadir'"
以下のコマンドで全てのインスタンスを停止します。
mysqld_multi stop
停止していれば「mysqld_multi report」で以下のように「is not running」と表示されます。
Reporting MySQL servers MySQL server from group: mysqld1 is not running MySQL server from group: mysqld2 is not running
忘れないようにログローテートの設定も行なっておきます。
vi /etc/logrotate.d/mysql
以下のように、両方のインスタンスに flush-logs をします。
/var/log/mysql/*.log { notifempty daily rotate 10 missingok sharedscripts postrotate if test -x /usr/bin/mysqladmin; then /usr/bin/mysqladmin --socket=/var/lib/mysql1/mysql.sock ping &>/dev/null && \ /usr/bin/mysqladmin --socket=/var/lib/mysql1/mysql.sock flush-logs /usr/bin/mysqladmin --socket=/var/lib/mysql2/mysql.sock ping &>/dev/null && \ /usr/bin/mysqladmin --socket=/var/lib/mysql2/mysql.sock flush-logs fi endscript }
ping や flush-logs も mysqld_multi から出来ればいいのですが・・・
似たようなものに「mysqlmanager」というものがあるみたいですが、
# /usr/libexec/mysqlmanager --help WARNING: This program is deprecated and will be removed in 6.0. :
使ってはならない風のメッセージが表示されるので使いませんでした・・・