MySQLのデータベース(スキーマ)に別名を付けるcreate_synonym_db

 昨日の 日本MySQLユーザ会会(MyNA会)で、yoku0825さんがお話の中で紹介してくれていた、create_synonym_db が面白かったので、記録しておく。曰く:


 sysスキーマの中にある create_synonym_db を使うと、データベースに別名を付けることができます。
この「データベース」というのは、CREATE DATABASE したりする、あの「データベース」ね。useしたりする、あれね。


例として紹介されていたのは、performance_schema という長ったらしい名前に p_s という別名を付けるというもの。

mysql> call sys.create_synonym_db('performance_schema', 'p_s');                                                 
+----------------------------------------+
| summary                                |
+----------------------------------------+
| Created 87 views in the `p_s` database |
+----------------------------------------+
1 row in set (0.21 sec)

 と実行すると、performance_schema の中にある87個のテーブルまたはビューに対して、p_s データベースの中にビューを作ってくれます。データベースリストを見ると p_s ができていることがわかります。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mytest             |
| p_s                |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)


 もちろん、自分で作ったテーブルに対しても、別名を付けることができます。以下は、test データベースに対して t という名前でも利用できるようにしたもの。

mysql> call sys.create_synonym_db('test','t');
+------------------------------------+
| summary                            |
+------------------------------------+
| Created 1 view in the `t` database |
+------------------------------------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> show databases;                                                                                                                       
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| t                  |
| test               |
+--------------------+
6 rows in set (0.00 sec)


 この日記では「別名」と書きましたが、特別なエイリアス用の仕組みがあるわけではなく、ビューを作ってくれるもののようです。 テーブル/ビューの一覧を information_schema から見てみると判ります。

mysql> select table_schema, table_name, table_type FROM information_schema.tables;
+--------------------+------------------------------------------------------+-------------+
| table_schema       | table_name                                           | table_type  |
+--------------------+------------------------------------------------------+-------------+
| information_schema | CHARACTER_SETS                                       | SYSTEM VIEW |
| information_schema | COLLATIONS                                           | SYSTEM VIEW |
:
| p_s                | accounts                                             | VIEW        |
| p_s                | cond_instances                                       | VIEW        |
| p_s                | events_stages_current                                | VIEW        |
| p_s                | events_stages_history                                | VIEW        |
| p_s                | events_stages_history_long                           | VIEW        |
:
| performance_schema | accounts                                             | BASE TABLE  |
| performance_schema | cond_instances                                       | BASE TABLE  |
| performance_schema | events_stages_current                                | BASE TABLE  |
| performance_schema | events_stages_history                                | BASE TABLE  |
| performance_schema | events_stages_history_long                           | BASE TABLE  |
:
+--------------------+------------------------------------------------------+-------------+
369 rows in set (0.01 sec)

 また、そういう仕組みなので、synonym を作ったあとで CREATE TABLE したものは両方から見えるわけではないので、ちゅうい。



 ただ、character_set 等を保持してくれないみたいなのは、気になるところ。このサーバは character_set_server=utf8mb4 で動作させているので、 performance_schema が utf8 なのに、p_s が utf8_mb4 で作成されてしまっています。変換がかかるから問題ないような気もするけど、本来不要な変換が挟まることによるリスクが気になるのは、古き時代の単なるトラウマか。

mysql> select * FROM schemata;                                                                                                               
+--------------+--------------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+--------------------+----------------------------+------------------------+----------+
| def          | information_schema | utf8                       | utf8_general_ci        | NULL     |
| def          | mysql              | utf8mb4                    | utf8mb4_general_ci     | NULL     |
| def          | p_s                | utf8mb4                    | utf8mb4_general_ci     | NULL     |
| def          | performance_schema | utf8                       | utf8_general_ci        | NULL     |
| def          | sys                | utf8                       | utf8_general_ci        | NULL     |
| def          | t                  | utf8mb4                    | utf8mb4_general_ci     | NULL     |
| def          | test               | utf8mb4                    | utf8mb4_general_ci     | NULL     |
+--------------+--------------------+----------------------------+------------------------+----------+
7 rows in set (0.00 sec)

