1台のサーバに複数のMySQLをインストールする
- 2007.08.28
- 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ユーザを登録するときに指定しておく必要がある。
参考ページ
mysqld_multi 複数のMySQLサーバ管理(たくさんのMySQLを実行したいときに役立ちそう)
- 1. ■MySQL5のソースをダウンロードする
- 2. ■MySQL5をインストールする前に行うこと
- 3. ■MySQL5をインストールする
- 4. ■起動のための戦略を考える
- 5. ■MySQL4を止める
- 6. ■MySQL5の初期設定ファイルを用意する
- 7. ■/etc/my5.cnfを変更する
- 8. ■MySQL5の初期データベースを作成する。
- 9. ■MySQL5サーバを起動する
- 10. ■MySQL5サーバを停止する
- 11. ■MySQL5の起動スクリプトを用意する
- 12. ■MySQL5クライアントから接続する
- 13. ■いろいろなエラー対策
- 14. ■rootパスワードを設定しておく
- 15. ■ユーザを追加登録する(TCP/IP接続可能なユーザ)
- 16. ■どこからでもMySQLサーバに接続できる完全なスーパーユーザー
- 17. ■登録ユーザの接続を確認する
- 18. ■makeエラー対策-1
- 19. ■makeエラー対策-2
■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
-
前の記事
SolarisにバグトラッキングシステムMANTISをインストール 2007.08.28
-
次の記事
SolarisにOracle10g Clientをインストール 2007.09.05