【MySQL入門】ユーザー作成の方法を解説!8.0からの変更点も紹介

皆さんMySQL使っていますか?今回はMySQLに新しいユーザーを追加する方法を紹介します。一人で勉強していると、今ひとつ必要性が感じられないユーザーの追加ですが、実用上はとても大事な機能です。

この記事ではなぜユーザーの追加が必要なのかという基本的なところから、具体的な追加の方法、そしてMySQL8.0からの変更点まで解説していきます。最後まで読めばユーザーの必要性や追加方法をしっかりマスターできますよ。さっそくいってみましょう!

目次

ユーザー作成の基本:なぜユーザーは必要なのか?

最初に理解しておきたいのがユーザー追加の必要性です。学習の初期段階では、インストール時に設定したrootアカウントさえあればすべての機能が使え、何も問題は感じないことでしょう。ですが、そのすべての機能が使える、ということが問題なのです。

例えばあなたの作ったデータベースを仲間内で使うことにしましょう。このとき、全員がroot権限でデータベースにアクセスしたらどんなことが起こるでしょうか。

この中にMySQLの知識がほとんど無い人がいて、たまたま次のようなクエリを打ち込んでしまったら……

DROP DATABASE ‘使用中のデータベース’;

当然rootユーザーの命令なので、使用中のデータベースは問答無用で削除されます。復元は不可能ではありませんが相当に厄介です。こんな悲劇を未然に防ぐためにも、管理者以外のユーザーは権限を制限するべきです。

むしろ制限しなければなりません。このような事情でユーザー作成と権限設定の必要性があるわけです。

ユーザー作成の具体的なコマンド

それでは具体的なユーザー作成の方法に入っていきましょう。

ユーザー作成

とはいえ、コマンドそのものは非常に簡単です。

ユーザー作成の書式

CREATE USER ‘ユーザー名’ IDENTIFIED BY ‘パスワード’;

例として次のユーザーを追加するクエリを示します。

ユーザー名:test_user
パスワード:pass123

mysql> CREATE USER 'test_user' IDENTIFIED BY 'pass123';

このように表示されれば追加は成功です。

Query OK, 0 rows affected (0.11 sec)

ユーザーが追加されたかどうかを確認するには次のクエリをつかいます。

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

確かにtest_userが追加されているのが確認できますね。なお、MySQLではユーザーをユーザー名とホストで識別します。

ホストとはどこのコンピュータから接続したかという情報で、localhostだと自身のコンピュータからの意味になります。あまり意識したことは無いかもしれませんが、rootはlocalhost以外からアクセスできない設定になっているんですね。

一方、今回はユーザーに対してホストの設定を行いませんでした。結果、ホスト欄には任意の文字列を表すワイルドカードの「%」が入っています。これはtest_userがどこからのアクセスでも受け入れることを表しています。

もし、ホストごとにアクセスの制御をしたい場合はユーザーを次のような書式にすることで対応します。

CREATE USER ‘ユーザー名’@’ホスト名’ IDENTIFIED BY ‘パスワード’;

ただ、ホスト名による制御はネットワークの知識も必要になってくるので、理解に自信がない場合はユーザー名による制御でも目的は果たせます。適宜使い分けてください。

また、ユーザー名はMySQLのバージョンによって設定可能な長さが異なります。MySQL5.6までは16文字、5.7移行は32文字までに制限されています。そこまで長いユーザー名を設定することもあまりないかもしれませんが、知識として覚えておいて下さい。

ユーザーへの権限付与

さて、首尾よくユーザーを作成することはできましたが、じつはこのユーザー、作られただけでは何もすることができません。なぜかと言うと、権限を持っていないからです。MySQLではユーザーは権限の範囲内で様々な操作をすることができます。

この考え方から行くと、あらゆる権限を持っているのがrootアカウントなんですね。逆に、作りたてのユーザーはいわば、権限が空っぽの状態なんです。なので、許可したい操作に合わせた権限を付与してあげる必要があります。

そのためのコマンドが次のようになります。

権限付与の書式

GRANT 権限 ON データベース名.テーブル名 TO ‘ユーザー名’;

読み方は(ユーザー名)に対して(データベース名)の(テーブル名)に対する(権限)を付与する、という感じです。具体的なクエリは次のようになります。

GRANT ALL ON db1.* TO 'test_user';

次のような表示がでれば成功です。

Query OK, 0 rows affected (0.12 sec)

これはtest_userに対してdb1というデータベースのすべてのテーブルに対し、権限の付与以外のあらゆる権限を付与する、という意味になります。アスタリスク(*)は「すべて」を意味する記号です。SELECTなどでもよく使いますので覚えておきましょう。