#もしかして、bugs事案? もう誰かレポート済みかな。

MySQLのInnoDBって file_per_table がデフォルトになっていたのか!

 「趣味のMySQLユーザ」の時期が続いていたこともあって、実体験による情報よりも、すっかり耳年増になってしまいました。取り返すべく、AWSの環境*1を得たのをきっかけに、色々試し始めています。


 今回触っていて、「あれっ?」と思ったのは、CREATE TABLE したら、テーブルごとに idb ファイルができあがっていたということ。いわゆる「file per table」というやつです。
 従来 InnoDB は、my.cnf で指定した idbファイル群を全テーブルで共通して使用していました。
innodb_file_per_table 自体は MySQL 4.1.8 の頃から存在しているものなのですが、私の中ではイロモノ的なイメージのままだったので、これがデフォルトになっていることにびっくりしました。
 調べてみると、MySQL 5.5.6まででデフォルトオンになっていたのに、MySQL 5.5.7からオフにした経緯があったようで、このときに「なにかヨクナイことがあったのかな」という印象を持ったのかもしれません。
 今に繋がる流れとして、MySQL 5.6.6からは再度デフォルトオンになっていたようで、随分遅れての認識と相成った次第です。

mysql> create table test1 (a int, b varchar(10));                                                               
mysql> create table test2 (a int, b varchar(10));
mysql> create table test3 (a int, b varchar(10));


$ ls -la
total 436
-rw-r-----. 1 ec2-user ec2-user    67 Jan 25 05:58 db.opt
-rw-r-----. 1 ec2-user ec2-user  8578 Jan 25 06:38 test1.frm
-rw-r-----. 1 ec2-user ec2-user 98304 Jan 25 06:38 test1.ibd
-rw-r-----. 1 ec2-user ec2-user  8578 Jan 25 06:38 test2.frm
-rw-r-----. 1 ec2-user ec2-user 98304 Jan 25 06:38 test2.ibd
-rw-r-----. 1 ec2-user ec2-user  8578 Jan 25 06:38 test3.frm
-rw-r-----. 1 ec2-user ec2-user 98304 Jan 25 06:38 test3.ibd

*1:と言っても、すぐに作って壊せるレンタルサーバの環境という程度の使い方しかしていませんが

ラズパイ初体験

 なんか面白そうだけど、センサーとかの周辺装置に際限なくなりそうだなーという恐怖感もあって今まで距離を置いていたラズパイこと Raspberry Pi。昨今の雑誌やWeb記事の増加に耐えられなくなり、ついに手を出してしまいました。
f:id:sakaik:20170124201729j:plain


 買ってまず驚いたのは、我が家には HDMI入力を受け付けてくれる映像出力装置が、居間のテレビしかなかったということ。PCモニタについていると思い込んでいました。驚くポイントはそこじゃないだろうという感じですが、いや、これびっくりでしたよ、本当に。 とりあえずテレビを使って遊んでみて、その後、HDMI-DVI接続ケーブルを買ったので、PCのモニタを使って遊ぶことができるようになりました。


以下、記録を兼ねて作業メモと感想などを。
なお、今回の一連の作業の主な情報源は、日経Linux2017年2月号と、Facebookのオトモダチからの情報です。

用意したもの(事後に用意したものも含む)

Raspberry Pi 3 本体(ケースつきのものを購入)
・micro SD カード 16GB
・micro USBケーブルとANKERの急速充電器ハブ(いままで使っていたもの)
・USBキーボード(使わずに押し入れの中で眠っていたもの)
・USBマウス(我が家に既に有線マウスが意外となくてびっくり。他のマシンで使っていたものを一時拝借)
HDMIケーブル、後に HDMI-DVI ケーブル
HDMIの入力端子のあるテレビ、後に DVI端子のあるPC用モニタ

 これらを、直感に従って接続。

