Mysqlのデータベース作成・ユーザー作成・ユーザー権限付与の方法

# はじめに
今回は、データベース作成・ユーザー作成・ユーザー権限付与の方法について記載します。
今まで、SQLは書いたことがありましたが最初に行うデータベース作成・ユーザー作成・ユーザー権限付与に関してはあまり行ったことがなかったので記事にしました。

参考になれば幸いです。
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [環境構築(docker)](#環境構築(docker))
1. [データベース作成方法](#データベース作成方法)
1. [ユーザー作成方法](#ユーザー作成方法)
1. [ユーザー権限付与](#ユーザー権限付与)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 環境構築(docker)
今回は、下記のリポジトリを利用して環境を構築させていただきます。
https://github.com/tadatakuho/mysql-docker

1.git cloneにより、必要なファイル一覧(docker-compose.yml等)を取得します
```bash
git clone git@github.com:tadatakuho/mysql-docker.git
```
```yaml:docker-compose.yml
version: "3"

services:
  mysql:
    image: mysql:latest
    container_name: mysql_container
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: sakila
      TZ: "Asia/Tokyo"
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
      - ./init:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
```



2.クローンしたディレクトリに移動して、イメージ作成・コンテナ作成・立ち上げを行います
```bash
cd mysql-docker
docker-compose up -d
```

3.起動したコンテナの中に入ります
 ```bash
docker-compose exec mysql /bin/bash
```
mysqlの記載がある箇所は、docker-compose.ymlに記載のあるサービス名を記載します。

ターミナルが下記の表示になればOKです。
```bash
bash-4.4#
```

4.mysqlにroot権限で接続します。
```bash
bash-4.4# mysql --user=root --password=root
```
ターミナルが下記の表示になればOKです。
```bash
mysql> 
```

<a id="#Chapter2"></a>
# データベース作成方法
1.現在のデータベース一覧を確認します
```bash
mysql> show databases;
```
結果
```bash
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
+--------------------+
```

2.新しいデータベースを作成します。
```bash
mysql> CREATE DATABASE example;
```
下記の表示がでれば成功です。
```bash
Query OK, 1 row affected (0.02 sec)
```

3.再度データベース一覧を確認します。
```bash
mysql> show databases;
```
下記のように、2で指定したデータベースが表示されていればOKです。
```bash
+--------------------+
| Database           |
+--------------------+
| example            |
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
+--------------------+
```

<a id="#Chapter3"></a>
# ユーザー作成方法
1.現在のユーザ一覧を確認します。
```bash
mysql> SELECT user, host FROM mysql.user;
```
結果
```bash
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
```

2.ユーザーを作成します。今回は下記のユーザーを作成します。
- ユーザー名: example_user
- host: localhost
- password: example
```bash
mysql> CREATE USER 'example_user'@'localhost' IDENTIFIED BY 'example';
```
下記の表示が出ていれば成功です。
```bash
Query OK, 0 rows affected (0.02 sec)
```

3.再度ユーザー一覧を確認します。
```bash
mysql> SELECT user, host FROM mysql.user;
```
結果
```bash
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| example_user     | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
```
下記のように、2で指定したユーザーが表示されていればOKです。

4.作成したユーザーでmysqlに接続します。
```bash
bash-4.4# mysql --host=localhost --user=example_user --password=example
```
ターミナルが下記の表示になればOKです。
```bash
mysql> 
```

5.試しにデータベース一覧を見ます。
```bash
mysql> show databases;
```
結果
```bash
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
```
ユーザーに権限を付与していないので「sakila」や「example」のデータベースの表示がありません。次のセクションで「example_user」権限を付与していきます。

<a id="#Chapter4"></a>
# ユーザー権限付与
1.再度rootユーザーでmysqlに接続します。
```bash
bash-4.4# mysql --user=root --password=root
```

2.「example_user」に権限を付与します。
今回は「sakila」のデータベースへのSELECTの権限を付与します。
sakilaについて: https://dev.mysql.com/doc/sakila/en/

```bash
mysql> GRANT select ON sakila.* TO 'example_user'@'localhost';
```
下記の表示が出ていれば成功です。
```bash
Query OK, 0 rows affected, 1 warning (0.01 sec)
```

3.再度「example_user」でmysqlに接続します。
```bash
bash-4.4# mysql --host=localhost --user=example_user --password=example
```
ターミナルが下記の表示になればOKです。
```bash
mysql> 
```

4.データベース一覧を見ます。
```bash
mysql> show databases;
```
```bash
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| sakila             |
+--------------------+
```
sakilaが追加されています。
正しく権限を付与できているか確認するためにsakilaの「city」テーブルでSELECT文を実行してみます。

5.まず、「sakila」のデータベースに切り替えます。
```bash
mysql> use sakila;
```
「Database changed」の表記があれば成功です。

6.テーブル一覧をみます。
```bash
mysql> show tables;
```
結果
```bash
+----------------------------+
| Tables_in_sakila           |
+----------------------------+
| actor                      |
| actor_info                 |
| address                    |
| category                   |
| city                       |
| country                    |
| customer                   |
| customer_list              |
| film                       |
| film_actor                 |
| film_category              |
| film_list                  |
| film_text                  |
| inventory                  |
| language                   |
| nicer_but_slower_film_list |
| payment                    |
| rental                     |
| sales_by_film_category     |
| sales_by_store             |
| staff                      |
| staff_list                 |
| store                      |
+----------------------------+
```

7.sakilaの「city」テーブルでSELECT文を実行してみます。
```bash
mysql> SELECT * FROM city limit 5;
```
結果
```bash
+---------+--------------------+------------+---------------------+
| city_id | city               | country_id | last_update         |
+---------+--------------------+------------+---------------------+
|       1 | A Corua (La Corua) |         87 | 2006-02-15 04:45:25 |
|       2 | Abha               |         82 | 2006-02-15 04:45:25 |
|       3 | Abu Dhabi          |        101 | 2006-02-15 04:45:25 |
|       4 | Acua               |         60 | 2006-02-15 04:45:25 |
|       5 | Adana              |         97 | 2006-02-15 04:45:25 |
+---------+--------------------+------------+---------------------+
```
SELECT文が通り、テーブルの中身を確認できました。

8.試しに権限のないupdate文を実行してみます。country_idが87のcityをtestに変更してみます。
```bash
mysql> UPDATE city set city=test WHERE country_id=87;
```
結果
```bash
ERROR 1142 (42000): UPDATE command denied to user 'example_user'@'localhost' for table 'city'
```
権限がないのでERRORが返ってきます。



<a id="#reference"></a>
# 参考文献
- [100秒でMySQLのローカル環境をDockerで作って、データも自動で入れる。最強のSQL練習環境構築法](https://zenn.dev/takuho/articles/efc40344f3122e)
- [MySQLでデータベースを作成しよう](https://prog-8.com/docs/mysql-database-setup)
- [MySQLで新しいユーザーを作成して権限を付与する方法](https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql-ja)