あるレンタルサーバーで、WordPress のインストールをすることになった。
WordPress を入れるためには、MySQL サーバを入れる必要がある。
しかし、そのサーバーでは管理者権限 (root 権限) は与えられていなかった。
これは、一般権限で MySQL サーバをインストールする方法の備忘録である。
OS の特定
適切な MySQL サーバを入れるためには、まず OS を特定する必要がある。
[hoge@hosthoge cgi-bin]$ cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.1 (Santiago) [hoge@hosthoge ~]$ uname -p x86_64
サーバは Red Hat 6.1 x86_64 のようだ。
なお、システムには既に MySQL がインストールされている。
[hoge@hosthoge ~]$ mysql --version mysql Ver 14.14 Distrib 5.1.52, for redhat-linux-gnu (x86_64) using readline 5.1 [hoge@hosthoge ~]$ which mysql /usr/bin/mysql
また、以下のコマンドの結果から、他のユーザが既に mysqld を動かしていることが分かる。
[hoge@hosthoge ~]$ ps aux | grep mysqld 26440 ? S 0:00 /bin/sh /home/hogeguy/mysql/bin/mysqld_safe 26587 ? Sl 10:23 /home/hogeguy/mysql/bin/mysqld --basedir=/home/hogeguy/mysql --datadir=/home/hogeguy/mysql/data --plugin-dir=/home/hogeguy/mysql/lib/plugin --log-error=/home/hogeguy/mysql/data/hosthoge.err --pid-file=/home/hogeguy/mysql/data/hosthoge.pid --socket=/home/hogeguy/tmp/mysql.sock --port=35000
これから、各自のホームディレクトリにインストールして動かせば良いようだ、と推測が付く。
MySQL のダウンロード・解凍
Community Server の Linux Generic が必要
MySQL の無料バージョンは Community Server というエディションになる。
http://dev.mysql.com/downloads/mysql/ からダウンロードができ、執筆時点での最新版は 5.7.12 である。
Red Hat Enterprise Linux 用のダウンロードは rpm 形式となっているが、これは管理者権限で yum コマンドによるインストールを行うことを想定している。
今回、管理者権限はないので Linux – Generic からバイナリファイルを落としてきて入れる必要がある。(下記図の赤丸参照)
※一部サイトでは、一般権限でのインストールにはソースコードからのコンパイルが必要と書いてあるが、上記の汎用バイナリファイルを使えば、コンパイルは不要である。
wget でダウンロード
上記の64ビット版の tar ファイルのダウンロードは、以下のようなリンクとなっている。
http://dev.mysql.com/downloads/file/?id=462272
ここをクリックすると、ダウンロード用のページに飛ぶが、その下の方に No thanks, just start my download. というリンクがあるので、このリンクアドレスを wget に渡せばよい。
[hoge@hosthoge ~]$ wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.12-linux-glibc2.5-x86_64.tar
解凍し mysql シンボリックリンク作成
これは以下の2つの tar.gz ファイルを含んでいる。
[hoge@hosthoge ~]$ tar xvf mysql-5.7.12-linux-glibc2.5-x86_64.tar mysql-5.7.12-linux-glibc2.5-x86_64.tar.gz mysql-test-5.7.12-linux-glibc2.5-x86_64.tar.gz
1番目の tar.gz ファイルを解凍すると mysql-5.7.12-linux-glibc2.5-x86_64 というディレクトリができる。
[hoge@hosthoge ~]$ tar xvf mysql-5.7.12-linux-glibc2.5-x86_64.tar.gz mysql-5.7.12-linux-glibc2.5-x86_64/ mysql-5.7.12-linux-glibc2.5-x86_64/README ...
今後の利便のため、これに mysql というシンボリックリンクを張る。
ln -s mysql-5.7.12-linux-glibc2.5-x86_64 mysql
初期化作業(インストール)
以下の作業は、mysql というディレクトリに cd して、そこで実行する。
[hoge@hosthoge ~]$ cd mysql
–initialize オプション
公式ドキュメントによれば、MySQL 5.7.7 以降は mysqld –initialize を使って初期化を行えと書かれている。
※ 以前は bin/mysql_install_db というコマンドだったが、現在は非推奨である。実行すると [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld –initialize という警告が表示されてしまう。
[hoge@hosthoge mysql]$ bin/mysqld --initialize 2016-03-27T13:15:46.174884Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000) 2016-03-27T13:15:46.187052Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2016-03-27T13:15:46.219712Z 0 [ERROR] Can't read from messagefile '/usr/local/mysql-5.5.18/share/english/errmsg.sys' 2016-03-27T13:15:46.243068Z 0 [ERROR] 2016-03-27T13:15:46.243106Z 0 [ERROR] Aborting
しかし、上記のように /usr/local/mysql-5.5.18 ディレクトリ以下のファイルを読み込もうとして、失敗してしまう。
※ 上記のコマンドを実行したとき、ELF binary type “0” not known. などのエラーが出て実行できない場合は、Linux のバイナリファイルの実行を禁止している FreeBSD の可能性がある(さくらのレンタルサーバなど)。
–basedir オプション
–basedir オプションで自身のディレクトリを指定してあげる必要があるようだ。
[hoge@hosthoge mysql]$ ./bin/mysqld --initialize --basedir=/home/hoge/mysql 2016-03-27T14:05:54.630412Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000) 2016-03-27T14:05:54.636828Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2016-03-27T14:05:54.678836Z 0 [ERROR] COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1' 2016-03-27T14:05:54.678867Z 0 [ERROR] Aborting
このエラーは、utf8_general_ci という COLLATION (ソート順) が、latin1 という CHARACTER SET (文字コード) に対しては無効ですよ、というメッセージである。
–character-set-server=utf8 オプション
対処方法は –character-set-server=utf8 オプションによりサーバ文字コードに UTF8 を指定してあげることだ。
[hoge@hosthoge mysql]$ ./bin/mysqld --initialize --basedir=/home/hoge/mysql --character-set-server=utf8 2016-03-27T14:20:51.751550Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000) 2016-03-27T14:20:51.751921Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2016-03-27T14:20:52.148092Z 0 [Warning] InnoDB: io_setup() failed with EAGAIN. Will make 5 attempts before giving up. 2016-03-27T14:20:52.148146Z 0 [Warning] InnoDB: io_setup() attempt 1. 2016-03-27T14:20:52.658080Z 0 [Warning] InnoDB: io_setup() attempt 2. 2016-03-27T14:20:53.168026Z 0 [Warning] InnoDB: io_setup() attempt 3. 2016-03-27T14:20:53.676057Z 0 [Warning] InnoDB: io_setup() attempt 4. 2016-03-27T14:20:54.181090Z 0 [Warning] InnoDB: io_setup() attempt 5. 2016-03-27T14:20:54.687086Z 0 [ERROR] InnoDB: io_setup() failed with EAGAIN after 5 attempts. 2016-03-27T14:20:54.687174Z 0 [ERROR] InnoDB: Cannot initialize AIO sub-system 2016-03-27T14:20:54.687194Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error 2016-03-27T14:20:54.687208Z 0 [ERROR] Plugin 'InnoDB' init function returned error. 2016-03-27T14:20:54.687215Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 2016-03-27T14:20:54.687223Z 0 [ERROR] Failed to initialize plugins. 2016-03-27T14:20:54.687229Z 0 [ERROR] Aborting
今度は InnoDB に関するエラーが出た。
MySQL 5.5 以降では、デフォルトのストレージエンジンが InnoDB (MyISAM と違いトランザクション機能をサポート) になっている。
上記のエラーは、Linux のネイティヴ AIO (非同期 I/O) のコンテキストを作成する io_setup() というシステムコールが失敗したことを示す。
–innodb_use_native_aio=0 オプション
このエラーは my.cnf に innodb_use_native_aio = 0 という設定を行って AIO を無効化することで回避できるという情報があった。
オプションとして渡す場合は、–innodb_use_native_aio=0 を指定すればよい。
[hoge@hosthoge mysql]$ ./bin/mysqld --initialize --basedir=/home/hoge/mysql --character-set-server=utf8 --innodb_use_native_aio=0 2016-03-28T04:28:43.592893Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000) 2016-03-28T04:28:43.599081Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2016-03-28T04:28:43.978024Z 0 [Warning] InnoDB: New log files created, LSN=45790 2016-03-28T04:28:44.024032Z 0 [Warning] InnoDB: Creating foreign key constraint system tables. 2016-03-28T04:28:44.124330Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 9da45dee-c577-11e5-82df-782bcb5434a4. 2016-03-28T04:28:44.124925Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened. 2016-03-28T04:28:44.150558Z 1 [Note] A temporary password is generated for root@localhost: 6vS<e2q3fRNg
こうしてようやく初期化に成功し、root アカウントのパスワードが生成された。
このパスワードを書き留めておくとよい。
オプションを設定ファイル my.cnf で与える時の注意
基本的に MySQL のオプションは、コマンドラインでも指定できるし、設定ファイル (通常は my.cnf という名前) で指定することもできる (それは上記のインストールプロセスにおいても同様である) 。
設定ファイルが読み込まれる場所は、デフォルトで以下の順となっている (mysqld –help 参照)。
- /etc/my.cnf
- /etc/mysql/my.cnf
- /usr/local/mysql/etc/my.cnf
- ~/.my.cnf
上記の場所に設定ファイルを作成してもよいが、できれば –basedir ディレクトリに置きたいはずである。
この場合、my.cnf を –basedir ディレクトリに作り (以下のコマンドでひな形を作成)、
[hoge@hosthoge mysql]$ cp ./support-files/my-default.cnf ./my.cnf
ファイルを開いて以下のように記述を行う。
[mysqld] character-set-server = utf8 innodb_use_native_aio = 0
そして、その設定ファイルのパスを指定してインストールを実行すればよい。
./bin/mysqld --defaults-file=/home/hoge/mysql/my.cnf --initialize
ここで重要なのは、–defaults-file は –initialize の前に指定しなければならない点である。
インストールプロセスをやり直す方法
なお、上記のインストールプロセスは、–basedir オプションで指定したディレクトリ下の data ディレクトリにデータベースや hosthoge.err 等の諸々のファイルを生成するためのものだ。
そのため、data ディレクトリを削除すれば、インストールプロセスを最初からやり直すことができる。
[hoge@hosthoge mysql]$ rm -rf data/
MySQL サーバの起動
推奨される mysqld_safe コマンド
サーバの起動方法は、https://dev.mysql.com/doc/refman/5.7/en/mysqld-safe.html に書かれているとおり、./bin/mysqld という本体プログラムを直接起動するのではなく、./bin/mysqld_safe コマンドの使用が推奨されている。
mysqld_safe は mysqld を起動する際、エラーが発生すると mysqld の再起動を試みたり、エラーログに記録したりといった安全機能を提供する。
なお、https://dev.mysql.com/doc/refman/5.7/en/starting-server.html に書かれているが、root ユーザで MySQL を起動する場合は –user オプションで動作させるユーザアカウントを指定するが、非 root ユーザで起動する場合はこのオプションは不要だ。
とりあえず起動を試みる
運用時は mysqld_safe & のように最後にアンパサンドを付けてバックグラウンドで起動させるが、まずはフォアグラウンドで起動を試してみる (ここでは上記の ~/mysql/my.cnf はないものと仮定)。
[hoge@hosthoge mysql]$ ./bin/mysqld_safe 160128 13:46:04 mysqld_safe Logging to '/home/hoge/mysql/data/hosthoge.err'. 160128 13:46:04 mysqld_safe Starting mysqld daemon with databases from /home/hoge/mysql/data rm: cannot remove `/var/run/mysqld/mysqld.sock': 許可がありません 160128 13:46:04 mysqld_safe mysqld from pid file /home/hoge/mysql/data/hosthoge.pid ended
上記のエラーを見ると、ログやデータベースは basedir 直下の data ディレクトリから読もうとしているが、ソケットファイル(サーバが同じマシン上のクライアントと通信するためのファイル)はシステム共通のディレクトリから読もうとしている。
念のためエラーログ (./data/hosthoge.err) を見てみる。
160128 13:46:04 mysqld_safe Starting mysqld daemon with databases from /home/hoge/mysql/data 2016-03-28T04:46:04.458898Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000) 2016-03-28T04:46:04.662955Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2016-03-28T04:46:04.663041Z 0 [Warning] Insecure configuration for --secure-file-priv: Current value does not restrict location of generated files. Consider setting it to a valid, non-empty path. 2016-03-28T04:46:04.663088Z 0 [Note] /home/hoge/mysql/bin/mysqld (mysqld 5.7.10-log) starting as process 16069 ... 2016-03-28T04:46:04.666739Z 0 [ERROR] COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1' 2016-03-28T04:46:04.666781Z 0 [ERROR] Aborting 2016-03-28T04:46:04.666812Z 0 [Note] Binlog end 2016-03-28T04:46:04.666881Z 0 [Note] /home/hoge/mysql/bin/mysqld: Shutdown complete 160128 13:46:04 mysqld_safe mysqld from pid file /home/hoge/mysql/data/hosthoge.pid ended
上記は COLLATION ‘utf8_general_ci’ is not valid for CHARACTER SET ‘latin1’ という前節と同じエラーである。
要するに、前節と同じ –character-set-server=utf8 や –innodb_use_native_aio=0 オプションを mysqld_safe にも指定してあげる必要がある (基本的に、mysqld_safe に指定したコマンドラインオプションはそのまま mysqld にも渡される) 。
[hoge@hosthoge mysql]$ ./bin/mysqld_safe --character-set-server=utf8 --innodb_use_native_aio=0
しかし、上記のコマンドを実行すると、ポートが使用中であるという新しいエラーが出てしまった。
–port オプションと –socket オプションの設定
2016-03-28T04:59:28.232560Z 0 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use 2016-03-28T04:59:28.232568Z 0 [ERROR] Do you already have another mysqld server running on port: 3306 ? 2016-03-28T04:59:28.232580Z 0 [ERROR] Aborting
このエラーは、3306 というデフォルトポート (別のマシンから MySQL に接続するための TCP/IP ポート) がすでに使われているのが原因だ。
他のユーザが一般権限で立ち上げた MySQL の使用ポートとぶつからないようにしないといけない。
netstat -nat | grep LISTEN | awk '{print $4}'
上記のコマンドにより使用されているでポートを確認したところ、55000 なら使われていないようだったので、これを –port オプションで指定する。
さらに、ローカルマシーン上のクライアントが接続できるようにするためには、UNIX ソケットファイルが必要なので、このパスを –socket オプションで指定する。
結局、以下のコマンドでサーバが無事に起動した。
[hoge@hosthoge mysql]$ ./bin/mysqld_safe --character-set-server=utf8 --innodb_use_native_aio=0 --port=55000 --socket=/home/hoge/mysql/mysqld.sock
これは my.cnf に以下のように設定して mysqld_safe を実行することと等価である。
[mysqld] character-set-server = utf8 innodb_use_native_aio = 0 port = 55000 socket = /home/hoge/mysql/mysqld.sock
クライアントからの接続
クライアントからの接続には、mysql というコマンドを使用する。
このコマンドのオプション一覧は https://dev.mysql.com/doc/refman/5.7/en/mysql-command-options.html に掲載されている。
必要なのは、–port と –socket オプションだ。
[hoge@hosthoge mysql]$ ./bin/mysql -u root -p --port=55000 --socket=/home/hoge/mysql/mysqld.sock Enter password: (6vS<e2q3fRNg) Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.10-log Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
無事に接続できたので、データベース一覧を表示するコマンドを打ってみる。
mysql> show databases; ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
root アカウントのパスワード変更を求められるので、以下のコマンドで変更する。
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'PasswordHoge'; Query OK, 0 rows affected (0.05 sec)
パスワードの変更が完了すると、MySQL のコマンドが打てるようになる。
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.08 sec)
これで、無事に一般権限で MySQL のインストールが無事に完了した!
コメント
一般権限でWordPressを入れようとして、まさに同じところで難航していたので本当に助かりました!ありがとうございます。
ところで、もしご存知でしたら教えて頂きたい事があります。
上記の手順は済んで無事WordPressまで導入できましたが、本家のサーバが定期停電等でダウンした場合、復帰時にMySQLサーバは手動でまた起動してあげないと落ちたままになりますでしょうか?MySQLの自動起動設定は皆Root権限ありきの説明かなと思われたので…
不勉強で恐縮です、よろしくお願いいたします。
cron 設定を行えば大丈夫です。