MySQLの設定周りを整理

# はじめに
MySQLの設定周りについて整理してみました。

# MySQLの設定について
## 変数
MySQLには、システム変数とステータス変数の2種類があります。

### システム変数
操作を構成する多くのシステム変数を保持しています。
各システム変数にはデフォルト値があり、コマンド行のオプションを使用するか、オプションファイルでサーバー起動時に設定できます。
SETステートメントを使っても変更でき、サーバーを停止・再起動が不要です。

また、システム変数にはグローバル変数とセッション変数の2種類があります。
変数によっては、グローバルとセッションで両方を持つことができるものもあります。

#### グローバル変数
グローバル変数はサーバー全体の操作に影響します。 
グローバル変数にはデフォルト値があり、すべてのグローバル変数はサーバーの起動時にデフォルト値に初期化されます。

#### セッション変数
セッション変数は、個々のクライアント接続の操作に影響します。
クライアントとの接続時に、対応するグローバル変数の現在の値で初期化されます。

#### 使用できるオプション・システム変数を一覧
```shell
$ mysqld --verbose --help
```

#### 使用されているシステム変数を一覧
```shell
mysql> SHOW VARIABLES;
```

### ステータス変数
操作に関する情報となる多くのステータス変数を保持しています。
統計情報など、サーバの状況を示す変数。

#### サーバーステータス変数を一覧
```shell
mysql> SHOW STATUS;
```

## オプションファイル
MySQLでは、設定ファイルをオプションファイルと呼びます。

### オプションファイルの種類

#### /etc/my.cnf
グローバルオプションファイル

#### /etc/mysql/my.cnf
グローバルオプションファイル

#### SYSCONFDIR/my.cnf
グローバルオプションファイル
「SYSCONFDIR」はコンパイル時にcmakeのオプションの「-DSYSCONFDIR」で指定します。
デフォルトではetc。

#### $MYSQL_HOME/my.cnf
サーバ専用のオプションファイル

$MYSQL_HOMEは、ユーザが指定する環境変数です。
$MYSQL_HOMEを設定していない場合、mysqld_safeでMySQLを起動していればインストールディレクトリを設定します。

#### defaults-extra-file
--defaults-extra-fileで指定して使用するオプションファイル。
グローバルオプションファイルの後に読み取ります。
※Unixの場合はユーザーオプションファイルの前、すべてのプラットフォームの場合はログインパスファイルの前に読み取ります

#### ~/my.cnf
ユーザー固有のオプションファイル

#### ~/.mylogin.cnf
認証情報を保存するファイル。
設定するとログインパスを指定するだけでMySQLにログインできるようになります。

暗号化されたファイルでmysql_config_editorユーティリティを使用して作成します。

#### DATADIR/mysqld-auto.cnf
SET PERSIST、またはSE PERSIST_ONLYで永続化されたシステム変数を設定するJSON形式のファイル。
そのため、手動で修正しない。

##### 使用例
```shell
mysql> SET PERSIST max_connections=200;
```

### オプションファイルの書き方
設定対象のプログラムを示すグループごとにオプションを列挙していく。
手動で設定しない.mylogin.cnf、mysqld-auto.cnfは対象外

#### オプションを指定する構文
オプションを指定する構文は、コマンドで指定する際と同様ですが、
先頭の2つのダッシュを省略し、1行で1つのオプションのみを指定します。

例えば

```shell
$ mysql --quick --host=localhost
```

とあれば、

```shell
quick
host=localhost
```

となります。

また、--loose-**opt-name**といったプリフィクス形式の場合も

```shell
loose-opt-name
```

となります
##### スペース
= 文字の周囲にスペースを置くことができます。これはコマンド行ではできません。 オプションで、値を一重引用符または二重引用符で囲むことができます。

#### グループ
```shell
[group]
```

上記のように括弧で囲んで記述します。
groupにはオプションを設定するプログラム、またはグループ名を指定します。


#### コメント
オプションファイルのコメントは「#」「;」で記載します。
「#」であれば、行の途中からでも指定できます。

```shell
; コメント1
# コメント2
host=localhost # コメント3
```

#### インクルード
以下のように別のオプションファイルを指定することで対象のファイルをインクルードすることが出来ます。

```shell
!include /home/mydir/myopt.cnf
```

また、指定したディレクトリからオプションファイルを読み取るようにすることも出来ます。

```shell
!includedir /home/mydir
```

## 良く使うオプション

### datadir
MySQLがデータを格納するディレクトリ

### tmpdir
テンポラリファイルやテンポラリテーブルを作成するためのディレクトリ

### port
MySQLが使用するポート番号

### socket
MySQLが使用するUNIXドメインソケット

### max_connections
最大接続数
### max_allowed_packet
クライアントとの通信できるパケットの最大サイズ。
BLOBやTEXTのサイズやSQL文の最大長に合わせる。

### character_set_server
サーバが利用するデフォルトの文字コード

### lower_case_table_names
テーブル名がケース・センシティブか決めるオプション
※ケース・センシティブ：大文字・小文字の区別をすること

## 注意
### リソースの競合
MySQLサーバは、1つのホストで複数のインスタンスを実行できます。
そのため、オプションによってはリソースが競合しないようにする必要があります。
・datadir
・socket
・port
など。

※各インスタンスは、それぞれでシステムリソース（CPU、メモリ、ディスク）を消費するため、
　リソースの割り当て過ぎにも注意。

# 参考文献
https://dev.mysql.com/doc/refman/8.0/ja/option-files.html

https://dev.mysql.com/doc/refman/8.0/ja/server-system-variable-reference.html

https://dev.mysql.com/doc/refman/8.0/ja/server-status-variable-reference.html

https://dev.mysql.com/doc/refman/8.0/ja/using-system-variables.html

https://dev.mysql.com/doc/refman/8.0/ja/show-status.html

https://docs.oracle.com/cd/E17952_01/mysql-8.0-ja/option-file-options.html