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サーバを動作させるまで
- データベースファイル、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