起動までの手順

 Windows PC を使って、micro SD カードをフォーマット。フォーマットには以下の「SDカードフォーマッタ」を使用。日経Linuxの記事に従って、「論理サイズ調整」をオンにして実行した。
https://www.sdcard.org/jp/downloads/formatter_4/eula_windows/index.html

 次に、Raspberry Pi  のサイトから、NOOKSをダウンロードし、フォーマットの済んだSDカードにコピー。
https://www.raspberrypi.org/downloads/

 SDカードを Raspberry Pi に挿して、起動。インストーラが立ち上がるので、画面の指示に従って進行。20分くらいかかった。

ターミナル(LXTerminal)でコマンドを叩いて、日本語フォント等をインストール

$ sudo apt-get update
$ sudo apt-get install ibus-mozc fonts-ipafont fonts-ipaexfont

インストール後、画面メニューから一旦リブート。

 リブート後、右上の無線マークから無線LANの設定をし、
左上メニュー「設定」から、「ローカライゼーション」にて、タイムゾーン、キーボード、無線LANの国設定を行った。


以上で使える環境ができました。


 普段は CentOS とか Red Hat 使いなので、Debian系というだけでまず新鮮なのですが、それならデスクトップのVM上にでもDebian入れれば良いわけで、やっぱり今後は Raspberry Pi らしく、実際にモノが動くものをやってみたいですね。
まずは、やっぱり「Lチカ」でしょうか?(笑)
あたらしいものを触るって、わくわくしますね!!

AWS(EC2)上でのMySQL5.7ビルド時間の実験

 MySQLをビルドしたり動作させたりするための環境が手軽に手に入るようになったのが嬉しくて、いろいろ試してみています。
相変わらずビルドを繰り返し。
ビルドが必要となる要件は私にはそうそうありませんが、ここぞという時にちょこっとソースをいじってビルドできるという安心感を、この経験は与えてくれる気がしています。

ということで、今回はビルド時間編。

概要

 (1)AWSの 色々なインスタンスタイプで、ビルド時間を比べてみる
 (2)AWSの t2.2xlarge で、makeの -j オプション値を変更しながらビルド時間を比べてみる

 いずれも、この日記末尾のスクリプトを使用して測定した。
 (ここで話題にするのは makeの時間(03と04の間)のみ)


(1)AWSインスタンスタイプ差によるビルド時間の違い

 以下の表のとおり。make の -j オプションは、以下に明記のない場合はそれぞれのCPUの数に合わせた。

Type CPU Memory make時間 備考
t2.tiny 1 1 1h55'55" swapファイル使用
t2.tiny 1 1 2h12'28" swapファイル使用
t2.medium 2 4 35'43" make に j オプションなし
t2.medium 2 4 18'13" make -j 2
t2.2xlarge 8 32 4'46"
m4.10xlarge 40 160 2'20"

※t2.tiny での結果は、実施によってブレが大きかったので、両方載せた。


 4 CPU の環境での実験を行わなかったが、概ね、8CPU の環境であれば5分程度と、まぁソースを何か変更してビルドしてみるのに許容範囲かな、という気がします。


(2)makeの -j オプション値によるビルド時間の違い

 t2.2xlarge(8 CPU, 32GB memory) にて、make の j オプション(並列実行数)を変更しながら、どのようにmake時間が変化するかを見た。-j 10 と -j 12 は、おあそび。

makeオプション make時間 備考
-j 2 16'40"
-j 4 8'47"
-j 6 5'59"
-j 7 5'10"
-j 8 4'46"
-j 10 4'37 CPU数は8だけど
-j 12 4'47 CPU数は8だけど


 t2.tiny(2CPU)で -j 2 で実施したものと、本環境で -j 2 で実施したものが、17~18分程度と、ほぼ近い時間となっていますね。
"-j 10" と "-j 12" は興味本位で遊んでみたものですが、誤差の範囲と解釈して良い感じなのかな。 競合によって、もっと急激に遅くなると予想していたので、これはこれで結構意外。

 雑にプロットしたものが、以下。横軸がCPU数、縦軸がかかった時間(秒)。
