【MySQL】ユーザーにDB作成権限を付与する方法。対話モードへのログイン方法と権限の変更方法|データベースを作成する権限がありませんの対処法

データベースと複数のデバイスが接続しているイラスト Database
記事内に広告が含まれていることがあります。
[PR]

phpMyAdminにログインしたときや、あるいはMySQLの対話モードでデータベースを新規作成しようとした場合に「データベースを作成する権限がありません」や「Access denied」が表示されることがある。

データベースを作成する権限がありません
mysql> CREATE DATABASE test_db;
ERROR 1044 (42000): Access denied for user 'wp_user'@'%' to database 'test_db'

これは、現在ログインしているユーザーにデータベースを作成する権限が与えられていないため発生する。

ここでは、ユーザーの権限を変更して、エラーメッセージを解消し、データベースを作成する手順について解説。(※前提条件:MySQLがインストール済み & ルートユーザーとしてMySQLにアクセスできる)

MySQLの対話モードにログインする

指定したユーザーの権限を変更するために、ルートユーザーとしてMySQLの対話モードに入る。

MySQLがインストールされているかは、以下コマンドで確認する。

# mysql --version
mysql  Ver 14.14 Distrib 5.6.51, for Linux (x86_64) using  EditLine wrapper

バージョン情報が表示されれば、MySQLがインストールされている。

次に、ルートユーザーとしてMySQLにログインする。以下コマンドを実行。

$mysql -u ルートユーザー名 -h ホスト名 -pパスワード

オプション内容必要性デフォルト
-uユーザー名必須root
-hホスト名省略可(localhostとみなす)localhost
-pパスワード必須root

※「-p」のパスワード指定時の注意点
 ・「-p」の後に空白を入れずにパスワードを記述する
 ・「Warning: Using a password on the command line interface can be insecure.」セキュリティの警告がでるが問題ない。警告を出したくない場合は以下で対応可能。
 ・「-p」の後ろに空白を入れ、パスワードを指定しなければ、コマンド実行後にパスワードを聞かれる。入力している文字は表示されないが、パスワードを入力してEnterをクリックすればログインできる。
 ・「-p」は「–password」と同じ。

デフォルトの設定の場合

もし、MySQLの設定がデフォルトのままで、ルートユーザーの情報などを変更していない場合は以下の設定になっている。

  • ルートユーザー名: root
  • ホスト名: localhost ※省略可能
  • パスワード: root

次のコマンドを実行すればルートユーザーとしてログインできる。

# mysql -u root -proot
ルートユーザーとしてログインに成功した例

登録ユーザーと権限を確認する

ルートユーザーとしてログインできたら、現在登録されているユーザーと権限を確認する。同時に確認できないので、ユーザーの一覧を確認してから、個別に権限を確認する。

ユーザーの一覧を確認

mysql> select user, host from mysql.user;

コマンドを実行するとユーザーの一覧が表示される。

+---------+-----------+
| user    | host      |
+---------+-----------+
| root    | %         |
| wp_user | %         |
| root    | localhost |
+---------+-----------+
3 rows in set (0.00 sec)

上記例では、rootユーザーと、wp_userの2つのユーザーが存在する。

なお、hostの「%」はワイルドカードで、すべてのホストを許容するという意味。

ユーザーの権限を確認

ユーザーの権限を確認するには、以下コマンドを実行する。

mysql> show grants for 'ユーザー名'@'ホスト名';

例えば、以下のようになる。

mysql> show grants for 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost
                |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '******' WITH GRANT OPTION
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION|
+----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> show grants for 'root'@'%';
+--------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@%
+--------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD '******' WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show grants for 'wp_user'@'%';
+--------------------------------------------------------------------------------------------------------+
| Grants for wp_user@%                                                                                   |
+--------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wp_user'@'%' IDENTIFIED BY PASSWORD '******'                                    |
| GRANT ALL PRIVILEGES ON `wp\_db`.* TO 'wp_user'@'%'                                                    |
+--------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

これを見ると、rootユーザーは「GRANT ALL PRIVILEGES ON *.*」ですべてのDBに対しすべての権限(ALL PRIVILEGES)与えられている。

一方、wp_userは「GRANT USAGE ON *.*」ですべてのDBに何も権限を与えない(USAGE)とした上で、「GRANT ALL PRIVILEGES ON ‘wp_db’」として、データベース名 wp_db のみ全ての権限を与えるとしている。

(参考)MySQL公式 権限一覧

ユーザーの権限を変更する方法

ユーザー名と現在与えられている権限が確認できたので、次に、権限の変更を行う。

権限の変更・付与は「grant」コマンドを使う。

権限を変更・付与するコマンド

grant <与える権限名> on <対象のDB>.<対象のテーブル> to ‘<ユーザー名>’@'<ホスト名>’ identified by ‘<パスワード>’;

主な権限の種類

最初に指定する「与える権限名」には種類がかなりある。ここでは主要なもののみをご紹介。

権限名内容
ALL PRIVILEGESすべての権限
CREATEDBやテーブルの作成
DROPDBやテーブルの削除
DELETEテーブルから行を削除
INSERTテーブルに行を挿入
SELECTSELECTコマンドの使用を許可
UPDATEテーブルの行の更新
GRANT OPTION他のユーザーへの権限付与または削除

詳細は MySQL公式 権限一覧 にて。

<対象のDB>.<対象のテーブル>

  • ワイルドカード「*」が使える。
  • 「*.*」はすべてのDBのすべてのテーブルが対象。グローバルという。
  • 「DB名.*」は、指定したDBの中のすべてのテーブルが対象。

identified by ‘<パスワード>’

identified by ‘<パスワード>’ の記述は省略可能。省略した場合はもともと設定してあるパスワードが適用される。

指定したユーザーにすべての権限を与える

grant all privileges on *.* to 'ユーザー名'@'ホスト名';

実際の適用例は以下のようになる。

mysql> grant all privileges on *.* to 'wp_user'@'%';
Query OK, 0 rows affected (0.00 sec)


mysql> show grants for 'wp_user'@'%';
+-----------------------------------------------------------------------------------------------------------------+
| Grants for wp_user@%                                                                                            |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'wp_user'@'%' IDENTIFIED BY PASSWORD '******'                                    |
| GRANT ALL PRIVILEGES ON `wp\_db`.* TO 'wp_user'@'%'                                                             |
+-----------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

グローバル「*.*」にすべての権限「ALL PRIVILEGES」を与えることができた。

これで、このユーザーでデータベースを作成することが可能になる。

データベースを作成する(エラーが発生しないか確認)

本題に戻り、phpMyAdminにログインしたときや、あるいはMySQLの対話モードでデータベースを新規作成しようとした場合に「データベースを作成する権限がありません」や「Access denied」が表示されないか確認する。

phpMyAdminからログアウトするには、左カラムのドアのアイコンをクリックする。

再度ログインしてみると、これまで表示されていたエラーが消えている。

新たに、データベースを作成することができる。

コマンドラインでもエラーが発生することなくデータベースの生成に成功。

CREATE DATABASE test_db;

権限の変更と警告やエラーの表示を消すことに成功。以上。

タイトルとURLをコピーしました