1台のサーバに複数のMySQLをインストールする

現在MySQL4が動いているSolarisにMySQL5をインストールして同時に稼働させる。

 

   MySQL4  MySQL5  メモ
 バイナリ  /usr/local/mysql  /usr/local/mysql5  --prefixで指定 
 port  3306  3307  --with-tcp-portで指定
 socket  /tmp/mysql.sock  /tmp/mysql5.sock  --with-unix-socket-pathで指定
 設定ファイル  /etc/my.cnf  /etc/my5.cnf  インストール後に手動で配置する
  • UNIXソケット(/tmp/mysql.sock)を使って接続すると高速。
  • TCP/IP(ポート番号3306)を使って接続すると、他のコンピュータからも接続可能。
  • TCP/IP(ポート番号)を使って接続するには、MySQLユーザを登録するときに指定しておく必要がある。

参考ページ

Unix で複数サーバの実行

mysqld_multi 複数のMySQLサーバ管理(たくさんのMySQLを実行したいときに役立ちそう)

 

■MySQL5のソースをダウンロードする

RPMではなく、バイナリでもなく、ソースを落としてくる。(Compressed GNU TAR archive)

http://dev.mysql.com/downloads/mysql/5.0.html#source

 

 

■MySQL5をインストールする前に行うこと

  • /usr/sfw/binにパスを通しておく。(下の「makeエラー対策-1」)
  • crle -v でライブラリパスに/usr/lib:/usr/openwin/lib:/usr/dt/lib:/usr/local/libが指定してあることを確認しておく。もし、パスが通っていなかったら、下記のようにLD_LIBRARY_PATHを指定しておくこと。
  • libstdc++.laが正常なファイルか確認しておく。(下の「makeエラー対策-2」)
  • rootで作業する。configure, make を一般ユーザで行ったが、うまくいかず。(たまたまかもしれないが) MySQL 5.1.31 は、一般ユーザで configure, makeしてからrootで make install できた。
  • MySQL4は、cp  -prf /usr/local/mysql /usr/local/mysql.back でバックアップしておく。
  • MySQL4の設定は、cp /etc/my.cnf /etc/my4.cnf としてバックアップしておく。

■MySQL5をインストールする

 

Solarisへのインストールの場合

何度か試したが、最初からrootで実行する方が良い気がする。(5.1.31と5.1.63は一般ユーザでcondigure, make できた)

# tar zxvf mysql-5.0.45.tar.gz 
# cd mysql-5.0.45

(念のため、環境変数をエクスポートしておく)
# MYSQL_UNIX_PORT=/tmp/mysql5.sock
# MYSQL_TCP_PORT=3307
# export MYSQL_UNIX_PORT MYSQL_TCP_PORT

(crleコマンドでライブラリへのパスが不足していたら実行する)
# LD_LIBRARY_PATH=/usr/local/lib:/usr/openwin/lib:/usr/dt/lib:/usr/sfw/lib:/usr/xpg4/lib:/usr/lib:/lib:/etc/lib
# export LD_LIBRARY_PATH

(ポート番号とソケットを指定すること)
# ./configure --with-charset=utf8 --with-extra-charsets=all --with-mysqld-user=mysql \
--prefix=/usr/local/mysql5 --with-unix-socket-path=/tmp/mysql5.sock \
--with-tcp-port=3307

# make
# make install

 configureに4分、makeに22分かかった。(Sun Fire V240)

 --with-extra-charsetsは、複数形のsが最後に付くので気をつける。

http://dev.mysql.com/doc/refman/5.1/ja/solaris.html

 

 

Linuxへのインストールの場合

$ tar zxvf mysql-5.1.34.tar.gz
$ cd mysql-5.1.34

$ CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors \
-fno-exceptions -fno-rtti" ./configure \
--prefix=/usr/local/mysql5 --localstatedir=/usr/local/mysql5/data --enable-assembler \
--with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static \
--with-charset=utf8 --with-extra-charsets=all \
--with-tcp-port=3308 --with-unix-socket-path=/tmp/mysql5.sock

$ make
# make install

makeに約30分かかった。(Pentium III 1GHz)

./configureで何をやっているかは、ここに詳しく書いてある。

http://dev.mysql.com/doc/refman/5.1/ja/installing-source.html

http://dev.mysql.com/doc/refman/5.1/ja/configure-options.html

http://dev.mysql.com/doc/refman/5.1/ja/environment-variables.html

 

 

■起動のための戦略を考える

まずは、確実にMySQL5が起動することを確認したい。。

