MySQL 8をWindows 10に導入する手順

当記事では、MySQL Community Edtion v8.0.21をWindows 10 Home 64bit版に導入手順をまとめています。





## 1. 概要

導入手順は大きく3つあるようです。1つ目はインストーラーを利用する方法、2つ目は.zipファイルに圧縮されたバイナリを自分で解凍・配置する方法、3つ目はVisual Studioを利用してソースコードからビルドする方法です。

> For instructions on installing MySQL on Microsoft Windows, using either the MySQL Installer or Zipped binary, see [Section 2.3, “Installing MySQL on Microsoft Windows”](https://dev.mysql.com/doc/refman/8.0/en/windows-installation.html).
>
> For details and instructions on building MySQL from source code using Microsoft Visual Studio, see [Section 2.9, “Installing MySQL from Source”](https://dev.mysql.com/doc/refman/8.0/en/source-installation.html).
>
> [MySQL :: MySQL 8.0 Reference Manual :: 2 Installing and Upgrading MySQL](https://dev.mysql.com/doc/refman/8.0/en/installing.html)

当記事では上記2番目の方法を使って、MySQL環境を整備してみます。





## 2. バイナリを入手

公式サイトの以下ページよりバイナリを入手します。

[MySQL :: Download MySQL Community Server (Archived Versions)](https://downloads.mysql.com/archives/community/)

2種類ありますが、とりあえず容量の小さいほうを選んでおきます。





## 3. バイナリを配置

落としてきた.zipファイルを解凍し、中に入っていたディレクトリを適当な場所――例えば、Cドライブの直下に配置します。ディレクトリ名は好きなものを使ってください。

```
■ C:\
└ ■ MySQL v8.0.21
```





## 4. 初期化

MySQLは、SQLiteなどのライブラリ型のDBMSとは異なり、プログラム側から利用するにはサーバーとして予め起動しておく必要があるアプリ型のDBMSです。ただ、配置直後はサーバーを起動することはできません。起動させても以下のようにエラーが発生し、すぐ停止してしまいます。

```
PS C:\MySQL v8.0.21> .\bin\mysqld.exe --console
2021-01-01T01:27:46.883348Z 0 [System] [MY-010116] [Server] C:\MySQL v8.0.21\bin\mysqld.exe (mysqld 8.0.21) starting as process 8148
2021-01-01T01:27:46.885885Z 0 [Warning] [MY-010091] [Server] Can't create test file C:\MySQL v8.0.21\data\mysqld_tmp_file_case_insensitive_test.lower-test
2021-01-01T01:27:46.885966Z 0 [Warning] [MY-010091] [Server] Can't create test file C:\MySQL v8.0.21\data\mysqld_tmp_file_case_insensitive_test.lower-test
2021-01-01T01:27:46.886154Z 0 [ERROR] [MY-013276] [Server] Failed to set datadir to 'C:\MySQL v8.0.21\data\' (OS errno: 2 - No such file or directory)
2021-01-01T01:27:46.886616Z 0 [ERROR] [MY-010119] [Server] Aborting
2021-01-01T01:27:46.886790Z 0 [System] [MY-010910] [Server] C:\MySQL v8.0.21\bin\mysqld.exe: Shutdown complete (mysqld 8.0.21)  MySQL Community Server - GPL.
```

サーバー起動に先んじて、初期化を行う必要があります。初期化するには.\bin\mysqld.exeに--initializeオプションを付けて呼び出します。なお、このときに--consoleオプションも併せて付けおくことを推奨します。このオプションを付けると処理内容がコンソールに表示されるようになるのです。実行した結果は以下の通りです。

```
PS C:\MySQL v8.0.21> .\bin\mysqld.exe --initialize --console
2020-12-30T11:32:52.187597Z 0 [System] [MY-013169] [Server] C:\MySQL v8.0.21\bin\mysqld.exe (mysqld 8.0.21) initializing of server in progress as process 10484
2020-12-30T11:32:52.194782Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-12-30T11:32:53.920517Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2020-12-30T11:32:55.561144Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: >k)e/yj?*0SQ
```

これで初期化が完了されました。初期化が完了すると、MySQLディレクトリ直下にdataというディレクトリが配置され、そのなかに色々なファイルが生成されていることが分かります。

ちなみに、dataディレクトリの中にファイルが存在する状態――初期化が済んでいる状態で初期化しようとすると以下のようにエラーになります。

```
PS C:\MySQL v8.0.21> .\bin\mysqld.exe --initialize --console
2020-12-30T10:52:36.074067Z 0 [System] [MY-013169] [Server] C:\MySQL v8.0.21\bin\mysqld.exe (mysqld 8.0.21) initializing of server in progress as process 10040
2020-12-30T10:52:36.076321Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
2020-12-30T10:52:36.076333Z 0 [ERROR] [MY-013236] [Server] The designated data directory C:\MySQL v8.0.21\data\ is unusable. You can remove all files that the server added to it.
2020-12-30T10:52:36.076934Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-12-30T10:52:36.077180Z 0 [System] [MY-010910] [Server] C:\MySQL v8.0.21\bin\mysqld.exe: Shutdown complete (mysqld 8.0.21)  MySQL Community Server - GPL.
```

何らかの理由から、再び初期化を行いたい場合はdataディレクトリのなかのファイルを削除する必要があります。あるいはdataディレクトリごと消してしまいましょう。





## 5. サーバー起動

初期化ができましたらサーバーを立ち上げます。サーバーを立ち上げるには.\bin\mysqld.exeを呼び出します。このときも--consoleオプションは付けておいたほうが良いでしょう。

```
PS C:\MySQL v8.0.21> .\bin\mysqld.exe --console
2020-12-30T12:56:12.441078Z 0 [System] [MY-010116] [Server] C:\MySQL v8.0.21\bin\mysqld.exe (mysqld 8.0.21) starting as process 2004
2020-12-30T12:56:12.456022Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-12-30T12:56:13.160181Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2020-12-30T12:56:13.319054Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060
2020-12-30T12:56:13.470037Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2020-12-30T12:56:13.470380Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2020-12-30T12:56:13.505751Z 0 [System] [MY-010931] [Server] C:\MySQL v8.0.21\bin\mysqld.exe: ready for connections. Version: '8.0.21'  socket: ''  port: 3306  MySQL Community Server - GPL.
```

1つだけ警告が出ていますが、とりあえず無視して大丈夫（なはず）です。





## 6. 初期アカウントでログイン

サーバーが起動しましたので、初期アカウントを使ってサーバーにログインします。サーバー処理を走らせているコンソールは開いたままにしておいてください。コンソールを閉じたり、CtrlキーとCキーの同時押しで処理を止めたりするとサーバーが落ちます。

サーバーを走らせているのとは別にコンソールを開き、.\bin\mysql.exeを介してサーバーに接続します。接続するためのコマンドは以下の通りです。

```
PS C:\MySQL v8.0.21> .\bin\mysql.exe --user=root --password=初期パスワード
```

ユーザー名にはrootという最初から用意されている特殊なユーザー名を使用します。初期パスワードとは、初期化時に無作為に生成される特殊なパスワードです。もう一度初期化時の処理内容を見てみましょう。

```
PS C:\MySQL v8.0.21> .\bin\mysqld.exe --initialize --console
2020-12-30T11:32:52.187597Z 0 [System] [MY-013169] [Server] C:\MySQL v8.0.21\bin\mysqld.exe (mysqld 8.0.21) initializing of server in progress as process 10484
2020-12-30T11:32:52.194782Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-12-30T11:32:53.920517Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2020-12-30T11:32:55.561144Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: >k)e/yj?*0SQ
```

4番目のメッセージの末尾に`>k)e/yj?*0SQ`という意味不明な文字列が表示されているのが分かります。これが初期パスワードです。これを使って、ログインしましょう。

```
PS C:\MySQL v8.0.21> .\bin\mysql.exe --user=root --password=>k)e/yj?*0SQ
```

なお、使用するシェルによっては、初期パスワードに含まれる文字が特殊な記号と勘違いされる場合があります。そのときはシングルクォートかダブルクォートで囲むことで回避できます。

```
PS C:\MySQL v8.0.21> .\bin\mysql.exe --user=root --password='>k)e/yj?*0SQ'
```

```
PS C:\MySQL v8.0.21> .\bin\mysql.exe --user=root --password=">k)e/yj?*0SQ"
```

ログインできると以下のような状態になります。

```
PS C:\MySQL v8.0.21> .\bin\mysql.exe --user=root --password='>k)e/yj?*0SQ'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.21 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>
```

また、警告が出ていますが、とりあえず無視します。

メッセージの末尾に`mysql>`というプロンプトが表示されているのが分かります。これが正常にログインできた証拠になります。





## 7. パスワードの変更

初期アカウントでログインできましたらパスワードを変更しておきましょう。パスワードを変更するにはSET PASSWORD文かALTER USER文を使用します。

```
mysql> SET PASSWORD = '新しいパスワード';
```

```
mysql> ALTER USER root@localhost IDENTIFIED BY '新しいパスワード';
```

ALTER USER文のほうには、ユーザー名の後ろ`@localhost`という単語が付いています。これはホスト名というもので、とりあえず必要なものなので付けておきます。





## 8. 動作確認

試しに、いくつか適当なクエリを実行させてみます。

```
mysql> CREATE DATABASE test_db;
Query OK, 1 row affected (0.01 sec)

mysql> CREATE TABLE test_db.test_table (
    ->   id INT PRIMARY KEY,
    ->   name VARCHAR(128)
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT test_db.test_table (
    ->   id,
    ->   name
    -> ) VALUES (
    ->   1,
    ->   'Qii太郎'
    -> );
Query OK, 1 row affected (0.01 sec)

mysql> SELECT
    ->   id,
    ->   name
    -> FROM
    ->   test_db.test_table
    -> ;
+----+---------+
| id | name    |
+----+---------+
|  1 | Qii太郎 |
+----+---------+
1 row in set (0.00 sec)

mysql> quit
Bye
PS C:\MySQL v8.0.21>
```

問題なさそうです。