前回はApacheのソースインストールでしたが、今回はMySQL(5.7.17)です。
やってみると存外Apacheインストール時以外の気づきもあった為、書き記します。
前回と同様、トライアル&エラーで進めます。
手っ取り早くやりたい方は本記事の下のほうの「エラー無しでやる方法」をご覧下さい。
いつも通りソースファイルをダウンロード・解凍します。
1 2 3 |
# 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しようとしたらそんなファイルは無いと言われてしまいました。恥ずかしい…。
1 2 3 |
# cd mysql-5.7.17 # ./configure -bash: ./configure: No such file or directory |
今回の場合はcmakeというビルドツールを使用します。
cmakeをインストールしましょう。
1 |
# yum install cmake |
カレントディレクトリを表す「.」を加えてcmake。
1 2 |
(/usr/local/src/mysql-5.7.17 内で) # cmake . |
するとCコンパイラ(gcc)とC++コンパイラ(gcc-c++)が見つからないというエラーが出ました。
1 2 3 4 5 6 |
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を実行。
1 2 |
# yum install gcc gcc-c++ # cmake . |
次は下記エラーが発生します。
1 2 3 4 5 |
CMake Error at cmake/boost.cmake:81 (MESSAGE): You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST= <span style="color: #ffff00"><strong>This CMake script will look for boost in . If it is not there, it will download and unpack it (in that directory)</strong></span> for you. |
Boost(C++のライブラリ)をインストールして下さい、とのこと。
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=<ディレクトリ>でディレクトリを指定可能。
ディレクトリ内にBoostがあるか探し、無ければダウンロードして(指定したディレクトリに)解凍してくれるとのこと。
今回はBoostを/usr/local/src 内にインストールするものとしてcmakeを実行します。
この場合「.」が要りません。
cmakeはオプション無しだとUsage(使用方法)を表示してくれるので、その場合と区別する為に「.」が必要なのかも知れません。
下記のようにオプションを指定した場合であればUsageを表示したいのではなくcmakeを実行したいことが明白なので、カレントディレクトリが補完されるのかも知れません。
1 2 3 4 5 6 |
# 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)をインストールして下さい、とのこと。
言われた通りにやってみます。
1 2 |
# yum install ncurses-devel # rm CMakeCache.txt |
再々度cmakeする際、BOOSTはインストール済みなので下記のように指定してあげます。
1 2 |
# cmake -DDOWNLOAD_BOOST=1 <span style="color: #ffff00"><strong>-DWITH_BOOST=/usr/local/src/boost_1_59_0</strong></span> |
cmakeで問題が無ければコンパイル(make)。
1 2 3 4 5 6 7 8 9 10 |
# 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 <span style="color: #ffff00"><strong>virtual memory exhausted</strong></span>: 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 |
メモリが足りない(メモリを使い果たした)と言われてしまいました。
今回インストールしている環境はAWS EC2のt2.micro。
メモリは1GB積んでいますがこれでは足りないようです。
インスタンスサイズを上げるとお金が掛かるのでSWAPを作成してケチります。
1 2 3 4 5 |
# touch /swap # dd if=/dev/zero of=/swap bs=512M count=4 # mkswap /swap # swapon /swap # chmod 600 /swap |
SWAPでメモリ枯渇対策が終わったら再度コンパイル(make)します。
SWAP使用が発生するので時間が掛かります。
1 |
# make |
するとまさかのディスク容量が足りないとのエラーが。
1 2 3 4 5 6 |
[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: <span style="color: #ffff00"><strong>No space left on device</strong></span> |
t2.microでデフォルトのルートボリュームは8GB。これも足りなかったようです。
取得したAMIからルートボリューム30GBのインスタンスを起動し、やり直し。
1 2 |
# cd /usr/local/src/mysql-5.7.17 # make |
無事コンパイルが終了しました。
後はインストール(make install)。
1 |
# make install |
インストールが完了したら、mysqlユーザを作成しておきます。
1 2 |
# groupadd -g 27 mysql # useradd -g mysql -u 27 mysql |
起動スクリプトをコピーで作成し、起動します。
1 2 |
# cp -ip /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld # /etc/init.d/mysqld start |
すると下記エラーが発生しました。
1 2 3 4 5 |
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). |
このエラーを解消するのにかなり時間がかかりました…。
ネットで検索すると色々出てきますが、私は下記方法で解決(?)しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 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 <span style="color: #ffff00"><strong>datadir=/usr/local/mysql/data</strong></span> 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)を実施します。
1 |
# /usr/local/mysql/bin/mysql_install_db --user=mysql --basedir=/usr/local/src/mysql-5.7.17 --datadir=<span style="color: #ffff00"><strong>/usr/local/mysql/data</strong></span> |
mysqlを起動、起動できたら自動起動設定を追加。
1 2 3 4 |
# /etc/init.d/mysqld start # chkconfig --add mysqld # chkconfig mysqld on |
プロセス起動できたのでMySQLにログインします。
/root/.mysql_secretに初期パスワードが記載されています。
1 2 |
# cat /root/.mysql_secret # Password set for user 'root@localhost' at 2016-12-14 15:57:20 <span style="color: #ffff00"><strong>**********</strong></span> |
ソースで入れるとMySQLクライアントもインストールされているようです。
これも知りませんでした。
1 |
# /usr/local/mysql/bin/mysql -u root -p |
ログイン後、最初はコマンドを使用することができません。
rootユーザに新たにパスワードを設定する必要があります。
1 2 |
mysql> show databases; ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. |
パスワードを設定して、flushしておきます。
1 2 3 4 5 |
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コマンドが使用できるようになりました!
1 2 3 4 5 6 7 8 9 10 |
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) |
■エラー無しでやる方法
・充分なディスクを積んだサーバを用意する
※筆者の場合はルートボリューム30GBでOKでした
・SWAP作成(もしくは充分なメモリを積んだサーバを用意する)
1 2 3 4 5 |
# touch /swap # dd if=/dev/zero of=/swap bs=512M count=4 # mkswap /swap # swapon /swap # chmod 600 /swap |
・各種インストール(cmake, Cコンパイラ, C++コンパイラ, Cursesライブラリ)
1 |
# yum install cmake gcc gcc-c++ ncurses-devel |
・ソースファイルのダウンロード、解凍
1 2 3 |
# 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、コンパイル、インストール
1 2 3 4 |
# cd mysql-5.7.17 # cmake -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/src/ # make # make install |
・ユーザ作成
1 2 |
# groupadd -g 27 mysql # useradd -g mysql -u 27 mysql |
・データベース初期化
1 |
# /usr/local/mysql/bin/mysql_install_db --user=mysql --basedir=/usr/local/src/mysql-5.7.17 --datadir=/usr/local/mysql/data |
・起動スクリプト作成、起動
1 2 |
# cp -ip /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld # /etc/init.d/mysqld start |
・自動起動設定
1 2 |
# chkconfig --add mysqld # chkconfig mysqld on |
・MySQLの初期パスワードの確認
1 |
# cat /root/.mysql_secret |
・MySQLログイン
1 |
# /usr/local/mysql/bin/mysql -u root -p |
・MySQLパスワード設定
1 2 |
mysql> set password = password('**********'); mysql> flush privileges; |
投稿者プロフィール
- 2015年8月入社。弊社はインフラ屋ですが、アプリも作ってみたいです。