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」コマンドを使う。
主な権限の種類
最初に指定する「与える権限名」には種類がかなりある。ここでは主要なもののみをご紹介。
権限名 | 内容 |
ALL PRIVILEGES | すべての権限 |
CREATE | DBやテーブルの作成 |
DROP | DBやテーブルの削除 |
DELETE | テーブルから行を削除 |
INSERT | テーブルに行を挿入 |
SELECT | SELECTコマンドの使用を許可 |
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;
権限の変更と警告やエラーの表示を消すことに成功。以上。