MySQL5.7のバイナリーインストール

# はじめに
MySQL5.7のバイナリーをインストールする機会があったのでまとめました。
環境はCentOS7.3を使用しています。

手順は以下を参考にしています。
[【2.2 Installing MySQL on Unix/Linux Using Generic Binaries】](https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html)

### バイナリーインストールとは
MySQLのコンパイルしたデータをそのままサーバーに展開するインストール手法です。
RHEL系でMySQLをインストールする際は、yumコマンドなどでrpmファイル実行してインストールする方法が一般的だと思いますが、特定のディレクトリに展開したい、実行ユーザーを変更したいなどの理由がある場合はバイナリインストールを選択することがあります。
ただし、バイナリインストールは依存関係の解決や初期化などyumが自動で実施するところを手動で行う必要があるため、ある程度の知識が必要になります。

# MySQLのバイナリインストール手順
概要は以下の通りです。

・MySQLデータの入手
・MySQLのインストール
・MySQLサーバーの起動

## MySQLのデータの入手
まずは、インストールするMySQLのバイナリファイルを入手します。

### １．ダウンロードサイトにアクセス
MySQLの[Downloadページ](https://dev.mysql.com/downloads/mysql/)にアクセスします。

### ２．希望のバージョンを選択
今回はMySQL5.7をダウンロードしたいので「MySQL Community Server 5.7 »」のリンクを選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/ab102252-d395-5499-293c-04862aca2235.png)


### ３．OSとOS Versionを選択
希望するOSとOS Versionを選択します。今回はCentOS7.3にインストールするため、OSを「Red Hat Enterprise Linux/Oracle Linux」、OS Versionsに「Red Hat Enterprise Linux 7/Oracle Linux 7(x84,64-bit)」を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/4d6f8988-0fbf-9768-f3d4-ca07c5b82981.png)

### ４．ファイルのダウンロード
下記画面が表示されたら必要なファイルをダウンロードします。
今回はバイナリインストールを行うので「Compressed TAR Archive」を選択してダウンロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/d7a4532e-bb51-3f88-cbee-ed2321444b12.png)

ボタンを押下時に以下の画面が出た場合は「No thanks, just start my download.」を選択することでOracleIDでログインせずにダウンロードすることが可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/1077a315-9b88-36fc-6f24-a2e6decc2153.png)

### ５．サーバーにアップロードする
ダウンロードしたファイルはSCPなどを使用して、MySQLをインストールしたいサーバー上にアップロードします。今回は/tmp配下に格納しています。

これで前準備は完了です。

## MySQLのインストール
ダウンロードしたMySQLのバイナリファイルのアップロードが完了したら、サーバーでインストールを実行します。ユーザーはrootを使用します。

### １．ユーザーおよびグループの作成
mysqldで使用するユーザーおよびグループを作成します。
ここで作成するユーザー/グループ名は何でも良いですが、今回は一般的なmysqlで作成します。

```
# groupadd mysql
# useradd -g mysql -s /bin/false mysql
```
※ログインする必要はないので-s オプションでホストへのログイン権限を持たないユーザーを作成します。

### ２．バイナリファイルの展開
希望するディレクトリにMySQLのバイナリファイルを展開します。
以下の例は/usr/local配下に展開する場合です。
なお、ダウンロードしたバイナリファイル(tar.gz)は/tmp配下に配置している想定です。

```
# cd /usr/local
# tar zxvf /tmp/mysql-5.7.24-el7-x86_64.tar.gz
```

配布物を解凍するとカレントディレクトリ直下に「mysql-5.7.24-el7-x86_64」フォルダが作成されます。

次に作成したMySQLディレクトリへのシンボリックを作成します。

```
# ln -s /usr/local/mysql-5.7.24-el7-x86_64 mysql
# ls -l mysql
lrwxrwxrwx. 1 root root 35 12月  5 20:49 mysql -> /usr/local/mysql-5.7.24-el7-x86_64/
```

これにより、/usr/local/mysqlとして簡単に参照できるようになります。
併せて、PATH変数に/usr/local/mysql/binディレクトリを追加します。

```
# export PATH=$PATH:/usr/local/mysql/bin
```
恒久的に追加したい場合は`~/.bash_profile`等に追記してください。
以下は記載例です。

```bash:sample

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/local/mysql/bin

export PATH
```

### ３．データディレクトリの初期化
ファイルを展開後、アクセス権の設定とデータディレクトリの初期化を行います。

まず、MySQLのディレクトリに移動します。
(今回は/usr/local/mysqlに移動)

