好的。显然有人从root中删除了 DROP 权限(他们已授予所有其他权限),大概是为了防止意外删除表。问题是现在没有用户有权限。在尝试重新分配权限时,mysql 响应
mysql> GRANT ALL ON *.* TO 'root'@'localhost';
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)
我尝试创建一个具有相同权限的新用户;同样的错误。
Error creating account root@[hostname]: Access denied for user 'root'@localhost (using password: YES)
Run Code Online (Sandbox Code Playgroud)
我仔细检查了我的身份验证身份: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)
Run Code Online (Sandbox Code Playgroud)
SELECT COUNT(1) MySQLGrantsCount,VERSION() MySQLVersion
FROM information_schema.columns
WHERE table_schema='mysql' AND table_name='user';
Run Code Online (Sandbox Code Playgroud)
回报
+------------------+--------------+
| MySQLGrantsCount | MySQLVersion |
+------------------+--------------+
| 43 | 5.6.34 |
+------------------+--------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
好吧,那么问题比我想象的要简单。
是时候破解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;
Run Code Online (Sandbox Code Playgroud)
然后,运行此命令来验证:
SHOW GRANTS FOR 'root'@'localhost';
Run Code Online (Sandbox Code Playgroud)
您无法仅运行GRANT命令来解决此问题的原因是您无法授予您当前不拥有的权限。同样,您不能使用,RENAME TABLE mysql.user TO mysql.user_old,mysql.user_new TO mysql.user;因为RENAME需要DROP特权。
| 归档时间: |
|
| 查看次数: |
24832 次 |
| 最近记录: |