f:id:sakaik:20170115235021j:plain:w400

参考:使用したスクリプト

 以下のスクリプトの make オプションの値を適宜変更してビルドを実施した。

touch ~/00start_`date +%H%M%S`
sudo yum -y install wget gcc gcc-c++ cmake libaio-devel bison ncurses-devel perl-Data-Dumper
sudo yum -y remove mariadb-libs
touch ~/01yumend_`date +%H%M%S`
mkdir mysql/
cd !$
wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.17.tar.gz
tar xvf mysql-boost-5.7.17.tar.gz
cd mysql-5.7.17
touch ~/02tarend_`date +%H%M%S`
cmake -DWITH_BOOST=./boost -DCMAKE_INSTALL_PREFIX=/home/ec2-user/mysql/mysql5717 -DBUILD_CONFIG=mysql_release
touch ~/03cmakeend_`date +%H%M%S`
make -j 8
touch ~/04makeend_`date +%H%M%S`
make install
touch ~/05allend_`date +%H%M%S`

AWS上でMySQL5.7動作環境を最速で作る方法(Generic binaries使用)(※5.6追記あり)

 ビルドするほどに時間はかからず、rpmで入れるよりは自由度が高い(自分のローカルでの動作、複数バージョンの動作)ということで、Generic binariesを使って、とにかく最短でMySQL 5.7 の2つのバージョンを入れてみます。

f:id:sakaik:20170106162210j:plain:w350

 環境はいつもの t2.micro です。
今回からは、(デフォルトではディスク10GBだけど30GBまでは無料お試し枠に入っているということで)ディスクを30GBにしました。
10GBだと、MySQL 5.7 をダウンロード&展開(=インストール)のセット3つめで満杯になります。ちょっと窮屈。

スクリプトの作成と実行

 つべこべ言わず、以下の内容を記述したファイルを作成します。名前は inst5717 とか。
作成したら、実行権限を与えて実行します。
 次に(別窓とかで) inst5717 をコピーして inst5716 を作成し、ファイル中の MVER=17 の数字部分を 16 に変更して実行します。

 実行後は、それぞれのディレクトリに移動して、mysqlクライアントプログラムを使って接続確認&パスワードの変更をします。

#!/usr/bin/bash

MVER=17

sudo yum -y install wget libaio-devel
sudo yum -y remove mariadb-libs

cd ~
mkdir -p mysql/
cd mysql
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.${MVER}-linux-glibc2.5-x86_64.tar.gz
tar xvf mysql-5.7.${MVER}-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.7.${MVER}-linux-glibc2.5-x86_64 mysql57${MVER}
cd mysql57${MVER}

#echo ------------------------------------
#echo Please push ENTER key to continue.
#read

cat <<EOF > my.cnf
[mysqld]
log-error=/home/ec2-user/mysql/mysql57${MVER}/my.err
basedir = /home/ec2-user/mysql/mysql57${MVER}
datadir = /home/ec2-user/mysql/mysql57${MVER}/data
port=157${MVER}
socket=/tmp/mysql57${MVER}.sock
character-set-server=utf8mb4

[mysqladmin]
socket=/tmp/mysql57${MVER}.sock

[mysql]
port=157${MVER}
socket=/tmp/mysql57${MVER}.sock
default-character-set=utf8mb4
EOF


bin/mysqld --defaults-file=./my.cnf --initialize
bin/mysql_ssl_rsa_setup --defaults-file=./my.cnf

bin/mysqld_safe &

sleep 3

grep 'temporary password' my.err 
echo To connect: ./bin/mysql --defaults-file=./my.cnf -uroot -p
echo Change password: ALTER USER root@localhost IDENTIFIED BY \'mypass\';

注意点やその他情報など

  • 当然ながら、ダウンロード提供されていないバージョンのファイルはダウンロードできませんので、適宜 MVER=17 の部分は最新状態に変更してお使いください。概ね、最新から3つのマイナーバージョンのダウンロードが提供されています。
  • スクリプト実行後は、インストールしたフォルダではなく実行時のフォルダに戻ってしまうので、クライアントからの接続確認の際には自分でcdする必要があります
  • この方法で、概ね3分程度で、MySQL実行までたどり着きます。ほとんどが tar を展開している時間です。

 こちらからは以上です



