Debian 8 (jessie) でミニマムな MySQL 5.7 開発用DB構築

# 方針

- ミニマムインストールの Debian 8.11 (2020年5月現在) を利用
- 必要十分・必要最小限
-  MySQL Community のDEBパッケージを入れて apt で構築
- LAN内想定でFWも使用しない (ミニマムだと入らないはず…)

# OSインストール要件
- インストールウィザードにしたがった最小限の設定
    - ネットワーク
    - ユーザ・サーバ名
- パーティション分割やLVMは利用しない
- OpenSSH server はインストールしておく
- その他追加パッケージのインストールはなし

# なぜjessieを使うのか

本稿執筆時点より約2ヶ月後に、Debian 8 は**2020年6月30日をもってサポートが終了します。**

そんな中で、jessieをチョイスしたのは確実に MySQL 5.7 を入れたかったことだけが理由です。
**最新のOSにするとCommunityのリポジトリ的に 8.0 しか選べなかったり**したので…

あくまでLAN内想定なので、セキュリティ面のことはあまり考えないことに。。
手数を減らすため、開発で使いたいバージョンのみに絞って判断します。

# OS基本設定と最新化

初期インストールが完了したら、対象サーバへSSHして構築していきます。

- dbusのインストール  
Debianの最小構成では入らず、 timedatectl に必要です。

```
# apt install dbus
```

- タイムゾーンの設定 (OSインストールオプションで Asia/Tokyo にしなかった場合)

```
# date        // 時刻確認
# timedatectl set-timezone Asia/Tokyo        // 日本を指定 (必要なら)
```

- 現状のパッケージの最新化

```
# apt upgrade
```

# MySQL 5.7 のインストール

以下のように、標準だと 5.5 が入ってしまいます。

```
# apt search mysql-server
```

出力例…

```
ソート中... 完了
全文検索... 完了
auth2db/oldoldstable 0.2.5-2+dfsg-5 all
  Powerful and eye-candy IDS logger, log viewer and alert generator

mysql-server/oldoldstable 5.5.62-0+deb8u1 all
  MySQL データベースサーバ (最新版に依存するメタパッケージ)

mysql-server-5.5/oldoldstable 5.5.62-0+deb8u1 amd64
  MySQL データベースサーババイナリおよびシステムデータベースの設定

mysql-server-core-5.5/oldoldstable 5.5.62-0+deb8u1 amd64
  MySQL データベースサーババイナリ
```

https://dev.mysql.com/downloads/repo/apt/

MySQL Community の DEB Package を先にインストールします。
(2020年5月現在の最新公開パッケージは、 `mysql-apt-config_0.8.15-1_all.deb` です。)

```
# apt install software-properties-common    // リポジトリ追加のために必要
# cd /usr/local/src        // DEBパッケージはここに配置
# wget https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb --no-check-certificate
        // 私の環境では証明書が信用できない…と出たのでオプション追加
# dpkg -i mysql-apt-config_0.8.15-1_all.deb
```

インストールすると、コンソール内に以下のような設定画面が出てきます。
まず、 [MySQL Server & Cluster] を選択し、 [Enter] を押します。
<img width="707" alt="devdb_mysql57_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631706/98c120d5-d99c-21aa-72f2-4b04c49b28d7.png">

次の画面では、 [mysql-5.7] を選択し [Enter]。
<img width="709" alt="devdb_mysql57_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631706/6cef93e2-7199-c494-6e02-24ac69f6cb07.png">

最初の画面に戻ったら、 [OK] を選択し [Enter] を押すと画面から抜けます。

<img width="708" alt="devdb_mysql57_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631706/19c72cdc-196d-9326-d86c-4237ed1b0174.png">


```
# apt update        // 設定したリポジトリ情報の適用
```

以下のように、再度確認すると私の環境では `5.7.30` が入るように変更されています。

```
# apt search mysql-server
```

出力例…

```
ソート中... 完了
全文検索... 完了
auth2db/oldoldstable 0.2.5-2+dfsg-5 all
  Powerful and eye-candy IDS logger, log viewer and alert generator

mysql-server/不明 5.7.30-1debian8 amd64
  MySQL Server meta package depending on latest version

mysql-server-5.5/oldoldstable 5.5.62-0+deb8u1 amd64
  MySQL データベースサーババイナリおよびシステムデータベースの設定

mysql-server-core-5.5/oldoldstable 5.5.62-0+deb8u1 amd64
  MySQL データベースサーババイナリ
```

実際にインストールを実施します。

```
# apt install mysql-server
```

出力例…

