mysqld_multiで複数のインスタンスを立ち上げ

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.
 :

使ってはならない風のメッセージが表示されるので使いませんでした・・・