#5.6や 8.0のスクリプトも欲しいね。


●2017お年始のMySQL関連日記書き殴り一覧:

追記:MySQL 5.6 用スクリプト

 まぁここまで来たら作りますよね、当然。
データベースファイル群作成の方法が異なるのと、それに伴い、Perl系のプログラムやライブラリを入れておく必要がある点が異なります。処理時間は70秒程度でした。

あとは、やっていない事と言えば

  • 5.6と 5.7、ひとつのスクリプトになったらいいなぁ
  • ファイルのwgetについて、存在しない場合は検知してちゃんとエラー出して止まるといいなぁ
  • 処理終了後に、そのまま(インストール後の)フォルダに居てくれたらいいなぁ

というあたりでしょうか。

誰かやりませんか。


MySQL 5.6.35 をインストールするスクリプト例:

#!/usr/bin/bash

MVER=35

sudo yum -y install wget libaio-devel perl perl-Data-Dumper
sudo yum -y remove mariadb-libs

cd ~
mkdir -p mysql/
cd mysql
wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.${MVER}-linux-glibc2.5-x86_64.tar.gz
tar xvf mysql-5.6.${MVER}-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.${MVER}-linux-glibc2.5-x86_64 mysql56${MVER}
cd mysql56${MVER}

#echo ------------------------------------
#echo Please push ENTER key to continue.
#read

cat <<EOF > my.cnf
[mysqld]
log-error=/home/ec2-user/mysql/mysql56${MVER}/my.err
basedir = /home/ec2-user/mysql/mysql56${MVER}
datadir = /home/ec2-user/mysql/mysql56${MVER}/data
port=156${MVER}
socket=/tmp/mysql56${MVER}.sock
character-set-server=utf8mb4

[mysqladmin]
socket=/tmp/mysql56${MVER}.sock

[mysql]
port=156${MVER}
socket=/tmp/mysql56${MVER}.sock
default-character-set=utf8mb4
EOF


scripts/mysql_install_db --datadir=./data

bin/mysqld_safe &

sleep 3

echo To connect: ./bin/mysql --defaults-file=./my.cnf -uroot 

MySQL 5.7 を t2.micro でもビルドできた!

 ひとつ前の日記で、「MySQL 5.7 は、ビルドのために大量にメモリを要求するので、AWS Red Hat の t2.micro、すなわちメモリ 1GBではビルドできない」という趣旨のことを書きました。その時点での対応策として、t2.medium というメモリ4GBの環境を利用することで、ビルドに成功しました。

 その後、「t2.micro は、デフォルトではswapファイルの設定が無効になっているよ」と、詳しい方から教えていただき、設定の後に t2.micro でも MySQL 5.7 をビルドできたので、ここに紹介します。

t2.micro でMySQL 5.7をビルドするために必要な設定

 以下の手順でswapファイルを作成し、使用可能な状態にします。ここでは 1GBの領域を作成しました。

# dd if=/dev/zero of=/myswapfile bs=1M count=1024
# chmod 600 /myswapfile
# mkswap /myswapfile
# swapon /myswapfile 

 swapファイルの状態を確認するコマンドは、

# swapon -s

 なので、作成前と作成後にどんな状態になっているかを確認すると良いでしょう。
 (ビルド中に、実際の使用量を確認するのにも使います)

 これだけです。

ビルド作業

 あとは、ひとつ前の日記で紹介した手順と同じです。
make中に swap の使用状況を見ていると、item_geofunc.cc.o 関連の処理のときに最大 600MB くらいまで使用されているのを確認できました。swap領域を含めて、概ね 2GB のメモリを積んでいれば、MySQL 5.7 をビルドできると考えて良さそうです(1GB+512MBなメモリ環境ではビミョー、たぶんアウト)。

 ただしベラボウに時間がかかります。