ALL権限はrootの権限から、任意のユーザーへの権限付与機能を除いた全権限を付与します。データベースの作成・削除など、非常に強力な権限ですので、扱いには注意が必要です。その他の権限については公式リファレンスをご参照ください。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.7.1.4 GRANT 構文

かなりの量のため、正直一個一個手作業で設定するのはかなり大変です。ですが、MySQL8.0ではこれらの権限をひとまとめにして扱うロールという機能が追加されました。

新しく追加されたばかりで日本語のリファレンスもなく初心者には扱いが難しいかもしれませんが、使えるようになると格段に便利な機能です。ある程度学習が進んだら公式リファレンスに挑戦してみると良いでしょう。

MySQL :: MySQL 8.0 Reference Manual :: 6.3.4 Using Roles

権限の確認と剥奪

付与した権限を確認するにはSHOW GRANTS構文を使います。

SHOW GRANTS FOR ‘ユーザー名’;

実行例は次のとおりです。

SHOW GRANTS FOR 'test_user';
+----------------------------------------------------+
| Grants for test_user@%                             |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `test_user`@`%`              |
| GRANT ALL PRIVILEGES ON `db1`.* TO `test_user`@`%` |
+----------------------------------------------------+
2 rows in set (0.01 sec)

先ほど付与したALL権限が確認できますね。また、付与した権限を剥奪する場合はREVOKE文を使います。

REVOKE 権限 ON データベース名.テーブル名 FROM ‘ユーザー名’;

GRANTとほとんど同じ書式で権限を剥奪することができます。TOがFROMに変わっていることだけ注意しましょう。試しにtest_userからALL権限を剥奪して、権限を表示してみましょう。

REVOKE ALL ON db1.* FROM 'test_user';
SHOW GRANTS FOR 'test_user';
Query OK, 0 rows affected (0.11 sec)

+---------------------------------------+
| Grants for test_user@%                |
+---------------------------------------+
| GRANT USAGE ON *.* TO `test_user`@`%` |
+---------------------------------------+
1 row in set (0.00 sec)

たしかにALL権限がなくなっているのが確認できました。

MySQL8.0からの変更点

最後にユーザー作成に関して、MySQL8.0からの変更点をお伝えします。前の章にもあったように、MySQL8.0はロール機能が加えられたり、ナンバリングのルールが大きく変わったりといろいろとあったバージョンでした。

そして、ここで紹介するように今まで慣例的に許容されていた方法が一部使えなくなる変更が有りました。

MySQL5.7までの状況

MySQL5.7まではユーザー作成に関して次の方法が認められていました。未定義のユーザー名に対して

GRANT 権限 ON データベース名.テーブル名 TO ‘ユーザー名’ IDENTIFIED BY ‘パスワード’;

これで権限を持ったユーザーが作成できていたのです。これは、未定義のユーザー名に対して権限を付与し、それと同時にユーザーを作成する、というクエリになります。

どうせユーザー作成と権限付与は同時に行うのだから、いっぺんに済ませてしまえ、という発想からよく使われてきました。

MySQL8.0からこう変わった

ですが、MySQL8.0から上記の方法ではユーザーが作成できなくなりました。どうするのかというと、

CREATE USER ‘ユーザー名’ IDENTIFIED BY ‘パスワード’;でユーザーを作成
GRANT 権限 ON データベース名.テーブル名 TO ‘ユーザー名’;で権限を付与

の2段階で行えば良いのです。つまり、この記事で紹介した方法で一本化されました。MySQL8.0以前に書かれた解説ではGRANTでユーザー作成ができる旨の説明がされていることがありますが、今後その方法は使えなくなります。

8.0ではロール機能など、ユーザー権限に対して色々とテコ入れが入ったので、その結果、暗黙のユーザー作成を認めない方向になったのだと考えられます。

何はともあれ、これからMySQLを学んでいく方はCREATE USERとGRANTの二段構えでユーザー作成を行っていきましょう。

まとめ

いかがでしたか?今回はユーザー作成についてその必要性から具体的なクエリ、MySQL8.0での変更点までを紹介しました。

ユーザーの権限分割は一人で学習している段階ではなかなか重要性を感じにくい部分です。この記事で少しでもユーザー作成の意義を感じることができたのであれば幸いです。

この記事を書いた人

フリーのエンジニア・ライター。
プログラミング、ライティング、マーケティングなど、あらゆる手段を駆使して、
ハッピーなフルリモートワーカーを目指し中。

最近興味がある分野は深層強化学習。
積みゲー、積ん読がどんどん増加しているのがここ数年の悩み。
実は侍エンジニア塾の卒業生だったりします。

目次