MySQLサーバ複数起動メモ

出典: Wikimura

目次

MySQLの複数起動

Redmineは複数のプロジェクトを管理できるが、できれば複数設置できたほうが良い。 研究室のメンバ1人1人や、大きなプロジェクトあたりに1つ割り当てられるようにしたい。


Redmineは1つあたり1つのデータベースを使用する。 データベースとしてはMySQL、PostgreSQL、SQLiteが使える。 SQLiteはRedmineのディレクトリ以下にデータベースを置けるため扱いやすい。 反面、Subversionリポジトリの認証にRedmineの設定を利用するのに、SQLiteが使えなかった(設定ミス?)。 また、SQLiteはデータベースが大きくなると弱いらしい。 そんなわけで、MySQLをRedmineのデータベースとして使うことにした(Postgreは使ったこと無いのでパス)。


MySQLはデータベースをデータベースファイルに格納する。 1つのデータベースファイルには、RedmineだけでなくMediaWikiのデータベースも入っている。 できればRedmine専用のデータベースファイルを設けたい。


データベースファイルを分けるには、MySQLサーバを別に起動する必要がある。 従来のMySQLサーバは従来のデータベースファイルに、Redmine用MySQLサーバはMySQL用データベースファイルに対応付けたい。


設定すること

従来の設定は/etc/my.cnfに記述されている。 これに加えて、以下の設定でMySQLを起動する。 更に、自動起動も有効にする。

  • Port: 50001
  • DataDir: /usr/local/share/WebDAV/Redmine/database/db
  • socket: /usr/local/share/WebDAV/Redmine/database/mysql.sock
  • pidファイル: /usr/local/share/WebDAV/Redmine/database/mysql.pid
  • ユーザ: mysql


設定ファイル

[1] を参考に、/etc/my.cnf にmysqlの設定を記述する。mysql1には従来の設定を、mysql2にはredmine用の設定を書く。 redmine用のポート番号には50001番を設定した。

[mysqld_multi]
mysqld     = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user       = multi_admin

[mysqld1]
server-id  = 1
datadir    = /var/lib/mysql
socket     = /var/lib/mysql/mysql.sock
pid-file   = /var/lib/mysql/mysql.pid
language   = /usr/share/mysql/english
user       = mysql

[mysqld2]
server-id  = 2
port       = 50001
datadir    = /usr/local/share/WebDAV/Redmine/database/db
socket     = /usr/local/share/WebDAV/Redmine/database/mysql.sock
pid-file   = /usr/local/share/WebDAV/Redmine/database/mysql.pid
language   = /usr/share/mysql/english
user       = mysql


データベースファイルの設置

ユーザの指定をしないとmysqlサーバが操作できないため、mysqlサーバが起動できなくなる。 ここではデフォルトのmysql実行ユーザを指定している。

ソケットとpidファイルを置く場所もmysqlである必要がある。

mkdir /usr/local/share/WebDAV/Redmine/database
mkdir /usr/local/share/WebDAV/Redmine/database/db
chown mysql:mysql /usr/local/share/WebDAV/Redmine/database
mysql_install_db --datadir=/usr/local/share/WebDAV/Redmine/database/db --user=mysql


起動スクリプト

良く分からないが、複数起動用の起動スクリプトは /etc/init.d にない。 [2]に倣って「/etc/init.d/mysqld_multi」を作成する。 パーミッションは755とした。

  • MYSQLDIR: mysqlをインストールしたときのprefixのようなものらしい
  • MYSQLID: 起動するmysqldの番号。
    • 設定の仕方はmysqld_multi関係の文献参照。今回は1と2だけなので「1,2」とした
vi /etc/init.d/mysqld_multi
--------------------------------------------------------------------------------
#!/bin/sh

# Mysql daemon start/stop script.
#

# Usually this is put in /etc/init.d (at least on machines SYSV R4
# based systems) and linked to /etc/rc3.d/S99mysql and /etc/rc0.d/S01mysql.
# When this is done the mysql server will be started when the machine is started
# and shut down when the systems goes down.

# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 90 90
# description: A very fast and reliable SQL database engine.

# The following variables are only set for letting mysql.server find things
# if you want to affect other MySQL variables, you should make your changes
# in the /etc/my.cnf or other configuration files

MYSQLDIR=/usr
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin:$MYSQLDIR/bin
MYSQLID=1,2
export PATH

# See how we were called.
case "$1" in
start)
echo -n "Starting mysqld: "
$MYSQLDIR/bin/mysqld_multi start $MYSQLID
echo
;;
stop)
echo -n "Shutting down mysqld: "
$MYSQLDIR/bin/mysqld_multi stop $MYSQLID
echo
;;
status)
$MYSQLDIR/bin/mysqld_multi report $MYSQLID
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac

