はい。どうやら誰かが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)
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)
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;
は使用できません。