MySQLをビルドする on AWS Red Hat 7.3

yoku0825 さんが、Software Design 誌 2016年6月号に、最近のMySQLのビルドのしかたを簡潔に書いてくれていたのを見て、ずっとやりたかったのが、半年が経ち、年を越え。こんなに時間が経つなら忘れてしまえばいいのに、と思うのですが、先延ばしにすればするほど忘れられなくなるのが、この性分。ようやく年貢を納めることができた気分なので、メモ書き程度にここに残しておこうと思います。

 この年末年始に、AWSにやっと触ってみました。「AWSに触る」という表現が適切なのかどうかすらよくわかっていないレベルなのですが、アカウントを作って、マシンイメージからインスタンスを作ったり、あるいは壊したりする体験をしたところです。ということで、この環境の上で、MySQLをビルドして動かしてみることにしました。
 今回使用したのは、Amazon マシンイメージ(AMI)から、Red Hat Enterprise Linux 7.3 です。スペックは、1 CPU, 1GBメモリの t2.micro というタイプ。

f:id:sakaik:20170104112119j:plain:w350
f:id:sakaik:20170104113100j:plain:w350


試行錯誤紆余曲折艱難辛苦ありましたが、臥薪嘗胆七転八倒三寒四温の末、その集大成として、最短でゴールにたどり着ける方法をここでは書きたいと思います(平たく言うと「まとめ」)。

目標とする構成

参考にした yokuさんの記事が MySQL 5.6 での実施だったので、まずはバージョン相違による余計な悩みを避けるために、今回は、MySQL 5.7系ではなく、MySQL 5.6.35 でのビルドを試みることにしました。(yokuさんの記事では 5.6.29)
一般ユーザとして、自分の HOME 下に、mysqlフォルダを掘り、その下の mysql5635 フォルダにごにょごにょ突っ込むイメージ。次のステップとして複数バージョンを同時に動作させたいので、このような構成にしました。

事前準備(環境整備)

 実際の作業では不足によるエラーが出るたびに追加するなど試行錯誤しながら進めましたが、以下をあらかじめ行っておくと作業がスムーズにすすーむず。
rootユーザでの作業。


必要なパッケージ類のインストール:

# yum install wget gcc gcc-c++ cmake libaio-devel bison  ncurses-devel perl-Data-Dumper


今回使用したAMIには MariaDBがすでに入っていて、これが今回入れるMySQLの動作を阻害するため、あらかじめ除去しておく:

# yum -y remove mariadb-libs

ファイルの用意(含フォルダの作成)

 ここからは一般ユーザでの作業です。
フォルダを掘って、中に移動して、MySQL 5.6.35のソースコードをダウンロードしてきて、展開して、展開したフォルダに移動する、というだけの簡単なお仕事です。

$ mkdir mysql/
$ cd !$
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.35.tar.gz
$ tar xvf mysql-5.6.35.tar.gz 
$ cd mysql-5.6.35

ビルドとインストール作業

 展開したソースコードを cmake する*1
その後、make*2。 makeには 今回の環境で 19分程かかりました。
makeが済んだら、インストールして完了。

$ cmake -DCMAKE_INSTALL_PREFIX=/home/ec2-user/mysql/mysql5635 -DBUILD_CONFIG=mysql_release .
$ make
$ make install

起動確認

 インストールが済んだので、実際に MySQLサーバを起動して、クライアントから接続できるかを確認してみます。
 まずは、インストールしたフォルダに移動。

$ cd ../mysql5635/
$ pwd
/home/ec2-user/mysql/mysql5635


 データベースファイルをインストール(作成):

./scripts/mysql_install_db --datadir=./data


 mysqldを起動。ポート番号やソケット番号がヘンなのは、この後、複数バージョンを動作させるつもりなので、バージョンを分かりやすくしたかったから。

./bin/mysqld_safe --datadir=./data --port=15635 --socket=/tmp/mysql5635.sock &


 クライアントから接続して、status を見てみる。

$ ./bin/mysql -uroot -P15635 --socket=/tmp/mysql5635.sock

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.35 MySQL Community Server (GPL)
(略)


mysql> status
--------------
./bin/mysql  Ver 14.14 Distrib 5.6.35, for Linux (x86_64) using  EditLine wrapper

Connection id:          1
Current database:       
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.6.35 MySQL Community Server (GPL)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /tmp/mysql5635.sock
Uptime:                 8 min 11 sec

Threads: 1  Questions: 5  Slow queries: 0  Opens: 67  Flush tables: 1  Open tables: 60  Queries per second avg: 0.010
--------------

mysql> 


 今日はここまで。

その他ハマりどころとか

  • AWS への SSH接続が結構よく切れるのに困った。複数接続しているときに全部一遍に、追い出されるかのように切断されてしまうことが今回の作業中にも何度か。
  • cmake でエラーが出ては不足モジュールをインストールしている際に、エラーが消えず悩みました。これは処理の状態がキャッシュされているためで、rm CMakeCache.txt してから再度 cmake すればOK。

*1:この時点で私の頭が時代遅れを認識。configureじゃないんだ、と

*2:cmake したら make、という言い回しが結構気に入った。cmakeしたら負け