Windows10にzipでMySQLをインストールする方法


- 環境
    - Windows 10 Pro 64bit バージョン1909
    - GitBash(mintty 3.1.0)

インストーラを使うとなぜかうまくいかないことがあるのでzipでインストールする。
[インストーラーを使う方法はこちら](https://qiita.com/ponsuke0531/items/176a158ea4db3714adda)

# zipをダウンロードして配置する
1. [MySQL :: Download MySQL Community Server](https://dev.mysql.com/downloads/mysql/) からzipファイルをダウンロードする。
    - 今回は、mysql-8.0.19-winx64.zipをダウンロード
1. 任意の場所に解凍する
    - 今回は、`/c/apps/mysql-8.0.19-winx64/`に配置

## PATHを設定する

```bash
# 1. MySQLのバージョンを確認して場所を確認する
$ /c/apps/mysql-8.0.19-winx64/bin/mysql --version
C:\apps\mysql-8.0.19-winx64\bin\mysql.exe  Ver 8.0.19 for Win64 on x86_64 (MySQL Community Server - GPL)

# 2. PATHの設定を追記する
$ vi ~/.bash_profile
$ cat ~/.bash_profile
...省略...
export MYSQL_HOME="/c/apps/mysql-8.0.19-winx64"
export PATH=$PATH:$MYSQL_HOME/bin
...省略...

# 3. 設定を反映する
$ source ~/.bash_profile

# 4. PATHが設定されたことを再度バージョンで確認する
$ mysql --version
C:\apps\mysql-8.0.19-winx64\bin\mysql.exe  Ver 8.0.19 for Win64 on x86_64 (MySQL Community Server - GPL)
```

## 設定ファイルを作成する
文字コードやポートなどの必要な設定を`my.ini`を作成して設定する


```bash:my.iniファイルを新規作成して設定を書く
$ vi $MYSQL_HOME/my.ini

$ cat $MYSQL_HOME/my.ini
[mysqld]
character-set-server=utf8mb4
collation_server=utf8mb4_general_ci
init-connect='SET NAMES utf8mb4'
skip-character-set-client-handshake
port=3306
character-set-server=utf8mb4
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[mysqldump]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

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

# MySQLのインストールとサービスへの登録を行う

1. GitBashを**管理者権限**で起動する
    - コマンドプロンプトでも同じように操作できる
1. データフォルダの初期化を行う
    - `--defaults-file`オプションを使用することで設定ファイルの場所を指定できる
        - `mysqld --verbose --help | grep defaults-file`でオプション内容を確認できる
    - 参考
        - [MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.2.6 オプションファイルの使用](https://dev.mysql.com/doc/refman/5.6/ja/option-files.html)
        - [MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.3 サーバーコマンドオプション](https://dev.mysql.com/doc/refman/5.6/ja/server-options.html)
1. dataフォルダが作成されたことを確認する
1. dataフォルダ直下にある`{PC名}.err`を開きMySQLへの初回ログインパスワードを確認する
    - パスワードには`/`や`)`が入っていることがあるので漏らさないように注意する
1. MySQLのインストールとサービスへの登録を行う
1. サービスとして登録されたことを確認する
    - [サービス]ダイアログでも確認できる(ダイアログは、`Win + R` > `services.msc`で表示できる)

```bash
# 2. データフォルダの初期化を行う
$ mysqld --defaults-file=$MYSQL_HOME/my.ini --initialize

# 3. dataフォルダが作成されたことを確認する
$ ls -la $MYSQL_HOME/data/
total 168016
drwxr-xr-x 1 ponsuke 1049089        0  4月 22 13:07 '#innodb_temp'/
drwxr-xr-x 1 ponsuke 1049089        0  4月 22 13:23  ./
drwxr-xr-x 1 ponsuke 1049089        0  4月 22 13:44  ../
-rw-r--r-- 1 ponsuke 1049089       56  4月 22 13:03  auto.cnf
...省略...

# 4. dataフォルダ直下にある{PC名}.errを開きMySQLへの初回ログインパスワードを確認する
$ cat $MYSQL_HOME/data/PCNAME.err | grep password
2020-04-22T04:03:02.864343Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: uU1/ryauqrf6

# 5. MySQLのインストールとサービスへの登録を行う
$ mysqld --install MySQL80 --defaults-file=$MYSQL_HOME/my.ini
Service successfully installed.

# 6. サービスとして登録されたことを確認する
$ sc query MySQL80

SERVICE_NAME: MySQL80
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 1077  (0x435)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

```

# MySQLにログインする

1. MySQLを起動する
    - [サービス]ダイアログでも起動できる(ダイアログは、`Win + R` > `services.msc`で表示できる)
1. MySQLにログインする
    - GitBahsで`mysql`コマンドのログインを行うときは`winpty`をつけて使う
        - 参考 : [MySQLの覚書 | MySQLのコマンド](http://amaraimusi.sakura.ne.jp/note_prg/mysql/cmd_note.html)
        - [ログインする時でもリダイレクトと合わせて使うときは注意する](https://qiita.com/ponsuke0531/items/060c6a013f43286de3c0)
    - `{PC名}.err` で確認したパスワードを使ってログインする

```bash
# 1. MySQLを起動する
$ sc start MySQL80

SERVICE_NAME: MySQL80
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x1
        WAIT_HINT          : 0x1f40
        PID                : 14596
        FLAGS              :

# 2. MySQLにログインする
$ winpty mysql -u root -p -P 3306
Enter password: ************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.19

Copyright (c) 2000, 2020, 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>
```

## rootパスワード変更と文字セットの確認を行う
1. rootのパスワード変更を行う
    - 参考 : [新しいパスワードを設定する(SET PASSWORD 文、ALTER USER文) | MySQLの使い方](https://www.dbonline.jp/mysql/user/index2.html)
1. my.iniに設定した文字セットが設定されていることを確認する
    - 参考 : [MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.7.5.40 SHOW VARIABLES 構文](https://dev.mysql.com/doc/refman/5.6/ja/show-variables.html)

```sql
-- 1. rootのパスワード変更を行う
mysql> set password='root';
Query OK, 0 rows affected (0.01 sec)

-- 2. my.iniに設定した文字セットが設定されていることを確認する
mysql> show variables like '%char%';
+--------------------------+---------------------------------------------+
| Variable_name            | Value                                       |
+--------------------------+---------------------------------------------+
| character_set_client     | utf8mb4                                     |
| character_set_connection | utf8mb4                                     |
| character_set_database   | utf8mb4                                     |
| character_set_filesystem | binary                                      |
| character_set_results    | utf8mb4                                     |
| character_set_server     | utf8mb4                                     |
| character_set_system     | utf8                                        |
| character_sets_dir       | C:\apps\mysql-8.0.19-winx64\share\charsets\ |
+--------------------------+---------------------------------------------+
8 rows in set, 1 warning (0.01 sec)
```

## データベースを作成する
1. データベースを作成する
1. データベースの文字セットを確認する
    - [MySQL :: MySQL 8.0 Reference Manual :: 25.30 The INFORMATION_SCHEMA SCHEMATA Table](https://dev.mysql.com/doc/refman/8.0/en/schemata-table.html)
1. データベース用のユーザーを作成する
1. 作成したユーザーに権限を付与する
    - [MySQL :: MySQL 8.0 Reference Manual :: 6.2.2 Privileges Provided by MySQL](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html)
1. 作成したユーザーを確認する

```sql
-- 1. データベースを作成する
mysql> create database sampledb;
Query OK, 1 row affected (0.01 sec)

-- 2. データベースの文字セットを確認する
mysql> select default_character_set_name, default_collation_name from information_schema.schemata where schema_name = 'sampledb';
+----------------------------+------------------------+
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------------------+------------------------+
| utf8mb4                    | utf8mb4_general_ci     |
+----------------------------+------------------------+
1 row in set (0.01 sec)

-- 3. データベース用のユーザーを作成する
mysql> create user 'sampleuser'@'localhost' identified by 'sampleuser';
Query OK, 0 rows affected (0.01 sec)

-- 4. 作成したユーザーに権限を付与する
mysql> grant all privileges on sampledb.* to 'sampleuser'@'localhost';
Query OK, 0 rows affected (0.01 sec)

-- 5. 作成したユーザーを確認する
mysql> select user, host, plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| sampleuser       | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

-- 6. ログアウトする
mysql> quit
Bye

-- 7. 作成したユーザーでログインできることを確認する
$ winpty mysql -u sampleuser -p -P 3306
Enter password: *********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.19 MySQL Community Server - GPL

Copyright (c) 2000, 2020, 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>
```