前回は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;
投稿者プロフィール
- 2015年8月入社。弊社はインフラ屋ですが、アプリも作ってみたいです。