MySQLの公式サンプルデータを利用して10分でSQL練習環境を作る on Docker

## 概要

SQLの勉強やバックエンドの勉強、試作など、何かとDBが欲しくなるタイミングはあるが、DBをローカル環境に構築するのは手間がかかるし雑にやるとローカルが汚染されていく…
データ作成にしても１テーブルに数件登録するくらいなら問題ないが、ちゃんと関係性をもった複数のテーブルを定義したり、それぞれにデータを投入しようと思うとやはりツライ…

そこで、MySQLの公式イメージ＋公式サンプルデータを利用することで、ローカルを汚さずMySQLを構築したうえでちゃんとしたデータが登録された状態を10分程度で手軽に構築することができる。
サンプルデータは複数種類あるが、今回は従業員や部門など6テーブル400万レコードが登録された[employeeデータセット](https://dev.mysql.com/doc/employee/en/)を使用する。

### 動作環境

Windows10 Enterprise(20H2)
Docker 20.10.5
docker-compose 1.28.5


## MySQLコンテナの作成と起動

適当な作業ディレクトリで以下のように`docker-compose.yml`ファイルを作成する。

```yaml
version: '3'
services:
  mysql:
      image: mysql:5.7
      container_name: mysql
      environment: 
          MYSQL_ROOT_PASSWORD: root
          MYSQL_USER: dbuser
          MYSQL_PASSWORD: dbpass
          TZ: 'Asia/Tokyo'
      command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
      volumes:
          - ./mysql/volume:/var/lib/mysql
          - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      ports:
          - 13306:3306
```

作成したファイルがあるディレクトリで`docker-compose`コマンドを実行してMySQLコンテナを起動。

```bash
$ docker-compose up -d
```

以下のようにMySQLコンテナが起動していればOK。

```bash
$ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED              STATUS              PORTS                                NAMES
7d6a384a122b   mysql:5.7   "docker-entrypoint.s…"   About a minute ago   Up About a minute   33060/tcp, 0.0.0.0:13306->3306/tcp   mysql

```

## MySQL公式サンプルデータの投入

[MySQL :: Other MySQL Documentation](https://dev.mysql.com/doc/index-other.html) のExample Databasesから任意のデータセットをダウンロードする。今回はemployeeデータセットを使うため、上記サイトの内のGitHubへのリンクから最新のリリース(`test_db.1.0.7`)をダウンロード。

ダウンロードした圧縮ファイルをMySQLコンテナにコピーする。

```bash
$ docker cp test_db-1.0.7.tar.gz mysql_docker:./
```

ファイルをコンテナ内にコピーしたらターミナルでコンテナに接続してファイルを解凍する。
以降のコマンドはMySQLコンテナ内で実行する。

```bash
# MySQLコンテナに接続してbashを起動
$ docker exec -it mysql /bin/bash
# コンテナ内でファイルを解凍　※以降のコマンドはコンテナ内で実行
$ tar -zxvf test_db-1.0.7.tar.gz
```

解凍して生まれたフォルダに移動してファイルをMySQLに流し込む。

```bash
$ cd test_db
$ mysql -u root -p < employee.sql
```

エラーなく終了したらDBに接続して確認する。

```bash
$ mysql -u root -p
```

DB一覧を表示。employeesデータベースが存在すれば登録成功している。

```sql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| employees          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
```

動作確認としてemployeesデータベースから適当に検索してみる。

```sql
mysql> use employees;

mysql> show tables;
+----------------------+
| Tables_in_employees  |
+----------------------+
| current_dept_emp     |
| departments          |
| dept_emp             |
| dept_emp_latest_date |
| dept_manager         |
| employees            |
| salaries             |
| titles               |
+----------------------+

mysql> select * from departments;
+---------+--------------------+
| dept_no | dept_name          |
+---------+--------------------+
| d009    | Customer Service   |
| d005    | Development        |
| d002    | Finance            |
| d003    | Human Resources    |
| d001    | Marketing          |
| d004    | Production         |
| d006    | Quality Management |
| d008    | Research           |
| d007    | Sales              |
+---------+--------------------+
```
---

以上。
あとはお好みのクライアントツールからMySQLコンテナ(ここまでの例だと`localhost:13306`)に接続してSQLの練習台とするなりバックエンドのDBとするなり活用してみてください。


## 参考

- [MySQL :: Other MySQL Documentation](https://dev.mysql.com/doc/index-other.html)
- [SQL文学習~環境構築編~ Docker\+MySQL \- Qiita](https://qiita.com/tatema/items/1511c2143a97b86c854d)  
- [DockerでLaravel+MySQL+phpMyadminの環境構築 \- Qiita](https://qiita.com/tatema/items/9a541553058fdd7fd6a7)