exit 0
--------------------------------------------------------------------------------
chmod 755 /etc/init.d/mysqld_multi


サーバの起動とパスワード設定

新しいデータベースファイルを作成したら、サーバを起動してパスワードを設定する。

サーバの起動は先に作った「/etc/init.d/mysqld_multi」で行う。

新しく作ったMySQLサーバは、localhostの50001番ポートで動作する (なぜかホスト指定でlocalhostが使えないらしいので、IPで指定している)。 最初はユーザがrootしかなく、パスワードも設定されていないので、以下のようにして新しいパスワードを指定する。

/etc/init.d/mysqld_multi start
mysqladmin -u root -P 50001 -h 127.0.0.1 password '新しいパスワード'

mysqld_multi restartについて

mysqld_multi restartを実行したからといって、httpdのように新しい設定がロードされるわけではないらしい 新しい設定をロードするなら、mysqldのプロセスを一旦killしてから移動しなおす必要があるらしい。

ps xa | grep mysqld

27866 pts/0    S      0:00 /bin/sh /usr/bin/mysqld_safe --server-id=1
27939 pts/0    Sl     0:00 /usr/libexec/mysqld --server-id=1
28015 pts/0    S      0:00 /bin/sh /usr/bin/mysqld_safe --server-id=2
28057 pts/0    Sl     0:00 /usr/libexec/mysqld --server-id=2

mysqldサーバの停止にあたっての注意

データベースのトランザクション中にサーバが停止されるとデータベースが破損してしまう。 データベースへのアクセスは主にhttpdなので、始めにhttpdを停止してからの方が良いらしい。

/etc/init.d/httpd stop
mysqldの操作
/etc/init.d/httpd start


自動起動有効化=

スクリプトを書いただけでは自動起動しない。 [3] CentOSではchkconfigで自動起動が設定できるらしい。ランレベルの3から5をOnにするかOffにするかが自動起動の可否を決めるらしい。

従来のmysqld起動スクリプトをOffにして、mysqld_multiを追加、ランレベル3から5をOnとする。

/sbin/chkconfig --add mysqld_multi
/sbin/chkconfig --level 35 mysqld_multi on
/sbin/chkconfig --level 35 mysqld off

Redmine用設定まとめ

MySQLサーバを動作させるまで

  1. データベースファイル、PIDファイル、ソケットファイルの置き場を作る
    • いずれもmysqlが所有者であること
    • データベースファイル設置時に、mysql実行ユーザを指定する
例: database以下にPID、ソケットファイルを置く
    database/db以下にデータベースファイルを置く
mkdir /usr/local/share/WebDAV/Redmine/database
mkdir /usr/local/share/WebDAV/Redmine/database/db
chown mysql:mysql /usr/local/share/WebDAV/Redmine/database
mysql_install_db --datadir=/usr/local/share/WebDAV/Redmine/database/db --user=mysql
  • /etc/my.cnfを書き換える
    • mysqldの後にID(数字)をつける
    • ポート、データベースファイル等を指定する
  • 起動スクリプトを追加する
    • 起動スクリプトを使ってデータベースを起動する
    • 従来のデータベースの設定が変わる場合、従来のプロセスをkillしてから行う
    • データベースへのアクセスを防ぐため、httpd等を終了しておく
    • 起動対象のMySQLサーバIDは起動スクリプト内に記述してある
/etc/init.d/httpd stop
kill ...
/etc/init.d/mysqld_multi start
/etc/init.d/httpd start
  • データベースのrootユーザのパスワードを設定する
/etc/init.d/mysqld_multi start
mysqladmin -u root -P 50001 -h 127.0.0.1 password '新しいパスワード'
  • 自動起動を有効化する

従来の自動起動はOffにしている。

/sbin/chkconfig --add mysqld_multi
/sbin/chkconfig --level 35 mysqld_multi on
/sbin/chkconfig --level 35 mysqld off

日常の作業

  • MySQLサーバを停止して作業する場合は、MySQLを使用するものを予め停止しておくこと。(多分いまのところはhttpdだけ)
/etc/init.d/httpd stop
/etc/init.d/mysqld_multi stop
作業
/etc/init.d/mysqld_multi start
/etc/init.d/httpd start
  • サーバの動作状況の確認
/etc/init.d/mysqld_multi status
または
ps xa | grep mysqld

参考文献

  1. mysqld_multi(複数の MySQL サーバを管理するプログラム)
  2. MySQL mysqld_multiを使用した自動起動Script
  3. chkconfigコマンド (Linux : Fedora RedHat CentOS )
個人用ツール