Access denied for user 'root'@'localhost' (using password: NO)

能否通过进入数据库的DOS界面,或者能操作mysql数据库(数据库名是mysql).
如果能,那就在mysql库下中的user表中插入一条权限记录。

mysql>SELECT host, user, password FROM user WHERE user != 'root';
+-----------+---------+-------------------------------------------+
| HOST      | USER    | PASSWORD                                  |
+-----------+---------+-------------------------------------------+
| localhost |         | *A4B6157319038724E3560894F7F932C8886EBFCF |
| %         | crawler | *00A51F3F48415C7D4E8908980D443C29C69B60C9|
+-----------+---------+-------------------------------------------+

1,HOST字段中通配符'%'匹配所有主机,如果HOST字段为空,等价于'%'
2,USER字段不支持通配符,但空白的USER字段匹配所有用户
3,服务器在user表中读取权限时,优先匹配最能确定具体主机的纪录,由于'%'匹配所有主机,所以localhost优先于'%'
4,有相同HOST值的记录,优先匹配具体user值的记录。

在上面的示例中,mysql未使用-h选项时,连接本地UNIX套接字(使用-h选项时,连接的是TCP/IP套接字,也就是IP加端口),HOST匹配localhost:
由于用户crawler在user表中,没有host值为localhost的记录,所以优先匹配记录为"所有从localhost登录的用户"在本例中
AnyUser@localhost优先级高于crawler@%,故使用crawler@%的密码在本机无法登录。

当使用'mysql -u crawler -pXXX DBNAME -h 10.10.10.11'时,匹配crawler@%,密码有效。

细心的兄弟可能已经注意到了:

127.0.0.1和localhost是同一台机器,为什么'mysql -u crawler -pXXX DBNAME -h 127.0.0.1'却可以成功登录呢?

更细心的兄弟可能已经猜到答案了:

我启动mysqld时使用了'--skip-name-resolve'参数,此种情况下由于不做域名解析,127.0.0.1和localhost对mysql数据库来讲,是不同的主机,与AnyUser@localhost并不匹配。(所以一般使用'--skip-name-resolve'参数启动mysql数据库时,HOST字段一般使用IP地址)

问题的原因已经找到,要解决这个问题,下面三种方法选一种即可:
1、将AnyUser@localhost记录删除
2、添加一条crawler@localhost记录
3、使用时-h选项指定主机
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值