1. そのために、一度MySQL4を止めておく。

2. MySQL5の設定をあれこれ行い、確実に起動させる。

3. MySQL4を元の通り、起動させる。

このようなステップで進めたい。

 

■MySQL4を止める

今動いているMySQL4を止める。(大事!)

# /etc/init.d/mysql stop 

MySQL4の設定ファイル名を変更しておく。(あとで元に戻すこと)

# mv /etc/my.cnf /etc/my4.cnf

 

 

■MySQL5の初期設定ファイルを用意する

/etc/my5.cnf を作る。

(MySQL5用の設定ファイルを用意する)
# cp /usr/local/mysql5/share/mysql/my-medium.cnf /etc/my5.cnf

(今回の最初の起動時だけ利用するため、my.cnfも用意する)
# ln -s /etc/my5.cnf /etc/my.cnf

(/etc/my.cnfが見つかならいときのためにmy.cnfも用意する)
# ln -s /etc/my5.cnf /usr/local/mysql5/my.cnf

この /etc/my5.cnf には、configure時に指定したポート番号3307、ソケット/tmp/mysql5.sockが書かれている。

起動方法によっては、/etc/my.cnfを読みにいくので、my5.cnfのシンボリックリンクを作成しておく。(後で、MySQL4のmy.cnfに戻す事を忘れずに)

/usr/local/mysql5/の下にmy.cnfを作っておく。/etc/my.cnfが見つからないときにbasedir/my.cnfを読むため。

 

■/etc/my5.cnfを変更する

 [Warning] '--skip-locking' is deprecated and will be removed in a future release. Please use '--skip-external-locking' instead.

MySQLのバージョン5.1.63では上記のメッセージが出たので、my5.cnfを変更しておく。

(変更前)
skip-locking

(変更後)
skip-external-locking

 

■MySQL5の初期データベースを作成する。

varディレクトリと初期データベースを作成する。

# chown -R mysql:mysql /usr/local/mysql5 (うっかり/usr/local/mysqlを指定しない)
# cd /usr/local/mysql5
# bin/mysql_install_db --defaults-file=/etc/my5.cnf --user=mysql  (初期データベースを作る)

初期データベースを作る時に、--defaults-file=/etc/my5.cnfを指定しないと、/etc/my.cnfを読みにいってしまうので、注意する。

さきほど、念のためにmy5.cnfをmy.cnfとしてシンボリックリンクを張っておいたのは、この指定忘れを防ぐため。 (じゃぁ、必要なかったんじゃないか!と座布団を投げないでくださいませ)

 

所有者を適切に設定する。

# chown -R root .
# chown -R mysql:mysql var (またはdataディレクトリを指定する)

 

 

■MySQL5サーバを起動する

環境変数をエクスポートしておく。

# MYSQL_UNIX_PORT=/tmp/mysql5.sock
# MYSQL_TCP_PORT=3307
# export MYSQL_UNIX_PORT MYSQL_TCP_PORT

 

MySQL5のデータディレクトリを指定して起動する。

# /usr/local/mysql5/bin/mysqld_safe  --defaults-extra-file=/etc/my5.cnf  --datadir=/usr/local/mysql5/var --user=mysql &

--defaults-file=/etc/my5.cnf だとエラーで起動できなかった。(さきほどのテーブルを作る時はこの指定で良かったのに。。。)

--defaults-extra-file=/etc/my5.cnf だと起動できる。

/etc/my5.cnfを指定できない時はあきらめて、/etc/my.cnfを用意して起動してみる。

ps -ef | grep my でちゃんと起動したかを確認する。

 

起動できなかったオプション指定(参考まで)

# mysqld_safe --defaults-file=/etc/my5.cnf --datadir=/usr/local/mysql5/var --user=mysql &
# mysqld_safe --defaults-file=/etc/my5.cnf --user=mysql &

その他、気づいたこと。

  • --default ではなく、--defaults なので、つづりに注意。
  • --user=mysqlは、一番最後に追加しないとなぜか起動しなかった。
  • --user=mysqlは、指定しなくてもmysqlユーザで起動した。
  • キャラクタセットは、--default-character-set=utf8 のように指定する。
  • キャラクタセットは、/etc/my5.cnf内の[mysqld]の次の行に記入しておくと楽。
  • ポート番号、ソケット番号の変更は、/etc/my5.cnf内の[client]と[mysqld]を書き換える。

参考ページ

mysqld_safe MySQL サーバ スタートアップスクリプト

 

