MySQL8.0のZIP版をWindows10にインストールする

## インストーラー版を使わない理由

必要に応じてバージョンの切り替えが必要になるものは、インストーラーを使うと、別のバージョンを使いたい時にどうしたらいいのかが分からなくなることや、使わない時も自動起動されてしまいます。

自分が使う時に目的とするバージョンを立ち上げればいいので、ZIPファイルを展開してMySQL8.0 を使える状態にします。

## やること

1. ZIPアーカイブ版のダウンロードと展開
2. my.cnf を作成
3. MySQLの初期化
4. rootパスワードの変更
5. タイムゾーンの設定
6. databaseと専用ユーザを作成

## TL;DR
- `mysqld --initialize` で生成されるrootパスワードは mysqld.err にある。
- タイムゾーンは`+9:00` でもok。
- `grant all privileges`は使えないから、`create user`と`grant`を使う。

## 設定手順

### 1. ZIPアーカイブ版のダウンロードと展開

[MySQLのダウンロードページ](https://dev.mysql.com/downloads/mysql/) の *Other Downloads* にある *Windows (x86, 64-bit), ZIP Archive* をダウンロードします。

![MySQL80-zip-download.png](https://qiita-image-store.s3.amazonaws.com/0/145742/80573946-99a2-c138-2632-ec6231aebddb.png)

今回は、mysql-8.0.15-winx64.zip をダウンロードしました。ダウンロードした mysql-8.0.15-winx64.zip を任意のディレクトリへ展開します。今回は `d:\my-work\mysql-8.0.15-winx64` に展開しました。

### 2. my.cnf を作成

展開したディレクトリ直下に my.cnf を作成します。フルパスで表記すると `d:\my-work\mysql-8.0.15-winx64\my.cnf` になります。

多くの設定項目があるのですが、必要なだけを設定します。

```my.cnf
[mysqld]
default-time-zone='+9:00'

default_authentication_plugin=mysql_native_password

character-set-server = utf8mb4
collation-server = utf8mb4_ja_0900_as_cs
init-connect = SET NAMES utf8mb4

# dirs
basedir=d:/my-work/mysql-8.0.15-winx64
datadir=d:/my-work/mysql-8.0.15-winx64/data
tmpdir =d:/my-work/mysql-8.0.15-winx64/temp
pid-file=d:/my-work/mysql-8.0.15-winx64/mysqld.pid
```


### 3. MySQLの初期化

`my.cnf` の `datadir` と `tempdir` で指定したディレクトリを作成した後に　`bin\mysqld --initialize` を実行します。

```
cmd> cd /d d:\my-work\mysql-8.0.15-winx64
cmd> mkdir data
cmd> mkdir temp
cmd> bin\mysqld --initialize
```

バージョンが5.7の頃よりは時間が長く感じ(個人差があります)、dataディレクトリ配下にモリモリとファイルが作成されていきます。

プロンプトが返ってきたら、MySQLのサーバを起動します。

```
cmd> bin\mysqld  --standalone  --console 
```

### 4. rootパスワードの変更

#### bin\mysqld --initialize で生成されたパスワードを確認

DBの初期化時に `--initialize-insecure` オプションを使わずに、`--initialize` オプションを使ったので、rootユーザにはランダムなパスワードが設定されています。そのままでは使い難いので、別のパスワードを設定します。

ランダムなパスワードは data\mysqld.err に出力されています。

```
2019-02-11T00:16:51.201908Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: [ここがパスワード]
```

#### rootのパスワードを変更

新しいコマンドプロンプトを立ち上げて `alter user`でパスワードを変更します。

```
cmd> cd /d d:\my-work\mysql-8.0.15-winx64
cmd> bin\mysql -u root -p -h localhost
Enter password: [data/mysqld.errに記録されているパスワードを入力]
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.15

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> alter user root@'localhost' identified by '[新しパスワード]';
```

### 5. タイムゾーンの設定

my.cnfにタイムゾーンを指定するときに `default-time-zone='Asia/Tokyo'` と記載する記事を見かけます。Windows版のZIP版では `mysql.time_XXXX` テーブルが空です。
公式ドキュメントの[MySQL Server Time Zone Support](https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html)に従ってタイムゾーンのデータを投入します。

https://dev.mysql.com/downloads/timezones.html から *timezone_2018i_posix_sql.zip*  をダウンロードして、任意のディレクトリに展開します。展開すると、`timezone_posix.sql` があります。

![MySQL8-timezone-download.png](https://qiita-image-store.s3.amazonaws.com/0/145742/da149559-5ed2-6f7c-88c5-ea25f5112843.png)

rootユーザでMySQLに接続して、 `mysql`データベースを選択して、 `timezone_posix.sql` に記載されたスクリプトを実行します。

```
cmd> bin\mysql -u root -p -h localhost 
mysql> use mysql
mysql> \. path/to/timezone_posix.sql
```

スクリプトの実行が終了したら、 my.cnfのtimezoneを `Asia/Tokyo` に変更します。その後、MySQLを再起動してください。

```my.cnf
default-time-zone='Asia/Tokyo'
```

タイムゾーンは日本だけで使っているのであれば`+9:00` でもいいと思うけど、一時期にサマータイムが騒がれた時に `+9:00` に固定すると夏時間に対応できないのと、unix系のプラットフォームとそろえるために、`Asia/Tokyo` にしました。


### 6.databaseと専用ユーザを作成

`create database`は今まで通りです。 MySQL5.xまでは `grant` で権限付与とパスワード設定を行えましたが、MySQL8からロールができたことで、ユーザ作成と権限付与を別々に行います。
詳しくは *mysql8 grant all privileges* でググってください。

```
cmd> bin\mysql -u root -p -h localhost 
mysql> create database my_db;
mysql> create user 'my_db_user'@'localhost' identified by 'secret'; 
mysql> grant all privileges on my_db.* to 'my_db_user'@'localhost';
```

## バッチファイル

インストーラーを使わないのでバッチファイルを作っておきます。

### MySQLを起動する

```mysql_start.bat
d:\my-work\mysql-8.0.15-winx64\bin\mysqld  --standalone  --console 
```

エクスプローラーか `mysql_start.bat`をダブルクリックして、MySQLを起動します。起動した後はコマンドのウィンドウが残り続けます。終了するときは、コマンドのウィンドウで `ctrl+c`を入力してください。



### MySQLにパスを通して、コマンドプロンプトからMyQLのコマンドを利用できる

```mysql_cmd.bat
set PATH=d:\my-work\mysql-8.0.15-winx64\bin;%PATH%
start
```

MySQLにパスが通った状態でコマンドプロンプトが起動するので、MySQLの任意のコマンドを実行できます。

### 

### 

## メモ: --initialize-insecure を使わなかった理由
`--initialize-insecure` を使わなかったのは、rootユーザのパスワードを空にすると、そのまま使い続けてしまうので、それはよくないなか～と思ったのと、パスワードを設定するためには、`--skip-grant-tables` を指定して再起動する必要があります。

それなら、`--initialize` を使うのがよいかなと思いました。