最初の難関である「item_geofunc.cc.o」のコンパイルまでが 約10分。無事に通過してくれて、しめしめと思っていたが、そこから先も長かった。結局処理が終わったのは、開始から75分後。
データベースの initialize をして接続確認まで、動作することを一応確認はしたけど、なんども実施するにはちょっとツラいくらいの時間ですね。

=====
追記:
 またまた詳しい人から情報を頂戴しました。
t2.micro で時間がかかるの原因のひとつとして推測できるのが、CPUクレジットとのこと。以下のブログ参照。
aws.typepad.com
=====

MySQL 5.7 のビルドにトライ ~ 5.6とは大違い

 ひとつ前の日記までで、MySQL 5.6 のビルドが快調にできたことに気をよくして、MySQL 5.7 のビルドにも挑戦してみました。5.6.35 と 5.6.34 の差(ビルド環境や方法に違いはない)と同じように バージョン番号関係の部分を 5.7.17 に変えれば良いのだろうと考えていたら、大違い。

MySQL5.6をビルドして動作させるのと違うところ

  • boost の 1.59 が要求される。Red Hat 7.3 のyumでは boost 1.53 しか入らないので一工夫必要
  • make するのにメモリが多く要求される。
  • データベースの初期化方法と、初期パスワード設定が違う


 以下それぞれについて説明したあと、全体の手順を紹介したいと思います。

boost 1.59 が必要

 yumでワンタッチで入らないので、一手間かかるなぁと思っていたら、MySQL開発チームは boost 1.59 入りのソースコードを提供してくれていました!*1
 mysql-5.7.17.tar.gz ではなく、mysql-boost-5.7.17.tar.gz をダウンロードして使用します。

f:id:sakaik:20170105160147j:plain:w350


メモリがいっぱい必要

 AWS Red Hat 7.3 の、t2.micro(1 CPU, 1GBメモリ)では、make の途中で落ちてしまいました。t2.medium (2 CPU, 4GBメモリ)では無事、処理を完了できました。

======
追記:
swapの設定をすることで、t2.micro でもビルドできました。ただし大変に時間がかかります。
MySQL 5.7 を t2.micro でもビルドできた! - sakaikの日々雑感~(T)編

======


 メモリが不足している環境で落ちるパターンは2つあるようで、

  • OOMキラーに殺されるケース (/var/log/messages にログが記録される)*2
  • 行儀良くメモリ不足になって落ちるケース


OOMキラーに殺されたときの出力:

 :
[ 43%] Building CXX object sql/CMakeFiles/sql.dir/item_func.cc.o
[ 43%] Building CXX object sql/CMakeFiles/sql.dir/item_geofunc.cc.o
c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
make[2]: *** [sql/CMakeFiles/sql.dir/item_geofunc.cc.o] Error 4
make[1]: *** [sql/CMakeFiles/sql.dir/all] Error 2
make: *** [all] Error 2

行儀よく(?)メモリ不足で落ちたときの出力:

[ 41%] Building CXX object sql/CMakeFiles/sql.dir/item_geofunc.cc.o
virtual memory exhausted: Cannot allocate memory
make[2]: *** [sql/CMakeFiles/sql.dir/item_geofunc.cc.o] Error 1
make[1]: *** [sql/CMakeFiles/sql.dir/all] Error 2
make: *** [all] Error 2


OOMキラーに殺されたときの/var/log/messages への記録:

Jan 4 21:55:39 ip-172-31-16-117 kernel: Out of memory: Kill process 28375 (cc1plus) score 812 or sacrifice child Jan 4 21:55:39 ip-172-31-16-117 kernel: Killed process 28375 (cc1plus) total-vm:990440kB, anon-rss:821020kB, file-rss:1828kB, shmem-rss:0kB

MySQL 5.7 のビルド

 ということで、MySQL 5.7.17 をビルドする方法です。前述したように AWSの t2.micro ではメモリが不足していたので、4GBメモリの t2.medium のインスタンスを立ち上げて試しました。

