能否通过进入数据库的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选项指定主机
Access denied for user 'root'@'localhost' (using password: NO)
最新推荐文章于 2024-07-31 10:29:06 发布