```
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libaio1 libmecab2 libsasl2-2 libsasl2-modules libsasl2-modules-db mysql-client mysql-common
  mysql-community-client mysql-community-server psmisc
提案パッケージ:
  libsasl2-modules-otp libsasl2-modules-ldap libsasl2-modules-sql libsasl2-modules-gssapi-mit
  libsasl2-modules-gssapi-heimdal
以下のパッケージが新たにインストールされます:
  libaio1 libmecab2 libsasl2-2 libsasl2-modules libsasl2-modules-db mysql-client mysql-common
  mysql-community-client mysql-community-server mysql-server psmisc
アップグレード: 0 個、新規インストール: 11 個、削除: 0 個、保留: 0 個。
44.1 MB のアーカイブを取得する必要があります。
この操作後に追加で 291 MB のディスク容量が消費されます。
続行しますか? [Y/n] Y                // 「Y」 を入力して続行
```

途中、MySQLのrootユーザのパスワードを求められるので入力します。
(パスワードの確認入力と合わせ、同様の画面が2回出現。) 
<img width="707" alt="devdb_mysql57_4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631706/0672768a-eacb-109a-59c7-67d4d4df7bca.png">

インストールが完了したら、パッケージの状況を確認します。

```
# dpkg -l | grep mysql
ii  mysql-apt-config               0.8.15-1                 all          Auto configuration for MySQL APT Repo.
ii  mysql-client                   5.7.30-1debian8          amd64        MySQL Client meta package depending on latest version
ii  mysql-common                   5.7.30-1debian8          amd64        MySQL Common
ii  mysql-community-client         5.7.30-1debian8          amd64        MySQL Client
ii  mysql-community-server         5.7.30-1debian8          amd64        MySQL Server
ii  mysql-server                   5.7.30-1debian8          amd64        MySQL Server meta package depending on latest version
```

# MySQL 5.7 の初期設定と my.cnf の設定

すでにプロセスは起動していますしこのままでも使えますが、運用・セキュリティのために以下の初期化コマンドを実行します。

```
# mysql_secure_installation
```

入出力例…

```

Securing the MySQL server deployment.

Enter password for user root:    // インストール時設定したrootパスワード入力

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: Y    // パスワードチェックのプラグインを入れる

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0    // プラグインのパスワード強度設定

Change the password for root ? ((Press y|Y for Yes, any other key for No) : N
    // パスワードポリシーに合わないパスワードの場合は変更 (ここでは変更していない)

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y    // anonymousユーザ削除
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y    // リモートrootログインを許可しない
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y    // testデータベース削除
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y    // FLUSH PRIVILEGES の実行
Success.

All done!
```

開発DBなので細かい設定をする必要はないですが、文字コードがずれていると開発に支障を来すので確認します。

```
# mysql -u root -p -e 'SHOW GLOBAL VARIABLES LIKE "%char%";'
Enter password:
+--------------------------------------+----------------------------+
| Variable_name                        | Value                      |
+--------------------------------------+----------------------------+
| character_set_client                 | latin1                     |
| character_set_connection             | latin1                     |
| character_set_database               | latin1                     |
| character_set_filesystem             | binary                     |
| character_set_results                | latin1                     |
| character_set_server                 | latin1                     |
| character_set_system                 | utf8                       |
| character_sets_dir                   | /usr/share/mysql/charsets/ |
| validate_password_special_char_count | 1                          |
+--------------------------------------+----------------------------+
```

latin1 はデフォルトなので、予想通りです…
`UTF-8` へ変更します。

また、**デフォルトではlocalhost以外から接続できないネットワーク設定**が入っています。これも併せて無効化しておきます。
さらに、私の環境ではパスワードポリシーが保存されていなかったようなのでこれも直しています。

Debianのメインコンフィグの場所は以下になるようです。
(→ /etc/mysql/my.cnf でここが示されている)

```
メインコンフィグのパス :
/etc/mysql/mysql.conf.d/mysqld.cnf
```

以下のように追記/変更します。

```/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
# By default we only accept connections from localhost
# bind-address    = 127.0.0.1        // 【コメントアウトする】
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

## /* ↓↓追記↓↓ */
validate_password_policy=LOW
character-set-server=utf8

[client]
default-character-set=utf8
```

編集できたら、MySQLサーバを再起動します。

```
# systemctl status mysql.service        // プロセス状態確認
# systemctl restart mysql.service       // 再起動
```

文字コードの設定を再確認しましょう。

```
# mysql -u root -p -e 'SHOW GLOBAL VARIABLES LIKE "%char%";'
Enter password:
+--------------------------------------+----------------------------+
| Variable_name                        | Value                      |
+--------------------------------------+----------------------------+
| character_set_client                 | utf8                       |
| character_set_connection             | utf8                       |
| character_set_database               | utf8                       |
| character_set_filesystem             | binary                     |
| character_set_results                | utf8                       |
| character_set_server                 | utf8                       |
| character_set_system                 | utf8                       |
| character_sets_dir                   | /usr/share/mysql/charsets/ |
| validate_password_special_char_count | 1                          |
+--------------------------------------+----------------------------+
```

これで使いはじめることができます。

Fin ❤︎