MySQL5.7 ソースインストール

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回はApacheのソースインストールでしたが、今回はMySQL(5.7.17)です。
やってみると存外Apacheインストール時以外の気づきもあった為、書き記します。

前回と同様、トライアル&エラーで進めます。
手っ取り早くやりたい方は本記事の下のほうの「エラー無しでやる方法」をご覧下さい。

いつも通りソースファイルをダウンロード・解凍します。

# cd /usr/local/src
# wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17.tar.gz
# tar xvzf mysql-5.7.17.tar.gz

Apacheの時と同じ調子でconfigureしようとしたらそんなファイルは無いと言われてしまいました。恥ずかしい…。

# cd mysql-5.7.17
# ./configure
-bash: ./configure: No such file or directory

今回の場合はcmakeというビルドツールを使用します。
cmakeをインストールしましょう。

# yum install cmake

カレントディレクトリを表す「.」を加えてcmake。

(/usr/local/src/mysql-5.7.17 内で)
# cmake .

するとCコンパイラ(gcc)とC++コンパイラ(gcc-c++)が見つからないというエラーが出ました。

CMake Error: your C compiler: "CMAKE_C_COMPILER-NOTFOUND" was not
found.   Please set CMAKE_C_COMPILER to a valid compiler path or name.
CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not
found.   Please set CMAKE_CXX_COMPILER to a valid compiler path or name.
CMake Error at cmake/os/Linux.cmake:41 (MESSAGE):
  Unsupported compiler!

Cコンパイラ(gcc)とC++コンパイラ(gcc-c++)をインストールし、再度cmakeを実行。

# yum install gcc gcc-c++
# cmake .

次は下記エラーが発生します。

CMake Error at cmake/boost.cmake:81 (MESSAGE):
  You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=

  This CMake script will look for boost in .  If it is not there,
  it will download and unpack it (in that directory) for you.

Boost(C++のライブラリ)をインストールして下さい、とのこと。
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=<ディレクトリ>でディレクトリを指定可能。
ディレクトリ内にBoostがあるか探し、無ければダウンロードして(指定したディレクトリに)解凍してくれるとのこと。

今回はBoostを/usr/local/src 内にインストールするものとしてcmakeを実行します。
この場合「.」が要りません。

cmakeはオプション無しだとUsage(使用方法)を表示してくれるので、その場合と区別する為に「.」が必要なのかも知れません
下記のようにオプションを指定した場合であればUsageを表示したいのではなくcmakeを実行したいことが明白なので、カレントディレクトリが補完されるのかも知れません

# cmake -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/src/

CMake Error at cmake/readline.cmake:64 (MESSAGE):
  Curses library not found.  Please install appropriate package,

      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.

またもエラーが。
CMakeCache.txtを消してncurses-devel(Debian/Ubuntuならlibncurses5-dev)をインストールして下さい、とのこと。
言われた通りにやってみます。

# yum install ncurses-devel
# rm CMakeCache.txt

再々度cmakeする際、BOOSTはインストール済みなので下記のように指定してあげます。

# cmake -DDOWNLOAD_BOOST=1
-DWITH_BOOST=/usr/local/src/boost_1_59_0

cmakeで問題が無ければコンパイル(make)。

# make
〜
[ 36%] Building CXX object sql/CMakeFiles/sql.dir/item_cmpfunc.cc.o
[ 36%] Building CXX object sql/CMakeFiles/sql.dir/item_create.cc.o
[ 37%] Building CXX object sql/CMakeFiles/sql.dir/item_func.cc.o
[ 37%] Building CXX object sql/CMakeFiles/sql.dir/item_geofunc.cc.o
virtual memory exhausted: Cannot allocate memory
make[2]: ***  Error 1
make[1]: ***  Error 2
make: *** [all] Error 2

メモリが足りない(メモリを使い果たした)と言われてしまいました。

今回インストールしている環境はAWS EC2のt2.micro。
メモリは1GB積んでいますがこれでは足りないようです。
インスタンスサイズを上げるとお金が掛かるのでSWAPを作成してケチります。

# touch /swap
# dd if=/dev/zero of=/swap bs=512M count=4
# mkswap /swap
# swapon /swap
# chmod 600 /swap

SWAPでメモリ枯渇対策が終わったら再度コンパイル(make)します。
SWAP使用が発生するので時間が掛かります。

# make

するとまさかのディスク容量が足りないとのエラーが。

[100%] Building CXX object
libmysqld/CMakeFiles/sql_embedded.dir/__/sql/unireg.cc.o
[100%] Building CXX object
libmysqld/CMakeFiles/sql_embedded.dir/__/sql/xa.cc.o
Linking CXX static library libsql_embedded.a
/usr/bin/ranlib: libsql_embedded.a: No space left on device

