ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'test'

时间:2021-11-28 20:28:50

最近在练习mysql命令模式创建删除账号,尝试了删除root账号后如何创建账号密码重新获取数据库管理权限,详http://blog.csdn.net/slovyz/article/details/52174765 但是在创建root账号后,使用root账号登陆mysql,创建普通管理用户中遇到如下报错

ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'test'

在网上搜了一下,大概有以下几种说法:
1、对该数据库 权限不足。
2、参数问题
3、user的user列存在空值记录。
以上的解决方法 基本上都是需要重启MySQL、而且都是片面的。

这里解释一下,出现这种情况的原因。
      首先这里是用root用户操作,所以对这个数据库的权限绝对是*的
     出现上面的报错,很可能,其实应该可以说基本上都是因为 my.cnf 文件里面有 skip-name-resolve参数,这个参数导致 这不能解析hostname或其它方式的登录, 所以登录任何用户,匹配的时候不走root@'localhost',或者127.0.0.1或者::1 ,而是 一个劲的走root@'%'.
再来查看一下每种方式下的root用户是否有grant权限:
mysql> select Grant_priv from user where Host='127.0.0.1';
+------------+
| Grant_priv |
+------------+
| N          |
+------------+

1 row in set (0.00 sec)


mysql> select Grant_priv from user where Host='localhost';
+------------+
| Grant_priv |
+------------+
| N          |
+------------+
1 row in set (0.01 sec)


请注意 !
 注意上面每条记录的的红色字体部分Grant_priv: N
这个表示,以这种方式解析登录的root用户,是否有grant权限,Y则表示有授权限给其他用户的权限,N表示没有。
这里恰好,就是我们要找的原因,因为我的/my.cnf文件里面有 skip-name-resolve参数,所以root都是解析到@'%'方式登录,于是就没有grant_priv权限。

解决方法:
1、在不重启MySQL服务的情况下,只需要在登录的时候加上-h参数。
      例如:(a). /usr/local/mysql/bin/mysql -uroot -p123456 -h localhost
                  (b)./usr/local/mysql/bin/mysql -uroot -p123456 - h127.0.0.1

2、更改用户权限让其拥有grant权限

mysql> update user set Grant_priv='Y' where Host='127.0.0.1';

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select Grant_priv from user where Host='127.0.0.1';
+------------+
| Grant_priv |
+------------+
| Y          |
+------------+
1 row in set (0.00 sec)

mysql> update user set Grant_priv='Y' where Host='localhost';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select Grant_priv from user where Host='localhost';
+------------+
| Grant_priv |
+------------+
| Y          |
+------------+
1 row in set (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)