```
# cd /usr/local/mysql
```

ディレクトリを作成し、権限を付与します。

```
# mkdir mysql-files
# chown mysql:mysql mysql-files
# chmod 750 mysql-files
```

データディレクトリの初期化を行います。このとき、ランダム生成された初期パスワードが表示されるので忘れずにメモしてください。
もし、初期パスワードが不要な場合は引数を`--initialize-insecure`とします。

```
# mysqld --initialize --user=mysql
```

データディレクトリを指定する場合は以下のようなオプションが必要になります。
なお、データディレクトリはコマンド実行時に自動作成されます。

```
# mysqld --initialize --user=mysql --datadir=/var/data
```

その他のオプションについては、以下のURLを参照してください。
[【2.10.1.1 Initializing the Data Directory Manually Using mysqld】](https://dev.mysql.com/doc/refman/5.7/en/data-directory-initialization-mysqld.html)



### ４．SSL証明書の作成
セキュアな接続をサポートするためにはSSL証明書を作成します。
以下はデータディレクトリ`/var/data`に作成する場合です。

```
# bin/mysql_ssl_rsa_setup --/var/data
```
データディレクトリにSSL証明書(*.pem)が作成されるので所有者権限を変更します。

```
# cd /var/data
# chown mysql:mysql *.prm
# ll *.pem
-rw------- 1 mysql mysql 1675 12月 11 20:34 ca-key.pem
-rw-r--r-- 1 mysql mysql 1107 12月 11 20:34 ca.pem
-rw-r--r-- 1 mysql mysql 1107 12月 11 20:34 client-cert.pem
-rw------- 1 mysql mysql 1675 12月 11 20:34 client-key.pem
-rw------- 1 mysql mysql 1675 12月 11 20:34 private_key.pem
-rw-r--r-- 1 mysql mysql  451 12月 11 20:34 public_key.pem
```

### ５．設定ファイルの修正
MySQLサーバが起動時に使用するオプションを設定するため、/etc/my.cnfを修正します。以下はサンプルになります。

```my.cnf
[mysqld]
datadir=/var/data
socket=/var/run/mysqld/mysql.sock
user=mysql

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
```
[^1]: CentOS7より/var/run配下のディレクトリはOS再起動時に消える仕様となっています。そのため、/var/run配下のディレクトリが必要場合は、OS起動時にファイルを作成する設定が必要となります。詳細は`man tmpfiles.d`コマンドを参照してください。

socket/pid用のディレクトリが存在しない場合は作成します。
また、/var/run配下にディレクトリを作成する場合は、以下のように設定ファイルを作成する必要があります[^1]。


```
# mkdir /var/run/mysqld
# chown mysql:mysql /var/run/mysqld

## /var/run配下にディレクトリを作成した場合は以下の通り、設定ファイルを作成する。
# echo "d /var/run/mysqld 0755 mysql mysql -" > /etc/tmpfiles.d/mysqld.comf
```

## サーバーの起動
準備が整ったらMySQLサーバーを起動します。
正常に起動すれば以下のように表示されます。

```
# mysqld_safe --user=mysql &
 [1] 9637
# 2018-12-05T12:42:14.098820Z mysqld_safe Logging to '/var/log/mysqld.log'.
  2018-12-05T12:42:14.122454Z mysqld_safe Starting mysqld daemon with databases from /data
```

### ログイン
MySQLサーバーが起動したら、mysqlにクライアントとしてログインしてみます。
ログイン時に聞かれるパスワードはデータディレクトリ初期化時(mysqld --initialize)にランダムで生成されたものになります。データディレクトリ初期化時にパスワードを生成しないオプション(--initialize-insecure)を指定した場合は`mysql -u root --skip-password`としてください。

```
# mysql -u root -p
Enter password: (enter the random root password here)
```
SSLを使用したい場合は`--ssl-mode`を使用してください。
以下はSSLを使用したサーバー認証を行って接続する場合です。

```
# mysql -u root -p --ssl-mode=VERIFY_CA --ssl-ca=/var/data/ca.pem
```

### パスワードの設定
無事mysqlにログインできたら、新しいパスワードを設定します。

```
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
```

### サーバーの停止
サーバーの停止は以下のコマンドで実施します。

```
# mysqladmin shutdown -uroot -p
Enter password: (enter the random root password here)
```

# おわりに
MySQLをバイナリインストールする際の手順を一通りまとめてみました。
誤りや補足がありましたらご指摘をよろしくお願いします。


以上