t2.microでデフォルトのルートボリュームは8GB。これも足りなかったようです。
取得したAMIからルートボリューム30GBのインスタンスを起動し、やり直し。

# cd /usr/local/src/mysql-5.7.17
# make

無事コンパイルが終了しました。
後はインストール(make install)。

# make install

インストールが完了したら、mysqlユーザを作成しておきます。

# groupadd -g 27 mysql
# useradd -g mysql -u 27 mysql

起動スクリプトをコピーで作成し、起動します。

# cp -ip /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# /etc/init.d/mysqld start

すると下記エラーが発生しました。

Starting MySQL./usr/local/mysql/bin/mysqld_safe: line 586:
/usr/local/mysql/data/mysqld_safe.pid: No such file or directory
awk: (FILENAME=- FNR=1) warning: error writing standard output (Broken pipe)
Logging to '/usr/local/mysql/data/mysql-source-20161214.err'.
 ERROR! The server quit without updating PID file (/usr/local/mysql/data/****.pid).

このエラーを解消するのにかなり時間がかかりました…。
ネットで検索すると色々出てきますが、私は下記方法で解決(?)しました。

# less /etc/init.d/mysqld
〜
# Set some defaults
mysqld_pid_file_path=
if test -z "$basedir"
then
  basedir=/usr/local/mysql
  bindir=/usr/local/mysql/bin
  if test -z "$datadir"
  then
    datadir=/usr/local/mysql/data
  fi
  sbindir=/usr/local/mysql/bin
  libexecdir=/usr/local/mysql/bin
else
  bindir="$basedir/bin"
  if test -z "$datadir"
  then
    datadir="$basedir/data"
  fi
  sbindir="$basedir/sbin"
  libexecdir="$basedir/libexec"
fi
〜

起動スクリプトに datadir=/usr/local/mysql/data の記述が。
これに従いデータベース初期化(install_db)を実施します。

# /usr/local/mysql/bin/mysql_install_db --user=mysql --basedir=/usr/local/src/mysql-5.7.17 --datadir=/usr/local/mysql/data

mysqlを起動、起動できたら自動起動設定を追加。

# /etc/init.d/mysqld start

# chkconfig --add mysqld
# chkconfig mysqld on

プロセス起動できたのでMySQLにログインします。
/root/.mysql_secretに初期パスワードが記載されています。

# cat /root/.mysql_secret
# Password set for user 'root@localhost' at 2016-12-14 15:57:20 **********

ソースで入れるとMySQLクライアントもインストールされているようです。
これも知りませんでした。

# /usr/local/mysql/bin/mysql -u root -p

ログイン後、最初はコマンドを使用することができません。
rootユーザに新たにパスワードを設定する必要があります。

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

パスワードを設定して、flushしておきます。

mysql> set password = password('**********');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

これでMySQLコマンドが使用できるようになりました!

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

■エラー無しでやる方法

・充分なディスクを積んだサーバを用意する
※筆者の場合はルートボリューム30GBでOKでした

・SWAP作成(もしくは充分なメモリを積んだサーバを用意する)

# touch /swap
# dd if=/dev/zero of=/swap bs=512M count=4
# mkswap /swap
# swapon /swap
# chmod 600 /swap

・各種インストール(cmake, Cコンパイラ, C++コンパイラ, Cursesライブラリ)

# yum install cmake gcc gcc-c++ ncurses-devel

・ソースファイルのダウンロード、解凍

# cd /usr/local/src
# wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17.tar.gz
# tar xvzf mysql-5.7.17.tar.gz

・cmake、コンパイル、インストール

# cd mysql-5.7.17
# cmake -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/src/
# make
# make install

・ユーザ作成

# groupadd -g 27 mysql
# useradd -g mysql -u 27 mysql

・データベース初期化

# /usr/local/mysql/bin/mysql_install_db --user=mysql --basedir=/usr/local/src/mysql-5.7.17 --datadir=/usr/local/mysql/data

・起動スクリプト作成、起動

# cp -ip /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# /etc/init.d/mysqld start

・自動起動設定

# chkconfig --add mysqld
# chkconfig mysqld on

・MySQLの初期パスワードの確認

# cat /root/.mysql_secret

・MySQLログイン

# /usr/local/mysql/bin/mysql -u root -p

・MySQLパスワード設定

mysql> set password = password('**********');
mysql> flush privileges;

投稿者プロフィール

sato
2015年8月入社。大学は英文科で、7月より情報系の勉強を始めました。
当面は技術者目指して頑張ります!

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

2015年8月入社。大学は英文科で、7月より情報系の勉強を始めました。 当面は技術者目指して頑張ります!