MySQL ROOT密码正确,却怎么也无法从本地登录MySQL

548 阅读1分钟

mysql库中的user表缺少一个root指向host:localhost的数据项,只有一个root指向host:主机名的数据项,故怎么也无法利用root账户登录MySQL。

root账户缺失了访问localhost主机的账户信息,导致无法本地登录。

mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
+-------------------------------+
| query                         |
+-------------------------------+
| User: 'root'@'%';             |
| User: 'ufo'@'10.10.50.%';     |
| User: 'root'@'127.0.0.1';     |
| User: 'root'@'::1';           |
| User: 'cloud'@'%';            |
| User: 'cloud'@'10.50.50.%';   |
| User: 'exporter'@'localhost'; |
| User: 'root'@'localhost';     |
+-------------------------------+
8 rows in set (0.00 sec)

解决方案

第一种是因为root账户初始的时候有3条记录,包含root对应localhost,hostname,127.0.0.1三条账户数据,我们可以update host为其他两项中一项为localhost即可。

第二种是直接insert一条记录,host为localhost即可

总结一下:即使root的host包含了主机名,127.0.0.1那么依然是无法正常登录的,这里必须要有localhost的host才行。

推展

查看用户权限

mysql> SELECT host,user,Grant_priv,Super_priv FROM mysql.user;

image.png 修改权限

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
update user set `Select_priv` = 'Y',`Insert_priv` = 'Y',`Update_priv` = 'Y',`Delete_priv` = 'Y',`Create_priv` = 'Y',`Drop_priv` = 'Y', `Reload_priv` = 'Y',`Shutdown_priv` = 'Y',`Process_priv` = 'Y',`File_priv` = 'Y', `Grant_priv` = 'Y', `References_priv` = 'Y',`Index_priv` = 'Y',`Alter_priv` = 'Y', `Super_priv` = 'Y',`Show_db_priv` = 'Y',`Create_tmp_table_priv` = 'Y',`Lock_tables_priv` = 'Y',`Execute_priv` = 'Y',`Repl_slave_priv` = 'Y', `Repl_client_priv` = 'Y',`Create_view_priv` = 'Y', `Show_view_priv` = 'Y', `Create_routine_priv` = 'Y',`Alter_routine_priv` = 'Y',`Create_user_priv` = 'Y', `Event_priv` = 'Y',`Trigger_priv` = 'Y',`Create_tablespace_priv` = 'Y' where user='root' and host='localhost';

删除权限表的用户 方法一:使用 DROP USER 语句删除普通用户

mysql> DROP USER  ``'test1'``@``'localhost'``;

方法二:使用DELETE语句删除普通用户

DELETE FROM mysql.user WHERE Host=``'hostname'` `AND User=``'username'``;