■MySQL5サーバを停止する 

無事に起動が確認できたら、MySQL5を停止する。

ソケットを指定してMySQL5を停止する。

# /usr/local/mysql5/bin/mysqladmin --socket=/tmp/mysql5.sock -u root shutdown

ポート番号を指定してMySQL5を停止する。(TCP/IPでrootが接続できる場合)

# /usr/local/mysql5/bin/mysqladmin --port=3307 -u root -p shutdown

 

 

■MySQL5の起動スクリプトを用意する

 起動スクリプトのサンプルをコピーして利用する。

# cp share/mysql/mysql.server /etc/init.d/mysql5

 

/etc/init.d/mysql5を編集する。

(217行目あたりの編集前)
conf=/etc/my.cnf

(編集後)
conf=/etc/my5.cnf

 

この起動スクリプト /etc/init.d/mysql5 には configure時のbasedirの設定がされていた。

basedir=/usr/local/mysql5
bindir=/usr/local/mysql5/bin
datadir=/usr/local/mysql5/var
sbindir=/usr/local/mysql5/sbin
libexecdir=/usr/local/mysql5/libexec

 

/etc/rc3.d に起動スクリプトを用意する。

# ln -s /etc/init.d/mysql5 /etc/rc3.d/S99mysql5

 

起動と停止を確認する。

# /etc/init.d/mysql5 stop  (停止)
# /etc/init.d/mysql5 start   (起動)

 

 

■MySQL5クライアントから接続する

  • MySQL5のクライアントを起動する。
  • MySQL5のソケットを指定する。
  • MySQL5のポート番号を指定する。

以上がコツ。

<ソケットを指定して接続する方法>

$ /usr/local/mysql5/bin/mysql --socket=/tmp/mysql5.sock -u root -p

初期パスワードは「空」なのでリターンキーでOK。

 

<ポート番号を指定して接続する方法>

$ /usr/local/mysql5/bin/mysql --port=3307 -u root -p

 ポート指定する場合は、「接続ユーザがTCP/IP経由で接続できるように登録してある」ことが前提なので注意する。下のユーザ登録を参照。

 

で、何も指定せず普通に接続しようとすると次のエラーがおきるので注意。

$ /usr/local/mysql5/bin/mysql -u root -p 
Enter password:  (リターンキーを入力)
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 

 

 

■いろいろなエラー対策

MySQL5が起動したのはいいが、今まで動いていたMySQL4に接続できなくなったりした。

  • 慌てず、MySQL4もMySQL5も全て一度終了する。
  • MySQL4を起動して、クライアントやPHP等からの接続を確認する。
  • MySQL5を起動して、クライアントからの接続を確認する。
  • あせっていると、sockと書くところをsocketというように間違えたりする。(おれ)

 

/usr/local/mysql5/var/ホスト名.errの[ERROR]をよく見る。

  • unknown option '--skip-skip-federated'が書いてあったので、/etc/my5.cnfで無効にした。

 

■rootパスワードを設定しておく 

ソケットを指定して接続してパスワードを設定する。 

$ /usr/local/mysql5/bin/mysqladmin --socket=/tmp/mysql5.sock -u root password 'XXXX' 

 

 

■ユーザを追加登録する(TCP/IP接続可能なユーザ)

rootでログイン後、登録されているユーザを確認する

mysql> use mysql;
Database changed
mysql> select user, password, host from user;
+------+-------------------------------------------+------------------------+
| user | password | host |
+------+-------------------------------------------+------------------------+
| root | *81F5E21E35407D884A6CD4A731AEBFB6AF209EB1 | localhost |
| root | | www.mydomain.com |
| root | | 127.0.0.1 |
+------+-------------------------------------------+------------------------+
3 rows in set (0.00 sec)

 

登録されているデータベースを確認する

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)

 

新規ユーザ登録を次の設定で行う。

  • 新規ユーザ名: foo
  • パスワード: xxxx
  • 新規データベース名: emp
  • 接続許可するクライアントIPアドレス: 192.168.0.%
  • 接続許可するクライアントIPアドレス: localhost
mysql> create database emp; 

mysql> grant all privileges on emp.* to foo@"192.168.0.%"
-> identified by 'xxxx' with grant option ;

mysql> grant all privileges on emp.* to foo@localhost
-> identified by 'xxxx' with grant option ;

 

foo@"%"  全てのホストからアクセス可能

foo@localhost  サーバにログインしてからアクセス可能