f:id:sakaik:20170105160246j:plain:w350


今回は新しいマシン環境にしたので、各種モジュールを入れる:

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


MySQL 5.7.17(boost入り)を取得して展開:

$ mkdir mysql/
$ cd !$
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.17.tar.gz
$ tar xvf mysql-boost-5.7.17.tar.gz
$ cd mysql-5.7.17

cmakeの実行。boostライブラリの位置を WITH_BOOST で指定するのがポイント。
その後 make*3

$ cmake -DWITH_BOOST=./boost -DCMAKE_INSTALL_PREFIX=/home/ec2-user/mysql/mysql5717 -DBUILD_CONFIG=mysql_release

$ make

$ make install

make には、t2.mediumの環境で40分かかりました。やっぱり MySQL 5.7、でかいですね。



インストール後の作業

 インストールが済んだら、

  • データベースファイルの作成
  • MySQLサーバの起動
  • クライアントからの接続確認

をします。

 MySQL 5.7.6 からは、初期データベースの作成方法が変更となっています*4

$ ./bin/mysqld --initialize
 :
2017-01-05T05:00:32.599615Z 1 [Note] A temporary password is generated for root@localhost: 4gV=;%jYin6v

作成すると、初期パスワードが画面に表示されていますので、覚えておきます*5


my.cnf を作成します。MySQL 5.6 と異なり、ベースとなるフォルダには my.cnf のひな形はありません。
新規に作成するか、あるいはテンプレートを使いたい人は support-files の中のmy-default.cnf ファイルをコピー/リネームして使います*6

$ vi my.cnf
------
[mysqld]
character-set-server=utf8mb4
log-error=/home/ec2-user/mysql/mysql5717/my.err
port=15717
socket=/tmp/mysql5717.sock

[mysqladmin]
socket=/tmp/mysql5717.sock

[mysql]
default-character-set=utf8mb4
socket=/tmp/mysql5717.sock
port=15717
------

 今回は ポートは 15717、キャラクタセットは utf8mb4 にしてみました。



MySQLサーバの起動:

$ ./bin/mysqld_safe &

クライアントからの接続:

$ ./bin/mysql --defaults-file=./my.cnf -uroot -p

 先ほど記憶した初期パスワードを入力します。

 MySQL 5.7 では、初期パスワードを変更するまで、なんにもできないようになっています。
ALTER USER 構文を使ってパスワードを変更します*7

mysql> ALTER USER root@localhost IDENTIFIED BY 'mynEwP455wD';

statusを見てみると、期待したバージョンが、期待したキャラクタセットの設定で起動していることがわかります。
f:id:sakaik:20170105160348j:plain:w350



 ということで、無事 MySQL 5.7 もビルドできました。
MySQL 5.7 は驚くほど大きな進化」とよく言いますが、1GBメモリの環境でビルドできないことや、ビルド時間が倍かかる(20分→40分)ことなどから、その進化のサイズが並ならぬものであることが実感できました。
 特に、今回メモリ不足で落ちたのが geo 関係のところということで、たまたまその位置で不足しただけという可能性は勿論ありますが、個人の印象としては「geo関係、でっかいなぁ」と感じました。


 ということで、年始の時間を利用した「MySQLビルドあそび」終了です。 yokuさんの記事に始まり、エラーの解決方法をtwitterでyokuさんに教えていただくなど、yokuさんにyokuお世話になりました。特に、メモリ不足の可能性には恐らく自力でたどり着かなかったと思います。ありがとうございました!

----------

*1:yoku0825さんに教えていただきました

*2:yoku0825さんに教えていただきました

*3:cmake したら make

*4:以前は、mysql_install_db スクリプトを使用しました

*5:ほとんどの人は自分の脳で覚えられないでしょうから、コピペなどの技術を用います

*6:MySQL 5.7.18からは、このファイルも同梱されなくなるとアナウンスされているので、基本的に my.cnf は自分で作るものだと思っておくと良いでしょう

*7:MySQL 5.7.6より前は SET PASSWORD FOR 構文を使いました