LoginSignup
2
1

More than 1 year has passed since last update.

[MySQL] アカウント作成と権限付与

Posted at

はじめに

下記手順を紹介いたします。

  • MySQLアカウント作成
  • 権限付与
  • データベース接続

動作確認環境

mysql> status
--------------
mysql  Ver 8.0.32 for Linux on x86_64 (MySQL Community Server - GPL)

Connection id:          14
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         8.0.32 MySQL Community Server - GPL
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
UNIX socket:            /var/lib/mysql/mysql.sock
Binary data as:         Hexadecimal
Uptime:                 26 days 22 hours 19 min 37 sec

Threads: 2  Questions: 41  Slow queries: 0  Opens: 148  Flush tables: 3  Open tables: 67  Queries per second avg: 0.000
--------------

MySQLアカウント作成

mysqlクライアントを起動し、rootアカウントで接続します。

[root@mdb01 ~]# mysql -uroot -p
Enter password:
mysql>

現在のアカウント一覧を確認します。
host列は接続元のクライアントを表しており、アカウントは、ユーザ名@ホスト名という形で識別されます。
localhostとなっている場合は、MySQLサーバ以外のホストからは接続不可となります。

mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)

最初に接続元クライアントを指定せずに、chibattyというアカウントを作成します。

mysql> CREATE USER chibatty IDENTIFIED BY 'パスワード';
Query OK, 0 rows affected (0.03 sec)

作成されたアカウントを確認します。
接続元を指定しなかったため、host列に%が設定されています。%は接続元クライアントを制限しない事を表します。

mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| chibatty         | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.01 sec)

続いて接続元クライアントをlocalhostに限定したアカウントを作成します。

mysql> CREATE USER chibatty@localhost IDENTIFIED BY 'パスワード';
Query OK, 0 rows affected (0.01 sec)

host列にlocalhostが設定されているアカウントが追加された事が確認できます。

mysql> SELECT user, host FROM mysql.user WHERE user = 'chibatty';
+----------+-----------+
| user     | host      |
+----------+-----------+
| chibatty | %         |
| chibatty | localhost |
+----------+-----------+
2 rows in set (0.00 sec)

今回は他サーバから接続する要件はないため、host列が%となっているアカウントをDROP USERのDDLにて削除します。

mysql> DROP USER chibatty;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT user, host FROM mysql.user WHERE user = 'chibatty';
+----------+-----------+
| user     | host      |
+----------+-----------+
| chibatty | localhost |
+----------+-----------+
1 row in set (0.00 sec)

mysqlクライアントを終了し、作成したアカウントでMySQLにログインします。

mysql> exit
Bye
[root@mdb01 ~]# mysql -uchibatty -p
Enter password:
mysql>

自身が接続中のアカウントは、CURRENT_USER()ファンクションを使用する事で確認可能です

mysql> SELECT CURRENT_USER();
+--------------------+
| CURRENT_USER()     |
+--------------------+
| chibatty@localhost |
+--------------------+
1 row in set (0.00 sec)

権限付与

chibattyアカウントを使用して、menagerieデータベースを選択してみます。
下記の通り権限不足によるエラーが発生しました。

mysql> USE menagerie
ERROR 1044 (42000): Access denied for user 'chibatty'@'localhost' to database 'menagerie'

また、SHOW DATABASESにて、データベース一覧を確認しましたが、menagerieは表示されません。

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
2 rows in set (0.00 sec)

現在、chibattyアカウントに付与されている権限を確認します。
USAGEという権限が付与されています。
USAGEは、MySQLサーバに接続できるのみの権限のため、現在の権限では、menagerieデータベースに接続できません。

mysql> SHOW GRANTS FOR chibatty@localhost;
+----------------------------------------------+
| Grants for chibatty@localhost                |
+----------------------------------------------+
| GRANT USAGE ON *.* TO `chibatty`@`localhost` |
+----------------------------------------------+
1 row in set (0.00 sec)

chibattyに権限を付与するため、rootアカウントにてMySQLサーバに接続します。

mysql> exit
Bye
[root@mdb01 ~]# mysql -uroot -p
Enter password:
mysql>

menagerieデータベースに対するすべての権限をchibattyに付与します。

mysql> GRANT ALL ON menagerie.* TO chibatty@localhost;
Query OK, 0 rows affected (0.01 sec)

chibattyアカウントに付与されている権限を確認します。

mysql> SHOW GRANTS FOR chibatty@localhost;
+-----------------------------------------------------------------+
| Grants for chibatty@localhost                                   |
+-----------------------------------------------------------------+
| GRANT USAGE ON *.* TO `chibatty`@`localhost`                    |
| GRANT ALL PRIVILEGES ON `menagerie`.* TO `chibatty`@`localhost` |
+-----------------------------------------------------------------+
2 rows in set (0.00 sec)

データベース接続

chibattyアカウントを使用してチュートリアル用データベースに接続します。mysqlクライアント起動時のコマンドラインオプションにデータベース名を指定する事により、データベースを選択できます。あるいはmysqlクライアント起動後にUSE文を使用して選択する事も可能です。

[root@mdb01 ~]# mysql -uchibatty -p menagerie
Enter password:
mysql> SELECT CURRENT_USER(), DATABASE();
+--------------------+------------+
| CURRENT_USER()     | DATABASE() |
+--------------------+------------+
| chibatty@localhost | menagerie  |
+--------------------+------------+
1 row in set (0.00 sec)

ちなみに\Gを使用すると、行と列を入れ替えて表示できます。
対象列が多い場合など、有用な機能です。

mysql> SELECT CURRENT_USER(), DATABASE() \G
*************************** 1. row ***************************
CURRENT_USER(): chibatty@localhost
    DATABASE(): menagerie
1 row in set (0.00 sec)
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1