MySQL 5.7 セットアップ手順と関連情報

## MySQL Community Edition
文字コードなどの初期設定を含む [MySQL Community Edition](https://www.mysql.com/jp/products/community/) の MySQL Community Server 5.7.21 [^relnotes] のセットアップとそれに関わる情報をまとめた。

なお、他の記事と比べて特徴的な情報として以下のような内容を記載している。

- root アカウントは空パスワードでインストールできる。
- `mysql_secure_installation` コマンドは実行しない。
- MySQL クライアントのパスワードは暗号化して保存して省略できる。
- 文字コードは `utf8` ではなく `utfmb4` を指定する。
- 照合順序は `utf8mb4_general` ではなく `utf8mb4_bin` を指定する。
- データベース作成時に文字コードだけを指定すると照合順序のサーバー設定は無視される。

![mysql-logo](https://www.mysql.com/common/logos/logo-mysql-170x115.png)

[^relnotes]: [MySQL :: MySQL 5.7 Release Notes](https://dev.mysql.com/doc/relnotes/mysql/5.7/en/)

## MySQL Yum Repository のインストール
```bash
yum install https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
```
CentOS 7 (RHEL 7) は他の Linux ディストリビューションに倣って MySQL を MariaDB に置き換えた [^mynavi] [^srad] ため、標準リポジトリから MySQL Community Server をインストールすることができない。そのため Yum でインストールするには[公式リポジトリ](https://dev.mysql.com/downloads/repo/yum/)を別途導入する必要がある。 [^mysql-yum-repo-quick-guide]

[^mynavi]: [RHEL7、MySQLからMariaDBへ変更 | マイナビニュース](https://news.mynavi.jp/article/20130617-a126/)
[^srad]: [Red Hat Enterprise Linux 7でもMySQLに代えてMariaDBを採用 | スラド Linux](https://linux.srad.jp/story/13/06/16/0617201/)


上記コマンドを実行すると公式リポジトリの `.repo` ファイルが `mysql57-community-release` パッケージとしてインストールされる。

[^mysql-yum-repo-quick-guide]: [MySQL :: A Quick Guide to Using the MySQL Yum Repository](https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/)

## MySQL Community Server のインストール
```bash
yum install mysql-community-server
```
`mysql-community-server` パッケージをインストールする。`mysql-server` でもエイリアスが設定されている。

依存関係で `mysql-community-libs` `mysql-community-libs-compat` `mysql-community-client` `mysql-community-common` がインストールされる。

また、標準でインストールされている `mariadb-libs` パッケージが `mysql-community-libs` パッケージに置き換えられる。
`mariadb-libs` パッケージに含まれるファイルはパッケージごと削除されるので事前にパッケージを削除する必要はない。


## 文字コード
### デフォルトの文字コードと照合順序の設定
```ini:/etc/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin
```

#### character-set-server
`character-set-server` のデフォルト値は `latin1` [^character-set-server] のため UTF-8 に変更する。
MySQL の `utf8` は `utf8mb3` を参照していて絵文字などの4バイト文字を扱えない [^utf8-support] ので `utf8mb4` を指定する。 [^utf8utf8mb4] [^charset-unicode-utf8mb4]

[^character-set-server]: [MySQL :: MySQL 5.7 Reference Manual :: 5.1.4 Server Command Options :: --character-set-server](https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_character-set-server)

[^utf8-support]: [「歴史的な理由から、MySQLではutf8文字セットはutf8mb4ではなくutf8mb3を参照しています。」寿司=ビール問題 : MySQL 8.0でのUTF8サポート入門 (MySQL Server Blogより) | Yakst](https://yakst.com/ja/posts/4405)

[^charset-unicode-utf8mb4]: [MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.10.7 utf8mb4 文字セット (4 バイトの UTF-8 Unicode エンコーディング)](https://dev.mysql.com/doc/refman/5.6/ja/charset-unicode-utf8mb4.html)

#### collation-server
`collation-server` のデフォルト値は `latin1_swedish_ci ` [^collation-server] のため UTF-8 に変更する。
`utf8mb4` のデフォルトの照合順序は `utf8mb4_general_ci` になるが、寿司ビール問題 [^sushi-beer] などが生じるので `utf8mb4_bin` を指定する。

[^collation-server]: [MySQL :: MySQL 5.7 Reference Manual :: 5.1.4 Server Command Options :: --collation-server](https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_collation-server)

[^sushi-beer]: [MySQL と寿司ビール問題 - かみぽわーる](http://blog.kamipo.net/entry/2015/03/23/093052)

ただし、データベース作成時に `CHARACTER SET` だけを指定して `COLLATE` を指定しない場合、`CHARACTER SET` で指定された文字コードのデフォルト照合順序が利用される [^charset-database] ため、`collation-server` で `utf8mb4_bin` を指定していても `utf8mb4_general_ci` が設定される [^charset-charsets] ので注意。未指定か両方指定するかのいずれかの必要がある。

[^charset-database]: [MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.3.2 データベース文字セットおよび照合順序](https://dev.mysql.com/doc/refman/5.6/ja/charset-database.html)

[^charset-charsets]: [MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.14 MySQL でサポートされる文字セットと照合順序](https://dev.mysql.com/doc/refman/5.6/ja/charset-charsets.html)

##### 照合順序で生じる主な問題

| 問題 | 内容 | 例 |
|---|---|---|
| 大文字小文字問題   | ローマ字の大文字と小文字の区別 | 「A」と「a」 |
| 全角半角問題      | 全角と半角の区別 | 「ハハ」と「ﾊﾊ」 |
| ひらがなカタカナ問題 | ひらがなとカタカナの区別 | 「はは」と「ハハ」 |
| 寿司ビール問題     | 絵文字などの4バイト文字の区別 | 「:sushi:」と「:beer:」 |
| ハハパパ問題      | 清音と濁音と半濁音の区別 | 「ハハ」と「パパ」と「ババ」 |
| 病院美容院問題    | 直音と拗促音の区別 | 「びょういん」と「びよういん」 |

[日々の覚書: MySQL Bug #79977 "utf8mb4_unicode_520_ci don't make sense for Japanese FTS" で言いたいこと](https://yoku0825.blogspot.jp/2016/01/mysql-bug-79977-utf8mb4unicode520ci.html)

[^utf8utf8mb4]: [MySQL で utf8 と utf8mb4 の混在で起きること - @tmtms のメモ](https://tmtms.hatenablog.com/entry/2016/09/06/mysql-utf8)

##### 照合順序の違い
| 照合順序 (Collation)      | A ≠ a | :sushi: ≠ :beer: | ハ ≠ パ | は ≠ ハ | よ≠ょ | 全角 ≠ 半角 | UCA |
|:-------------------------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| `utf8mb4_general_ci`     | × | × | ○ | ○ | ○ | ○ |  |
| `utf8mb4_unicode_ci`     | × | × | × | × | × | × | 4.0.0 |
| `utf8mb4_unicode_520_ci` | × | ○ | × | × | × | × | 5.2.0 |
| `utf8mb4_bin`            | ○ | ○ | ○ | ○ | ○ | ○ |  |
| (`utf8mb4_ja_0900_as_cs`) |   |   |   |   |   |   | 9.0.0 |

`utf8mb4_ja_0900_as_cs` は MySQL 8.0.1 から導入された。

[[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合](https://www.slideshare.net/rkajiyama/db-tech-showcase-2017-tokyo-d31-mysql-80)

[MySQLの文字コードとCollation - Qiita](https://qiita.com/tfunato/items/e48ad0a37b8244a788f6)

[mysqlのcollateを使って大文字-小文字や全角-半角を無視した検索 - end0tknrのkipple - web写経開発](http://d.hatena.ne.jp/end0tknr/20100613/1276427626)

[MySQL 5.5 の unicode collation で同一視される文字 - @tmtms のメモ](https://tmtms.hatenablog.com/entry/20110416/mysql_unicode_collation)

[MySQL 5.5.11 unicode_ci で同一視される文字](http://tmtm.org/tmp/mysql_unicode_collation.html)

#### 文字コード設定の確認方法
```sql
SHOW GLOBAL VARIABLES LIKE 'character_set\_%';
```
`GLOBAL` を省略するとデフォルト値の `LOCAL` として指定される。
`character-set-server` に `utf8mb4` が設定されていると、 `character_set_filesystem` は `binary` に、 `character_set_system` は `utf8` になり、それ以外は `utf8mb4` となる。

#### 各データベースの文字コードの確認方法
```sql
SELECT * FROM information_schema.SCHEMATA;
```

### MySQL 5.7.6 以前で必要な設定
```ini:/etc/my.cnf
[mysqld]
innodb_large_prefix = ON           # 5.7.6以前
innodb_file_format = Barracuda     # 5.7.6以前
innodb_file_format_max = Barracuda # 5.7.8以前
```

#### innodb_large_prefix
MySQL 5.7.6 以前は `innodb_large_prefix` のデフォルト値は `OFF` のため `ON` を指定する必要があった。またテーブル作成時に `ROW_FORMAT=DYNAMIC` を指定する必要があった。
MySQL 5.7.7 以降はデフォルト値が `ON` に変更されたので設定は不要。
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix
[MySQL(InnoDB) で charset を utf8mb4 にする注意点の現在](https://dev.to/seizans/mysqlinnodb--charset--utf8mb4--1451)

#### innodb_file_format
MySQL 5.7.6 以前は `innodb_file_format` のデフォルト値は古い `Antelope` のため `Barracuda` を指定する必要があった。
MySQL 5.7.7 以降はデフォルト値が `Barracuda` に変更されたので設定は不要。
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_file_format

#### innodb_file_format_max
MySQL 5.7.8 以前は `innodb_file_format_max` のデフォルト値は古い `Antelope` のため `Barracuda` を指定する必要があった。
MySQL 5.7.9 以降はデフォルト値が `Barracuda` に変更されたので設定は不要。
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_file_format_max

## ログ
### スロークエリーログの設定
```ini:/etc/my.cnf
[mysqld]
log_output = TABLE,FILE
slow_query_log = ON
long_query_time = 1
min_examined_row_limit = 3
log_queries_not_using_indexes = ON
log_slow_admin_statements = ON
```
```bash
ln -s /var/lib/mysql/localhost-slow.log /var/log/mysqld-slow.log
```
または

```bash
touch /var/log/mysqld-slow.log
chown mysql. /var/log/mysqld-slow.log
chcon -t mysqld_log_t /var/log/mysqld-slow.log # または restorecon /var/log/mysqld-slow.log
```

https://qiita.com/ArimaRyunosuke/items/9a5f5c91179670fc3346

#### log_output
ログエントリーの出力先を指定する。値には `TABLE` `FILE` `NONE` のいずれか1つ以上がカンマ区切りで指定できる。デフォルト値は `FILE` になる。[^log_output]
`TABLE` を指定した場合、出力先となるテーブル名は `mysql.general_log` および `mysql.slow_log` となり、 CSV ストレージエンジンを使用する。[^log-destinations]
パスは `/var/lib/mysql/mysql/slow_log.CSV` で直接参照できる。

[^log_output]: [MySQL :: MySQL 5.7 Reference Manual :: 5.1.5 Server System Variables :: log_output](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_log_output)

[^log-destinations]: ["By default, the log tables use the CSV storage engine that writes data in comma-separated values format." - MySQL :: MySQL 5.7 Reference Manual :: 5.4.1 Selecting General Query and Slow Query Log Output Destinations](https://dev.mysql.com/doc/refman/5.7/en/log-destinations.html)

#### slow_query_log
スロークエリーログが有効かどうかの指定。デフォルト値は `OFF` のため `1` か `ON` を指定する必要がある。[^slow_query_log]

[^slow_query_log]: [MySQL :: MySQL 5.7 Reference Manual :: 5.1.5 Server System Variables :: slow_query_log](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_slow_query_log)

#### slow_query_log_file
スロークエリーログが出力されるログファイルの名前。デフォルト値は <b>*host_name*</b>-slow.log になる。[^slow_query_log_file]
絶対パス名が指定されていない場合はデータディレクトリにファイルが作成される。[^slow-query-log]
実際のデフォルト値を参照すると `/var/lib/mysql/localhost-slow.log` となっている。

##### host_name
```sql
SELECT HOST FROM information_schema.PROCESSLIST;
```
```bash
mysqladmin processlist | awk 'NR==4 {print $6}'
```
<b>*host_name*</b> は `PROCESSLIST` で確認できる。

[^slow_query_log_file]: [MySQL :: MySQL 5.7 Reference Manual :: 5.1.5 Server System Variables :: slow_query_log_file](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_slow_query_log_file)

[^slow-query-log]: ["The server creates the file in the data directory unless an absolute path name is given to specify a different directory." - MySQL :: MySQL 5.7 Reference Manual :: 5.4.5 The Slow Query Log ](https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html)

#### long_query_time
スロークエリと見なされる閾値。この設定値よりクエリに時間がかかる場合にサーバーは `Slow_queries` ステータス変数をインクリメントする。デフォルト値は `10` のため短くする必要がある。[^long_query_time]
マイクロ秒の精度まで指定できる。実際のデフォルト値を参照すると `10.000000` となっている。

[^long_query_time]: [MySQL :: MySQL 5.7 Reference Manual :: 5.1.5 Server System Variables :: long_query_time](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_long_query_time)

#### min_examined_row_limit
この数より少ない行を調べるクエリはスロークエリーログに記録されない。デフォルト値は `0` になる。[^min_examined_row_limit]

[^min_examined_row_limit]: [MySQL :: MySQL 5.7 Reference Manual :: 5.1.5 Server System Variables :: min_examined_row_limit](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_min_examined_row_limit)

#### log_queries_not_using_indexes
[^log_queries_not_using_indexes]

[^log_queries_not_using_indexes]: [MySQL :: MySQL 5.7 Reference Manual :: 5.1.5 Server System Variables :: log_queries_not_using_indexes](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_log_queries_not_using_indexes)

#### log_slow_admin_statements
[^log_slow_admin_statements]

[^log_slow_admin_statements]: [MySQL :: MySQL 5.7 Reference Manual :: 5.1.5 Server System Variables :: log_slow_admin_statements](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_log_slow_admin_statements)


## データディレクトリの手動初期化
```bash
mysqld --initialize-insecure --user=mysql
```
サービスの初回起動時にデータディレクトリの初期化は自動で実行されるが、root アカウントにランダムパスワードが設定されてしまう。
root アカウントに空パスワードを指定したい場合は、初回サービス起動前に `mysqld` コマンドに `--initialize-insecure` オプションを指定して実行することで対応できる。[^data-directory-initialization-mysqld]
`--initialize-insecure` オプションは MySQL 5.7.6 から使用できる。[^initialize-insecure]
[^initialize-insecure]: [MySQL :: MySQL 5.7 Reference Manual :: 5.1.4 Server Command Options :: --initialize-insecure](https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_initialize-insecure)
[^data-directory-initialization-mysqld]: ["With the --initialize-insecure option, no root password is generated; it is assumed that you will assign a password to the account in timely fashion before putting the server into production use." - MySQL :: MySQL 5.7 Reference Manual :: 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)


## サービスの起動と自動起動設定
```bash
systemctl start mysqld
systemctl enable mysqld
```
サービスの初回起動時にデータディレクトリの初期化が自動で実行される。
https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/#repo-qg-starting-server


## タイムゾーン
### タイムゾーンの確認
```sql
SELECT @@system_time_zone, @@global.time_zone, @@session.time_zone;
```
サーバー起動時にホストマシンのタイムゾーンで `system_time_zone` システム変数で設定しようとし、その後この値は変更しない。[^time-zone-support]
通常、タイムゾーンは `TZ` 環境変数で指定される。[^system_time_zone]

`time_zone` 変数は接続する各クライアントのタイムゾーンを初期化するために使用される。デフォルト値は `SYSTEM` で `system_time_zone` の値を使用することを意味する。 [^time_zone]

[^system_time_zone]: [MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.4 サーバーシステム変数 :: system_time_zone](https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_system_time_zone)

[^time_zone]: [MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.4 サーバーシステム変数 :: time_zone](https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_time_zone)

[^time-zone-support]: [「サーバーは、起動するときに、ホストマシンのタイムゾーンを特定し、これを使用して system_time_zone システム変数で設定しようとします。その後、この値は変更しません。」 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.6 MySQL Server でのタイムゾーンのサポート](https://dev.mysql.com/doc/refman/5.6/ja/time-zone-support.html)

### タイムゾーンテーブルのロード
```sql
SELECT COUNT(1) FROM mysql.time_zone;
```
```bash
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql
```
デフォルトでは `mysql.time_zone` テーブルは空でタイムゾーンがロードされておらず、`CONVERT_TZ()` 関数などが機能しない。

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.4.6 mysql_tzinfo_to_sql — タイムゾーンテーブルのロード](https://dev.mysql.com/doc/refman/5.6/ja/mysql-tzinfo-to-sql.html)
[MySQLのタイムゾーン - @tmtms のメモ](https://tmtms.hatenablog.com/entry/2015/08/22/mysql-timezone)

## パスワード
### 初期パスワード
```bash
grep 'temporary password' /var/log/mysqld.log | awk '{print $11}'
```
`mysqld --initialize-insecure` でデータディレクトリの初期化を行わなかった場合、 root パスワードが自動で生成され、エラーログに記録される。 [^password]

[^password]: [MySQL :: Getting Started with MySQL](https://dev.mysql.com/doc/mysql-getting-started/en/#mysql-getting-started-connecting)

### パスワードに関する変遷
- MySQL 5.7.4 から `default_password_lifetime` が新設され、デフォルト値が `360` になった。 [^news-5-7-4_default_password_lifetime]
- MySQL 5.7.4 から root@localhost に自動生成されたパスワードが割り当てられるようになった。 [^news-5-7-4]
- MySQL 5.7.6 から自動生成されたパスワードの出力先が `~/.mysql_secret` からエラーログ (`/var/log/mysqld.log`) に変更された。 [^news-5-7-6]
- MySQL 5.7.11 から `default_password_lifetime` のデフォルト値が `0` に変更された。 [^news-5-7-11] [^default_password_lifetime]

[^default_password_lifetime]: [MySQL :: MySQL 5.7 Reference Manual :: 5.1.5 Server System Variables :: default_password_lifetime](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_default_password_lifetime)

[^news-5-7-4_default_password_lifetime]: ["MySQL now enables database administrators to establish a policy for automatic password expiration:" - MySQL :: MySQL 5.7 Release Notes :: Changes in MySQL 5.7.4 (2014-03-31, Milestone 14) :: Security Notes](https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-4.html#mysqld-5-7-4-security)

[^news-5-7-4]: ["The installation process creates only a single root account, 'root'@'localhost', automatically generates a random password for this account, and marks the password expired." - MySQL :: MySQL 5.7 Release Notes :: Changes in MySQL 5.7.4 (2014-03-31, Milestone 14) :: Security Notes](https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-4.html#mysqld-5-7-4-security)

[^news-5-7-6]: https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-6.html#mysqld-5-7-6-installation

[^news-5-7-11]: ["The default value of the default_password_lifetime system variable that controls the global password expiration policy has been changed from 360 (360 days) to 0 (no password expiration)." - MySQL :: MySQL 5.7 Release Notes :: Changes in MySQL 5.7.11 (2016-02-05, General Availability) :: Security Notes](https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-11.html#mysqld-5-7-11-security)


### validate_password プラグイン
```sql
SELECT * FROM information_schema.PLUGINS WHERE PLUGIN_NAME LIKE 'validate%';
```
```sql
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
```
```sql
SHOW GLOBAL VARIABLES LIKE 'validate_password_%';
```
MySQL 5.7.8 から validate_password プラグインがデフォルトで有効になった [^news-5-7-8] が、`mysqld --initialize-insecure` でデータディレクトリの初期化を行うと有効化されないので注意。

[^news-5-7-8]: ["The validate_password plugin was not installed by RPM packages for platforms using systemd or SysV-style initialization scripts. (Bug #18438833)" - MySQL :: MySQL 5.7 Release Notes :: Changes in MySQL 5.7.8 (2015-08-03, Release Candidate) :: Bugs Fixed](https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-8.html#mysqld-5-7-8-bug)

#### validate_password
#### validate_password_policy
#### validate_password_length

### root パスワードの変更
#### mysqladmin での変更
```bash
mysqladmin --user=root password 'P@ssw0rd'
```
https://dev.mysql.com/doc/refman/5.7/en/mysqladmin.html#command_mysqladmin_password

#### SQL 文での変更
```sql:MySQL5.7.6以降
ALTER USER 'root'@'localhost' IDENTIFIED BY 'P@ssw0rd';
```
```sql:MySQL5.7.5以前
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('P@ssw0rd');
```
[MySQL :: MySQL 5.7 Reference Manual :: B.5.3.2 How to Reset the Root Password :: B.5.3.2.2 Resetting the Root Password: Unix and Unix-Like Systems](https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html#resetting-permissions-unix)

### mysql_config_editor
```bash
mysql_config_editor set --host=localhost --user=root --password
```
`mysql_config_editor` コマンドは MySQL 5.6.6 以降で利用可能。 [^mysql_config_editor_56_ja]

`.mylogin.cnf` ファイルに暗号化されたパスワードを保存して `mysql` や `mysqladmin` などの MySQL クライアントのパスワード入力を省略することができる。

他の MySQL クライアントと異なり `--password` のあとにパスワード値を指定できない。 [^mysql_config_editor_56_ja_password]

[^mysql_config_editor_56_ja]: [MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.6.6 mysql_config_editor — MySQL 構成ユーティリティー](https://dev.mysql.com/doc/refman/5.6/ja/mysql-config-editor.html)

[^mysql_config_editor_56_ja_password]: [MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.6.6 mysql_config_editor — MySQL 構成ユーティリティー :: --password](https://dev.mysql.com/doc/refman/5.6/ja/mysql-config-editor.html#option_mysql_config_editor_password)


## mysql_secure_installation
```bash
mysql_secure_installation --use-default --password=P@ssw0rd
```
`mysql_secure_installation` コマンドは以下の機能を有している [^mysql_secure_installation] が、このプログラムの機能はすでに Yum リポジトリのインストールによって実行されているので MySQL 5.7 のインストール後には実行するなとリファレンスに記載 [^repo-securing-mysql-installation] されており、もはや root アカウントのパスワード変更以外に意味はない。

- root アカウントのパスワード設定
- ローカルホストの外部からアクセス可能な root アカウントの削除
- 匿名ユーザーアカウントの削除
- `test` データベース（デフォルトでは匿名ユーザーを含むすべてのユーザーがアクセス可能）、および `test_` で始まるデータベースに誰でもアクセスできる権限の削除

なお、 `--password` オプションは 5.7.2 以降、 `--user-default` オプションは 5.7.4 以降に実装されている。 [^mysql_secure_installation_Options]

[^mysql_secure_installation]: [MySQL :: MySQL 5.7 Reference Manual :: 4.4.4 mysql_secure_installation — Improve MySQL Installation Security](https://dev.mysql.com/doc/refman/5.7/en/mysql-secure-installation.html)

[^repo-securing-mysql-installation]: ["Do not run mysql_secure_installation after an installation of MySQL 5.7, as the function of the program has already been performed by the Yum repository installation." - MySQL :: A Quick Guide to Using the MySQL Yum Repository :: Securing the MySQL Installation (for MySQL 5.6 only)](https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/#repo-securing-mysql-installation)

[^mysql_secure_installation_Options]: [MySQL :: MySQL 5.7 Reference Manual :: 4.4.4 mysql_secure_installation — Improve MySQL Installation Security :: Table 4.7 mysql_secure_installation Options](https://dev.mysql.com/doc/refman/5.7/en/mysql-secure-installation.html#idm140528176086480)


## MySQL クライアントの設定
```ini:~/.my.cnf
[mysql]
default-character-set = utf8mb4
pager = less -SFXin
```
オプションファイル `~/.my.cnf` に MySQL クライアントのオプションをユーザー固有に設定できる。

### オプションファイル

#### Unix および Unix ライクなシステムで読み込まれるオプションファイル [^option-files]
| ファイル名               | 説明 |
|-----------------------|---|
| `/etc/my.cnf`         | 全体オプション |
| `/etc/mysql/my.cnf`   | 全体オプション |
| `SYSCONFDIR/my.cnf`   | 全体オプション |
| `$MYSQL_HOME/my.cnf`  | サーバー固有オプション (サーバーのみ) |
| `defaults-extra-file` | `--defaults-extra-file` で指定されたファイル (存在する場合) |
| `~/.my.cnf`           | ユーザー固有オプション |
| `~/.mylogin.cnf`      | ユーザー固有ログインパスオプション (クライアントのみ) |

[^option-files]: [MySQL :: MySQL 5.7 Reference Manual :: 4.2.6 Using Option Files](https://dev.mysql.com/doc/refman/5.7/en/option-files.html#option-files-unix)

### オプショングループ
[第33回　MySQLのオプションファイル my.cnfの豆知識［その2］：MySQL道普請便り｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0033#sec1_h1)

| プログラム | オプショングループ |
|:--|:--|
| mysqlcheck | [mysqlcheck], [client] |
| mysqlpump | [mysql_dump], [client] |
| mysql | [mysql], [client] |
| mysql_secure_installation | [mysql_secure_installation], [mysql], [client] |
| mysqladmin | [mysqladmin], [client] |
| mysqlbinlog | [mysqlbinlog], [client] |
| mysqldump | [mysqldump], [client] |
| mysqlimport | [mysqlimport], [client] |
| mysqlshow | [mysqlshow], [client] |
| mysqlslap | [mysqlslap], [client] |
| mysqltest | [mysqltest], [client] |

### default-character-set
https://dev.mysql.com/doc/refman/5.7/en/charset-configuration.html
https://dev.mysql.com/doc/refman/5.7/en/mysql-command-options.html#option_mysql_default-character-set

### pager
https://dev.mysql.com/doc/refman/5.7/en/mysql-command-options.html#option_mysql_pager

#### less
| オプション | 説明 |
|:-:|---|
| `-S` |   |
| `-F` |   |
| `-X` |   |
| `-i` |   |
| `-n` |   |
http://man7.org/linux/man-pages/man1/less.1.html
https://qiita.com/nao58/items/f651d9f2d0f420f87a50


## DB および DB ユーザーの作成
### DB ユーザーの作成
```sql
CREATE USER 'dbuser'@'localhost' IDENTIFIED BY 'P@ssw0rd';
```
### DB の作成
```sql
CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
```
```bash
mysqladmin create dbname
```
### DB への権限の割り当て
```sql
GRANT ALL PRIVILEGES ON dbname.* TO 'dbuser'@'localhost';
```


## ユーティリティ
### MySQLTuner
```bash
curl -L http://mysqltuner.pl -o /usr/local/bin/mysqltuner
chmod +x /usr/local/bin/mysqltuner
```

### MySQL Utilities
```bash
yum install mysql-utilities
```

### Percona Toolkit
```bash
yum install https://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-4.noarch.rpm
yum install percona-toolkit
```
https://www.percona.com/downloads/percona-toolkit/LATEST/

### innotop
```bash
yum install epel-release
yum install innotop
```


## 一括コマンド群まとめ
```bash
yum --assumeyes install https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm && \
yum --assumeyes install mysql-community-server && \
echo -e '\ncharacter-set-server=utf8mb4' >> /etc/my.cnf && \
echo -e 'collation-server=utf8mb4_bin' >> /etc/my.cnf && \
echo -e '\nslow_query_log=ON' >> /etc/my.cnf && \
echo -e 'log_output=TABLE,FILE' >> /etc/my.cnf && \
echo -e 'min_examined_row_limit=3' >> /etc/my.cnf && \
echo -e 'long_query_time=1' >> /etc/my.cnf && \
echo -e 'log_queries_not_using_indexes=ON' >> /etc/my.cnf && \
ln -s /var/lib/mysql/localhost-slow.log /var/log/mysqld-slow.log && \
echo -e '[mysql]' >> ~/.my.cnf && \
echo -e 'default-character-set=utf8mb4' >> ~/.my.cnf && \
echo -e 'pager=less -SFXin' >> ~/.my.cnf && \
mysqld --initialize-insecure --user=mysql && \
systemctl start mysqld && systemctl enable $_ && \
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql && \
mysqladmin create wordpress && \
mysql --execute="CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'P@ssw0rd';" && \
mysql --execute="GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost';" && \
mysql --execute="ALTER USER 'root'@'localhost' IDENTIFIED BY 'P@ssw0rd';" && \
rm --force ~/.mysql_history && \
history -c
```
```
curl -L http://mysqltuner.pl -o /usr/local/bin/mysqltuner && chmod +x $_ && \
yum --assumeyes install mysql-utilities && \
yum --assumeyes install https://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-4.noarch.rpm && yum --assumeyes install percona-toolkit && \
yum --assumeyes install epel-release && yum --assumeyes install innotop
```