web-dev-qa-db-ja.com

DROPコマンドがユーザー 'root' @ 'localhost'に拒否されました

はい。どうやら誰かがrootからDROP特権を削除しました(他のすべての特権が付与されています)、おそらくテーブルの誤った削除を防ぐためです。問題は、ユーザーが特権を持っていないことです。権限を再割り当てしようとすると、mysqlは次のように応答します

mysql> GRANT ALL ON *.* TO 'root'@'localhost';
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

同じ特権を持つ新しいユーザーを作成してみました。同じエラー。

Error creating account root@[hostname]: Access denied for user 'root'@localhost (using password: YES)

私は次のように認証されていることを再確認しました:root @ localhost。

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql>  select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

MYSQL付与

SELECT COUNT(1) MySQLGrantsCount,VERSION() MySQLVersion
FROM information_schema.columns
WHERE table_schema='mysql' AND table_name='user';

戻り値

+------------------+--------------+
| MySQLGrantsCount | MySQLVersion |
+------------------+--------------+
|               43 | 5.6.34       |
+------------------+--------------+
1 row in set (0.00 sec)

どうすれば特権を付与できますか?

2
KareemElashmawy

OK、問題は予想よりも簡単です。

mysql.userテーブルをハッキングする時が来ました。

CREATE TABLE mysql.user_new LIKE mysql.user;
INSERT INTO mysql.user_new SELECT * FROM mysql.user;
UPDATE mysql.user_new SET drop_priv='Y',grant_priv='Y'
WHERE user='root' AND Host='localhost';
UPDATE mysql.user A INNER JOIN mysql.user_new B USING (user,Host)
SET A.drop_priv = B.drop_priv;
FLUSH PRIVILEGES;

次に、これを実行して確認します。

SHOW GRANTS FOR 'root'@'localhost';

これを修正するためにGRANTコマンドを実行できなかったのは、現在所有していない特権を付与できないためです。同様に、RENAMEにはDROP特権が必要なため、RENAME TABLE mysql.user TO mysql.user_old,mysql.user_new TO mysql.user;は使用できません。

1
RolandoMySQLDBA