はじめに
今回は、データベース作成・ユーザー作成・ユーザー権限付与の方法について記載します。
今まで、SQLは書いたことがありましたが最初に行うデータベース作成・ユーザー作成・ユーザー権限付与に関してはあまり行ったことがなかったので記事にしました。
参考になれば幸いです。
目次
環境構築(docker)
今回は、下記のリポジトリを利用して環境を構築させていただきます。
https://github.com/tadatakuho/mysql-docker
1.git cloneにより、必要なファイル一覧(docker-compose.yml等)を取得します
git clone git@github.com:tadatakuho/mysql-docker.git
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.クローンしたディレクトリに移動して、イメージ作成・コンテナ作成・立ち上げを行います
cd mysql-docker
docker-compose up -d
3.起動したコンテナの中に入ります
docker-compose exec mysql /bin/bash
mysqlの記載がある箇所は、docker-compose.ymlに記載のあるサービス名を記載します。
ターミナルが下記の表示になればOKです。
bash-4.4#
4.mysqlにroot権限で接続します。
bash-4.4# mysql --user=root --password=root
ターミナルが下記の表示になればOKです。
mysql>
データベース作成方法
1.現在のデータベース一覧を確認します
mysql> show databases;
結果
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
+--------------------+
2.新しいデータベースを作成します。
mysql> CREATE DATABASE example;
下記の表示がでれば成功です。
Query OK, 1 row affected (0.02 sec)
3.再度データベース一覧を確認します。
mysql> show databases;
下記のように、2で指定したデータベースが表示されていればOKです。
+--------------------+
| Database |
+--------------------+
| example |
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
+--------------------+
ユーザー作成方法
1.現在のユーザ一覧を確認します。
mysql> SELECT user, host FROM mysql.user;
結果
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
2.ユーザーを作成します。今回は下記のユーザーを作成します。
- ユーザー名: example_user
- host: localhost
- password: example
mysql> CREATE USER 'example_user'@'localhost' IDENTIFIED BY 'example';
下記の表示が出ていれば成功です。
Query OK, 0 rows affected (0.02 sec)
3.再度ユーザー一覧を確認します。
mysql> SELECT user, host FROM mysql.user;
結果
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| example_user | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
下記のように、2で指定したユーザーが表示されていればOKです。
4.作成したユーザーでmysqlに接続します。
bash-4.4# mysql --host=localhost --user=example_user --password=example
ターミナルが下記の表示になればOKです。
mysql>
5.試しにデータベース一覧を見ます。
mysql> show databases;
結果
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
ユーザーに権限を付与していないので「sakila」や「example」のデータベースの表示がありません。次のセクションで「example_user」権限を付与していきます。
ユーザー権限付与
1.再度rootユーザーでmysqlに接続します。
bash-4.4# mysql --user=root --password=root
2.「example_user」に権限を付与します。
今回は「sakila」のデータベースへのSELECTの権限を付与します。
sakilaについて: https://dev.mysql.com/doc/sakila/en/
mysql> GRANT select ON sakila.* TO 'example_user'@'localhost';
下記の表示が出ていれば成功です。
Query OK, 0 rows affected, 1 warning (0.01 sec)
3.再度「example_user」でmysqlに接続します。
bash-4.4# mysql --host=localhost --user=example_user --password=example
ターミナルが下記の表示になればOKです。
mysql>
4.データベース一覧を見ます。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| sakila |
+--------------------+
sakilaが追加されています。
正しく権限を付与できているか確認するためにsakilaの「city」テーブルでSELECT文を実行してみます。
5.まず、「sakila」のデータベースに切り替えます。
mysql> use sakila;
「Database changed」の表記があれば成功です。
6.テーブル一覧をみます。
mysql> show tables;
結果
+----------------------------+
| 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文を実行してみます。
mysql> SELECT * FROM city limit 5;
結果
+---------+--------------------+------------+---------------------+
| 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に変更してみます。
mysql> UPDATE city set city=test WHERE country_id=87;
結果
ERROR 1142 (42000): UPDATE command denied to user 'example_user'@'localhost' for table 'city'
権限がないのでERRORが返ってきます。