mysqld_multi 概要
mysqld_multiはmysqld ( MySQLサーバ ) プロセスを複数立ち上げる手法のひとつです。この方法を使用すれば、1つのOS上でbackupやreplicationの練習をする事ができます。このページではmysqld_multiの設定方法, 使い方について説明します。
複数プロセスのmysqld ( MySQLサーバ ) を立ち上げる方法は大きく分けて以下の3つがあります。
- オプションを直接指定する方法
- 複数のmy.cnfを作成する方法
- mysqld_multiを使用する方法
実務で使用するのは、”mysqld_multiを使用する方法”のみであると思います。しかし、MySQLの仕様理解のために、まずは”オプションを直接指定する方法”と”複数のmy.cnf”を作成する方法について説明します。
MySQL オプション直接指定
MySQL オプション直接指定 – シングルプロセスの起動
MySQLの仕様理解のため、敢えて起動スクリプトを使用しない軌道方法について動作確認します。MySQLの実態は/usr/sbin/mysqldです。/usr/sbin/mysqldにデータディレクトリなどを引数として渡すとmysqlを実行する事ができます。
しかし、実際には/usr/sbin/mysqldを使用してMySQLサーバを起動する事はありません。実際は、/usr/bin/mysqld_safeというmysqldラッパーを使用してMySQLサーバを起動します。mysqld_safeは多重起動など危険な状態でのMySQL起動を避ける処理が組み込まれています。
以下のようにmysqld_safeにデータディレクトリを指定して起動します。
# mysqld_safe --datadir=/var/lib/mysql 2>&1 &
PSコマンドによりmysqld ( MySQLサーバ ) が確かに起動している事を確認します。また、mysql (MySQL クライアント) によるログインが可能である事を確認します。
[root@localhost ~]# ps aux | grep mys root 2355 0.0 0.1 9200 1432 pts/0 S 17:57 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql mysql 2443 0.7 44.2 1010136 451728 pts/0 Sl 17:57 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/skr145.changineer.info.err --pid-file=/var/lib/mysql/localhost.pid root 2468 0.0 0.0 6380 684 pts/0 S+ 17:58 0:00 grep mys [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# mysql -uroot -e "show databases" +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ [root@localhost ~]#
MySQL オプション直接指定 – シングルプロセスの停止
mysqlを停止される方法は以下2通りを挙げる事ができます。
- mysqladminを用いた停止
- SIGKILLシグナルの送信
mysqladminコマンドを以下のように使用すると、mysqld ( MySQLサーバ ) プロセスを停止される事ができます。
[root@localhost~]# mysqladmin -uroot shutdown 140818 12:16:44 mysqld_safe mysqld from pid file /var/lib/mysql/skr145.changineer.info.pid ended [1]+ Done mysqld_safe --datadir=/var/lib/mysql 2>&1 [root@localhost ~]#
SIGKILLを用いてmysqld ( MySQLサーバ ) プロセスを停止させる事もできます。まずは、mysqld ( MySQLサーバ ) のプロセス番号を確認します。
[root@localhost ~]# ps aux | grep mys root 2355 0.0 0.1 9200 1432 pts/0 S 17:57 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql mysql 2443 0.2 44.8 1075932 457444 pts/0 Sl 17:57 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/skr145.changineer.info.err --pid-file=/var/lib/mysql/skr145.changineer.info.pid root 2484 0.0 0.0 6380 680 pts/0 S+ 18:02 0:00 grep mys [root@localhost ~]#
以下のようにSIGKILLシグナルを送ります。MySQLのログを確認すると、SIGKILLを送られた場合は正常に終了処理が実行されている事が分かります。
[root@localhost ~]# 140817 18:03:06 mysqld_safe mysqld from pid file /var/lib/mysql/skr145.changineer.info.pid ended [1]+ Done mysqld_safe --datadir=/var/lib/mysql 2>&1 [root@localhost ~]#
MySQL オプション直接指定 – マルチプロセス起動時の考慮点
複数のmyqld ( MySQLサーバ ) プロセスを起動する場合は、データベースファイルなどのリソースに重複が発生してしまうと、データが壊れてしまいます。 mysqld ( MySQLサーバ ) 複数プロセス起動時に、重複しないよう気をつけなければならないパラメタは以下の通りです。
項目 | オプション | 説明 |
---|---|---|
データディレクトリ | --datadir | 分離しなくてもMySQLの起動は可能ですが、複数インスタンスから同時に書き込みを行うとデータ破損のリスクがあります。 |
一時ディレクトリ | --tmpdir | 分離しなくても問題ありませんが、トラブルシューティング時にどのインスタンスが生成した一時ファイルなのかを追跡しやすくするために、分離しておいた方が無難です。 |
TCPポート | --port | TCP/IPの仕様上、重複は許されません。 |
Socketファイル | --socket | ドメインソケットの仕様上、重複は許されません。 |
PIDファイル | --pid-file | 重複は許されません。しかし、省略時はデータディレクトリに作成されるので、省略可能な設定です。 |
MySQL オプション直接指定 – マルチプロセス起動 停止
複数プロセスのmysqld ( MySQLサーバ ) を起動させる前準備として、複数プロセス用のデータディレクトリと一時ディレクトリを作成します。
# cp -rp /var/lib/mysql /var/lib/mysql-1 # cp -rp /var/lib/mysql /var/lib/mysql-2 # sudo -u mysql mkdir /var/tmp/mysql-1 # sudo -u mysql mkdir /var/tmp/mysql-2
以下のようなコマンドで複数のmysqld ( MySQLサーバ ) を起動させます。ポート番号やデータディレクトリが分離されるように、以下のようなオプションを指定して下さい。
# mysqld_safe \ --datadir=/var/lib/mysql-1 \ --socket=/tmp/mysql-1.sock \ --port=3307 \ --tmpdir=/var/tmp/mysql-1 2>&1 > /dev/null & # mysqld_safe \ --datadir=/var/lib/mysql-2 \ --socket=/tmp/mysql-2.sock \ --port=3308 \ --tmpdir=/var/tmp/mysql-2 2>&1 > /dev/null &
netstat, psコマンドなどにより、mysqld ( MySQLサーバ ) の起動を確認します。
# netstat -ano | grep 330[78] tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN off (0.00/0/0) # # # ps aux | grep -i mysql root 5536 0.0 0.1 106224 1140 pts/1 S 13:47 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql-1 --socket=/tmp/mysql-1.sock --port=3307 --tmpdir=/var/tmp/mysql-1 mysql 5671 0.8 42.2 1011052 431056 pts/1 Sl 13:47 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql-1 --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --tmpdir=/var/tmp/mysql-1 --log-error=/var/lib/mysql-1/backend.changineer.info.err --pid-file=/var/lib/mysql-1/backend.changineer.info.pid --socket=/tmp/mysql-1.sock --port=3307 root 5702 0.0 0.1 106224 1408 pts/1 S 13:47 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql-2 --socket=/tmp/mysql-2.sock --port=3308 --tmpdir=/var/tmp/mysql-2 mysql 5837 1.5 43.8 1011056 447204 pts/1 Sl 13:47 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql-2 --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --tmpdir=/var/tmp/mysql-2 --log-error=/var/lib/mysql-2/backend.changineer.info.err --pid-file=/var/lib/mysql-2/backend.changineer.info.pid --socket=/tmp/mysql-2.sock --port=3308 root 5869 0.0 0.0 103244 848 pts/0 R+ 13:48 0:00 grep -i mysql #
mysql (MySQL クライアント) で接続可能である事を確認します。理由は後述しますが、–protocol=TCPまたは–host=127.0.0.1が必要になる事に注意して下さい
# mysql -uroot --port=3307 --protocol=TCP Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.14 MySQL Community Server (GPL) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
mysqladminコマンドを用いて、複数プロセスのmysqld ( MySQL サーバ ) の停止が可能である事を確認します。
[root@localhost ~]# mysqladmin -uroot --port=3307 --protocol=TCP shutdown [root@localhost ~]# [root@localhost ~]# [1]- Done mysqld_safe --datadir=/var/lib/mysql-1 --socket=/tmp/mysql-1.sock --port=3307 --tmpdir=/var/tmp/mysql-1 2>&1 > /dev/null [root@localhost ~]# mysqladmin -uroot --port=3308 --protocol=TCP shutdown [root@localhost ~]# [root@localhost ~]# [2]+ Done mysqld_safe --datadir=/var/lib/mysql-2 --socket=/tmp/mysql-2.sock --port=3308 --tmpdir=/var/tmp/mysql-2 2>&1 > /dev/null [root@localhost ~]# ps aux | grep mys root 5515 0.0 0.0 6380 684 pts/0 S+ 12:42 0:00 grep mys [root@localhost ~]#
MySQL 複数my.cnf作成
“MySQL オプション直接指定”で例示したように、mysqld ( MySQL サーバ ) にオプションを引き渡して実行するのは非常に手間です。この手間を省くために、複数の設定ファイルを作成する方法があります。
以下のような起動オプションを指定した設定ファイル、 /etc/my1.cnf, /etc/my2.cnfを作成します。
[mysqld_safe] datadir=/var/lib/mysql-1 socket=/tmp/mysql-1.sock tmpdir=/var/tmp/mysql-1 port=3307
[mysqld_safe] datadir=/var/lib/mysql-2 socket=/tmp/mysql-2.sock tmpdir=/var/tmp/mysql-2 port=3308
以下のように設定ファイルを引数で渡してMySQL ( MySQL サーバ ) を起動させます。
# mysqld_safe --defaults-file=/etc/my1.cnf 2>&1 > /dev/null & # mysqld_safe --defaults-file=/etc/my2.cnf 2>&1 > /dev/null &
mysqld_multi
mysqld_multi – 設定ファイルの作成
上記のように複数mysqld ( MySQL サーバ ) プロセスを立ち上げるのを手作業で行うのは非常に面倒です。そこで、mysqld_multiというperlスクリプトを使用すると/etc/my.cfgなどの設定を自動的に読み込み、複数プロセスのMySQLを簡単に起動する事ができます。
まず、以下のような/etc/my.cnfを作成します。[mysqldN]というセクションを作成し、その中に各プロセス固有の設定を書き込みます。
[mysqld_multi] mysqld=/usr/bin/mysqld_safe mysqladmin=/usr/bin/mysqladmin [mysqld1] datadir=/var/lib/mysql-1 socket=/tmp/mysql-1.sock tmpdir=/var/tmp/mysql-1 port=3307 [mysqld2] datadir=/var/lib/mysql-2 socket=/tmp/mysql-2.sock tmpdir=/var/tmp/mysql-2 port=3308
mysqld_multi – 起動
mysqld_multiに対応した/etc/my.cnfを作成しましたら、mysqld_multiコマンドを使用して複数のmysqldを起動させる事ができます。[mysqldN]のNという番号はGNR(option group number)と呼ばれ、引数に指定する事で特定プロセスのみを起動させる事ができます。一方、GNRを省略した場合は全てのプロセスが起動します。
mysqld_multiの実行例は以下の通りです。
[root@localhost ~]# mysqld_multi start 1
mysqld_multi – 動作確認
どのmysqld ( MySQL サーバ ) プロセスが起動しているか確認するのは、mysqld_multiコマンドを利用するのが便利です。以下のように”mysqld_mutlti report”と入力すると、起動中のmysqld ( MySQL サーバ ) プロセスを確認する事ができます。
# mysqld_multi report Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is not running #
もちろん、psコマンドやnetstatコマンドによる動作確認も可能です。
# ps aux | grep -i mysql root 17661 0.0 0.0 106228 540 pts/0 S 01:25 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/backend.changineer.info.pid mysql 17764 0.1 1.4 1010872 14896 pts/0 Sl 01:25 0:03 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/backend.changineer.info.err --pid-file=/var/lib/mysql/backend.changineer.info.pid root 17867 0.0 0.0 106224 540 pts/0 S 01:25 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql-1 --socket=/tmp/mysql-1.sock --tmpdir=/var/tmp/mysql-1 --port=3307 mysql 18004 0.1 39.5 1076672 403196 pts/0 Sl 01:25 0:03 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql-1 --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --tmpdir=/var/tmp/mysql-1 --log-error=/var/lib/mysql-1/backend.changineer.info.err --pid-file=/var/lib/mysql-1/backend.changineer.info.pid --socket=/tmp/mysql-1.sock --port=3307 root 18307 0.0 0.0 103244 848 pts/0 R+ 01:42 0:00 grep -i mysql # # # netstat -ano | grep 330[0-9] tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN off (0.00/0/0) #
mysqld_multi – 停止
mysqld_mutltiの停止はkillコマンドやmysqladminコマンドを使っても差し支えないですが、”mysqld_multi stop”と入力するのが便利な方法です。使い方はstartと同じで、GRNを省略した場合は全mysqld ( MySQL サーバ )プロセスが停止してしまう事に注意して下さい。
[root@localhost ~]# mysqld_multi stop 1
Tips
localhost と 127.0.0.1 の 違い
MySQLではlocalhostと127.0.0.1は、しばしば別物として扱われる事があります。mysql (MySQL クライアント ) で宛先ホストを省略した場合はlocalhostへ接続されます。localhost宛の接続は、–portでポート番号を指定していたとしてもデフォルト設定のドメインソケット/var/lib/mysql/mysql.sockへの接続を試みます。
従って、mysql multiなどで複数ポートを立ち上げている場合は、以下のようなポート番号のみの接続を試みると以下のようなエラーメッセージが出力されます。
# mysql -uroot --port=3307 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) #
MySQL公式ドキュメントによると、このようなエラーの場合は以下のように–protocol=TCPまたは–host=127.0.0.1を指定して回避する事が勧められています。
# mysql -uroot --port=3307 --protocol=TCP # mysql -uroot --port=3307 --host=127.0.0.1
以下に公式ドキュメント 4.2.2. Connecting to the MySQL Serverの引用を転記します。個人的には、”This occurs even if a –port or -P option is given to specify a port number.”ではなく、もう少し空気を読んだ実装にしてくれるとありがたいと思うのですが。
On Unix, MySQL programs treat the host name localhost specially, in a way that is likely different from what you expect compared to other network-based programs. For connections to localhost, MySQL programs attempt to connect to the local server by using a Unix socket file. This occurs even if a --port or -P option is given to specify a port number. To ensure that the client makes a TCP/IP connection to the local server, use --host or -h to specify a host name value of 127.0.0.1, or the IP address or name of the local server. You can also specify the connection protocol explicitly, even for localhost, by using the --protocol=TCP option.