Submitted by sasaki on 火曜, 2007-08-28 14:41.
現在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が指定してあることを確認しておく。
- 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は一般ユーザで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
(ポート番号とソケットを指定すること)
# ./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
■MySQL4を止める
今動いているMySQL4を止める。(大事!)
# /etc/init.d/mysql stop
MySQL4の設定ファイルをバックアップしておく。
# cp /etc/my.cnf /etc/my4.cnf
■MySQL5の初期設定ファイルを用意する
/etc/my5.cnf を作る。
# cp /usr/local/mysql5/share/mysql/my-medium.cnf /etc/my5.cnf
# ln -s /etc/my5.cnf /usr/local/mysql5/my.cnf
この /etc/my5.cnf には、configure時に指定したポート番号3307、ソケット/tmp/mysql5.sockが書かれていた。
/usr/local/mysql5/の下にmy.cnfを作っておく。/etc/my.cnfが見つからないときにbasedir/my.cnfを読むため。
■MySQL5の初期データベースを作成する。
varディレクトリと初期データベースを作成する。
# chown -R mysql:mysql /usr/local/mysql5 (間違えて/usr/local/mysqlを指定しない)
# cd /usr/local/mysql5
# bin/mysql_install_db --user=mysql (初期データベースを作る)
所有者を適切に設定する。
# 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 --datadir=/usr/local/mysql5/var --user=mysql &
起動できなかったオプション指定(参考まで)
# 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を停止する。
# /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 には 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