foo@"192.168.1.12"   IPアドレスが192.168.1.12のホストからアクセス可能

foo@"mydomain.co.jp"   ドメインがmydomain.co.jpからのアクセスが可能

 

登録ユーザを確認する。

mysql> select user, password, host from user;
+---------+-------------------------------------------+------------------------+
| user | password | host |
+---------+-------------------------------------------+------------------------+
| root | *81F5E21E35407D884A6CD4A731AEBFB6AF209EB1 | localhost |
| root | | www.mydomain.com |
| root | | 127.0.0.1 |
| foo | *5AA834B332E644D47587C1E7446FE07C26E50C58 | 192.168.0.% |
| foo | *5AA834B332E644D47587C1E7446FE07C26E50C58 | localhost |
+---------+-------------------------------------------+------------------------+
5 rows in set (0.00 sec)

 

登録ユーザの権限を確認する。@"ホスト名" を指定すること。

mysql> show grants for foo@"192.168.0.%" ;

 

 

 

■どこからでもMySQLサーバに接続できる完全なスーパーユーザー

例えば、rootを完全なスーパユーザーにしたいときは、localhost と "%" の両方でのユーザ登録が必要になる。

mysql> grant all privileges on *.* to root@"%"
    -> identified by 'xxxx' with grant option;

*.*  全てのデータベース.全てのテーブル

"%"  全てのIPアドレスから

'xxxx'  パスワードの指定

with grant option   データベースレベルの権限付き

 

 

■登録ユーザの接続を確認する

MySQL5が動いているSolarisにログインしている状態で接続する。

127.0.0.1 と ポート番号 を指定するのがキモ。

$ /usr/local/mysql5/bin/mysql -h 127.0.0.1 --port=3307 -u foo -p 

 

 

 

■makeエラー対策-1

makeしたときに

../depcomp: line 512: exec: g++: not found

とエラーが表示されたので、g++をインストールしようと思ったが、Solaris10には/usr/sfw/binにg++が存在するので、

$ PATH=$PATH:/usr/sfw/bin
$ export PATH

 

■makeエラー対策-2

makeしたときに libstdc++.la が有効ではないと言われる。

libtool: link: `/usr/sfw/lib/gcc/sparc-sun-solaris2.10/3.4.3/
../../..//libstdc++.la' is not a valid libtool archive
make[3]: *** [liboptions.la] Error 1
make[3]: Leaving directory `/usr/local/src/mysql-5.0.45/server-tools/instance-manager'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/usr/local/src/mysql-5.0.45/server-tools'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/local/src/mysql-5.0.45'
make: *** [all] Error 2

/usr/sfw/lib/libstdc++.la は中身が空っぽのため、viで開いて以下をコピーペーストして保存する。(Solaris Expressでは修正されているそうです)

/usr/sfw/lib/libstdc++.la 

# libstdc++.la - a libtool library file
# Generated by ltmain.sh - GNU libtool 1.4a-GCC3.0 (1.641.2.256 2001/05/28 20:09:07 with GCC-local changes)
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='libstdc++.so.6'

# Names of this library.
library_names='libstdc++.so.6.0.3 libstdc++.so.6 libstdc++.so'

# The name of the static archive.
old_library='libstdc++.a'

# Libraries that this one depends upon.
dependency_libs='-lc -lm -L/usr/sfw/lib -lgcc_s'

# Version information for libstdc++.
current=6
age=0
revision=3

# Is this an already installed library?
installed=yes

# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''

# Directory that this library needs to be installed in:
libdir='/usr/sfw/lib'

 

/usr/sfw/lib/64/libstdc++.la も以下をコピーペーストする。

# libstdc++.la - a libtool library file
# Generated by ltmain.sh - GNU libtool 1.4a-GCC3.0 (1.641.2.256 2001/05/28 20:09:07 with GCC-local changes)
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='libstdc++.so.6'

# Names of this library.
library_names='libstdc++.so.6.0.3 libstdc++.so.6 libstdc++.so'

# The name of the static archive.
old_library='libstdc++.a'

# Libraries that this one depends upon.
dependency_libs='-L/lib/64 -lc -lm -L/usr/sfw/lib/64 -lgcc_s'

# Version information for libstdc++.
current=6
age=0
revision=3

# Is this an already installed library?
installed=yes

# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''

# Directory that this library needs to be installed in:
libdir='/usr/sfw/lib/64'

 

■参考URL

http://www.gadgety.net/shin/tips/unix/solaris10.html

http://www.sunquebec.com/index.php?section=17&lang=fr