これが重複した質問であると考える前に、私は、それがいくぶんあいまいなケースであっても、私はユニークだと思います。
数日前、Ubuntu 10.04サーバー上のMySQLのバージョンを5.3.3にアップグレードしました(10.04のUbuntuリリースよりも先です)。今日、私は何かのためにphpMyAdminにログインしようとしましたが、やや恐ろしいConnection for controluser as defined in your configuration failed
エラーを発見しました。
これを修正する方法に関するいくつかのSO質問からの説明に従った後、私は行き詰まりました。
flush privileges
を使用)を削除します。granting access to database phpmyadmin for phpmyadmin@localhost: already exists
だから、ここに私が残っているものがあります。私は変更も取り消しもできない許可を持っています:
mysql> show grants for 'phpmyadmin'@'localhost';
+-------------------------------------------------------------------------------------------------------------------+
| Grants for phpmyadmin@localhost |
+-------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'phpmyadmin'@'localhost' IDENTIFIED BY PASSWORD '*46CFC7938B60837F46B610A2D10C248874555C14' |
| GRANT ALL PRIVILEGES ON `phpmyadmin`.* TO 'phpmyadmin'@'localhost' |
+-------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.26 sec)
mysql> revoke usage on *.* from 'phpmyadmin'@'localhost';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on Host 'localhost'
mysql> revoke usage on *.* from 'phpmyadmin'@'localhost' identified by 'trustno1';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on Host 'localhost'
(心配する必要はありません、私はもうこのパスワードを使用していませんが、以前使用したパスワードであり、新しいphpmyadminインストール用に選択したパスワードではありません)。
これらの許可/特権を完全に削除するにはどうすればよいですか?必要な場合(DBではなくphpmyadmin)、最初からやり直すことができてうれしいです。
MysqlのUSAGE特権は、単に、グローバルレベル*.*
で定義されたユーザー 'phpadmin' @ 'localhost'に対する特権がないことを意味します。さらに、同じユーザーがデータベースphpmyadmin phpadmin.*
に対してALL特権を持っています。
したがって、すべての特権を削除し、最初から完全に開始する場合は、次の手順を実行します。
データベースレベルのすべての権限を取り消します。
REVOKE ALL PRIVILEGES ON phpmyadmin.* FROM 'phpmyadmin'@'localhost';
ユーザー「phpmyadmin」@「localhost」をドロップします
DROP USER 'phpmyadmin'@'localhost';
上記の手順により、インスタンスからユーザーが完全に削除されます。つまり、最初からユーザーを再作成できます。
上記の内容の背景を少し説明すると、ユーザーを作成するとすぐにmysql.user
テーブルが作成されます。その中のレコードを見ると、ユーザーとすべての特権が'N'
に設定されていることがわかります。 show grants for 'phpmyadmin'@'localhost';
を実行すると、上記の出力が表示されます。単に「ユーザーのグローバルレベルでの特権はありません」に変換されます。これで、データベースレベルでこのユーザーにALL
付与され、これはテーブルmysql.db
に保存されます。 SELECT * FROM mysql.db WHERE db = 'nameofdb';
を実行すると、すべての特権で'Y'
が表示されます。
上記の説明は、現在データベースにあるシナリオを示しています。したがって、USAGE
特権のみを持つユーザーは、このユーザーは接続できますが、SHOW GLOBAL VARIABLES; SHOW GLOBAL STATUS;
以外には他の特権はありません。
補足として、revoke usage on *.* from 'phpmyadmin'@'localhost';
が機能しない理由は非常に簡単です。USAGE
と呼ばれる許可はありません。
許可USAGE
は論理的な許可です。どうやって? 'phpmyadmin' @ 'localhost'にはmysql.user
にエントリがあります(user = 'phpmyadmin'およびHost = 'localhost')。 mysql.userのすべての行は、意味的にUSAGE
を意味します。 DROP USER 'phpmyadmin'@'localhost';
を実行すると問題なく動作するはずです。内部では、実際にこれを実行しています:
DELETE FROM mysql.user WHERE user='phpmyadmin' and Host='localhost';
DELETE FROM mysql.db WHERE user='phpmyadmin' and Host='localhost';
FLUSH PRIVILEGES;
したがって、mysql.user
から文字列を削除すると、REVOKE USAGE
を文字通り実行できない場合でも、REVOKE USAGE
を実行することになります。