複数の MySQL を同時に起動する
早くも 4 月!こんにちは、nakamura です。去年のエイプリルフールは sakai が こんな記事 を上げていましたが、僕はまじめなので普通に書きます。
各コンテンツの本番環境と出来る限り同じ状態の開発環境が欲しい!というのは誰しもが思う事ですが、中々そうもいかないのが世の中の世知辛い所ですね。今日は少しでもそんなストレスを解消する手段として異なるバージョンの MySQL を一台のサーバに共存させる方法をご紹介します。
ソースコードの取得、展開
ディストリビューションのパッケージ管理システムではなく、ソースコードから手動でコンパイル、インストールを行います。
公式のダウンロードサイトはこちら → MySQL :: MySQL Product Archives
ただし、MySQL 4.x 系はサポートが終了した事もあり公式サイトからのダウンロードが出来ません。古いバージョンをインストールしたいという方は、探せば非公式のサイトで配布されていたりするので、自己責任でどこかから入手してください。
ソースコードを任意の場所にダウンロードして、展開します。
wget http://downloads.mysql.com/archives/mysql-5.0/mysql-5.0.90-linux-i686.tar.gz
tar xzvf mysql-5.0.90-linux-i686.tar.gz
configure
展開して出来たディレクトリ内に移動して configure を実行します。configure はインストールに必要な CPU や OS の情報を収集して環境毎に異なる Makefile を生成するコマンドで、この configure コマンドにオプションを与える事で、MySQL のデフォルトの設定を変えたりインストールパスを変えたりする事が可能です。今回実行した configure コマンドは以下です。(今回は MySQL 4.0.27 をインストールしました)
./configure \
--with-unix-socket-path=/var/lib/mysql-4.0/mysql.sock \
--with-tcp-port=3307 \
--with-charset=ujis \
--with-extra-charset=all \
--with-mysqld-user=mysql \
--with-big-tables \
--sysconfdir=/etc/mysql-4.0/
各オプションの解説は以下の通りです。
--with-unix-socket-path
接続先のホスト名を指定しなかったり localhost という名前を使うと mysql コマンドはネットワーク経由ではなく Unix ドメインソケットを使用してデータベースに接続します。コマンドラインオプションで変更する事も可能ですが、毎回指定するのも煩わしいので configure オプションで指定します。
--with-tcp-port
ご存知のように MySQL はデフォルトで 3306 番ポートを使って通信します。Unix ドメインソケットと同様にコマンドラインオプションや設定ファイルで変更する事が可能ですが、面倒なので configure オプションで変更します。
--with-charset
デフォルトの文字コードを指定します。
--with-extra-charset
デフォルト以外で使用する可能性のある文字コードを指定します。個別に指定する場合は ujis,sjis,utf8... というようにカンマ区切りで指定しますが、特に理由がなければ all で OK です。
--with-mysqld-user
mysqld を起動するユーザを指定します。
--sysconfdir
今回、コマンドやライブラリ郡はデフォルトである /usr/local 以下にインストールしますが、設定ファイルだけは /etc 以下に作成したいのでこのオプションで指定します。
その他にも configure のオプションは無数にあります。./configure --help と実行すると説明が見れるので状況に応じて利用してください。
make, make install
configure が問題なく終われば、後は難しくありません。実際のコンパイルと生成されたバイナリファイル等の配置を以下のコマンドで行います。
コンパイル
make
ファイルの配置
make install
設定ファイルを用意
今回は --sysconfdir オプションで指定した /etc/mysql-4.0 以下に my.cnf を作成します。設定ファイルの書式自体は何ら変わらないので適宜記述してください。ちなみに今回作成した設定ファイルはこんな感じです。(configure オプションで指定しているので、わざわざ記述する必要のない物も多いですが念の為、、、)
[mysqld]
datadir=/var/lib/mysql-4.0
socket=/var/lib/mysql-4.0/mysql.sock
log-error=/var/log/mysqld-4.0/error.log
pid-file=/var/run/mysqld-4.0/mysqld.pid
port=3307
[mysqld_safe]
datadir=/home/nakamura/mysql-test
socket=/var/lib/mysql-4.0/mysql.sock
log-error=/var/log/mysqld-4.0/error.log
pid-file=/var/run/mysqld-4.0/mysqld.pid
port=3307
[client]
port=3307
socket=/var/lib/mysql-4.0/mysql.sock
[mysql]
[mysql.server]
[mysql_install_db]
MySQL の初期設定
インストール作業自体は以上で終わりですが、初期設定をしないとまだ使える状態ではありません。
データ領域の初期化
今回は /var/lib/mysql-4.0 以下に作成します。
mkdir -p /var/lib/mysql-4.0
chown -R mysql:mysql mysql-4.0/
/usr/local/bin/mysql_install_db --defaults-file=/etc/mysql-4.0/my.cnf --datadir=/var/lib/mysql-4.0 --user=mysql
起動スクリプトを用意
ディストリビューションにより異なりますが、CentOS の場合は yum で入れた MySQL の起動スクリプトをコピーして設定ファイルやコマンドのパス等を書き換えるだけで問題なく使用できました。また、ソースコードを展開したディレクトリ内に support-files/mysql.server.sh というファイル名で雛形のような物があるので、そちらでもイケるかもしれません。
root パスワードを設定
まずは起動。
/etc/init.d/mysqld-4.0 start
起動スクリプトを用意していない場合は以下のコマンドでも起動できます。
/usr/local/bin/mysqld_safe --defaults-file=/etc/mysql-4.0/my.cnf --user=mysql &
netstat コマンド等を使って MySQL が 3307 番ポートで待ち受けているか確認しましょう。
netstat -lpn
問題なければ MySQL に接続します。初期状態では設定されていないので、パスワードを指定する必要はありません。
/usr/local/bin/mysql -uroot
以下の SQL でパスワードを設定します。
SET PASSWORD FOR root=PASSWORD('**********');
以上で設定も終了!実際にアプリケーション等から接続出来るか試してみてください。その際、冒頭にも書きましたが接続先ホストを localhost とすると Unix ドメインソケット経由で接続しようとする為、ポート番号の指定が出来ません。必ず 127.0.0.1:3307 といったようなループバックアドレスで接続しましょう。
終わりに
開発環境があちこちのマシンにばらけていて、管理しきれない!という方はぜひ一度試してみてください。少なくともデータベースに関してはかなりスッキリまとめられると思いますよ!