【mysql】mysql バックアップ リストア（5.7→8 照合順対応）

# バックアップ
```
mysqldump -u [ユーザ名] -p[パスワード] --routines --events [DB名] > [バックアップファイル名]
# ex)
mysqldump -u root -p --routines --events hoge > ./hoge.sql
```
MySQL v5.5からはデフォでストアドとイベントが出力されない。
|オプション|説明|
|:--|:--|
-p[パスワード]|パスワード省略時は、後で入力要求される。
--routines|ストアドを出力。（ストアドをバックアップしない場合は不要）
--events|イベントを出力。（イベントをバックアップしない場合は不要）
# リストア準備
リストア先のDBの作成
```
mysql -u [ユーザ名] -p -e "CREATE DATABASE [新しいDB名]";
# ex)
mysql -u root -p -e "CREATE DATABASE newhoge";
```
## 8系からデフォルトcollationが変わっている問題
8系からはデフォルトの照合順が **utf8mb4_0900_ai_ci** になっている。
**utf8mb4_general_ci** で運用している MySQL 5.7 からバックアップしたものを
8系の環境にリストアするには、DBのデフォルトの文字コードの照合順を
バックアップしたものに合わせる必要がある。

```
mysql -u [ユーザ名] -p -e "CREATE DATABASE [DB名] COLLATE utf8mb4_general_ci;"
# ex)
mysql -u root -p -e "CREATE DATABASE newhoge COLLATE utf8mb4_general_ci;"
```
できたDBを use して、以下のコマンドで確認ができる。
```
mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4                  | utf8mb4_general_ci   |
+--------------------------+----------------------+
1 row in set (0.00 sec)
```
# リストア
```
mysql -u [ユーザ名] -p[パスワード] [リストア先DB名] < [バックアップファイル名]
# ex)
mysql -u root -p newhoge < ./hoge.sql
```

# Node から MySQL8.0へ接続しようとするとエラー
Node.jsでMySQL 8.0へ接続しようとする時に、エラーが発生する。
```
ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
```
## 原因
MySQL8からパスワードの認証形式が変更されている。
しかしながら Nodeの mysql にはまだ実装されていないので接続エラーになる。
## 解決方法（認証方法を変更する。）
認証方法を「mysql_native_password」に変更する。
```
ALTER USER 'ユーザ名'@'ホスト名' IDENTIFIED WITH mysql_native_password BY 'パスワード'
# ex)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
```
# パスワードが現在のポリシー要件を満たしていません
パスワードがポリシーに合っていないとエラーになる場合がある。
```
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
```
ポリシーの確認
```
mysql> SHOW VARIABLES LIKE 'validate_password.%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.01 sec)
```
名前|変数名|現在の設定
:--|:--|:--
パスワード長 |length|8文字以上
大文字小文字|mixed_case_count|1文字以上
数字|number_count|1文字以上
ポリシー|policy|MEDIUM
記号|special_char_count|1文字以上

ポリシー値|制約
:--|:--
LOW|長さのみ
MEDIUM|長さ、数字、大文字小文字、記号
STRONG|長さ、数字、大文字小文字、記号、ディレクトリ、ファイル

## ポリシーの変更
```
mysql> set global validate_password.policy = "LOW";
Query OK, 0 rows affected (0.00 sec)
```
## 制約文字数の変更
```
mysql> set global validate_password.special_char_count = 0;
Query OK, 0 rows affected (0.01 sec)
```
## 注意事項
オンラインで値を変更してもDBサーバが再起動するとデフォルトに戻ってしまう。
必要であれば my.cnf を修正して設定を変更しておく。
```
$ vi my.conf

# 下記の設定を追加・修正する

validate_password.policy=LOW
validate_password.length=4
validate_password.check_user_name=OFF
```