2016.10.14 今天程序员节啊
1.问题描述
2.解决过程
http://stackoverflow.com/questions/10299148/mysql-error-1045-28000-access-denied-for-user-billlocalhost-using-passw
3.总结
1.问题描述
之前做项目一直用的root用户进行的mysql数据库操作,觉得不安全,今天新建了个用户darry,打算将项目使用的用户换成darry
但是新建用户之后,使用命令 mysql -udarry -ppassword 连接数据库时报错
ERROR 1045 (28000) Access denied for user 'darry'@'localhost' (using password YES)
2.解决过程
网上查询一番发现这个错误一般有以下几个原因
1).用户是否存在
2).是否输入了密码(不输入密码一般后面为using password NO)
3).用户存在但未设置密码
4).未对当前登录IP进行连接授权
我创建用户时设置了密码,所以可以排除前三个原因。
对用户授权时使用的命令是
GRANT ALL ON dbname.* TO darry@'%';
'%'的含义为所有IP均可进行连接,所以也不应该有这个问题啊
然后翻墙google,在
http://stackoverflow.com/questions/10299148/mysql-error-1045-28000-access-denied-for-user-billlocalhost-using-passw
得到一点启发,(其实原因和解决办法已经写得很清楚了,但是英文不好只看懂点大概没有彻底理解)
大致原因是在本地登录时匹配的用户是 darry@'localhost'
而darry@'%';意为匹配所有IP地址,但在本地连接时却匹配不到,所以本地连接时报错没有权限。
于是创建一个新用户darry@'localhost' 并授于相应权限,
GRANT ALL ON dbname.* TO darry@'localhost' IDENTIFIED BY 'password';
刷新权限(或重启Mysql) flush privileges;
再次使用 mysql -udarry -ppassword 进行登录发现成功进入。
但是如果只有darry@'localhost'这个用户意味着这个用户只能从本地进行连接,无法远程连接,
如果只有darry@'%';这个用户则意味着这个用户只能从远程连接,无法从本地连接。
所以如果本地连接和远程连接都需要的话则需要创建者两个用户。
因为之前用的root用户既有本地连接也有远程连接的操作,所以使用 select user,host from mysql.user 进行查询发现果然存在两个root用户,即
root@'localhost'; 和 root@'%';
3.总结
刚开始使用的xshell终端工具连接的服务器,然后操作的mysql数据库,以为这是对数据库的远程连接,觉得darry@'%'不应该没有权限的。
后来使用其他几个也是 user@'%';的用户进行连接也是这个错误,
忽然意识到我只是远程连接的服务器,但是在服务器上连接数据库应该是本地连接,所以尝试用 user@'localhost';用户进行连接发现成功。
原来是我混淆了本地连接和远程连接的概念,
在服务器上对服务器上的mysql进行操作是本地连接,所以服务器上的项目中的文件在进行数据库的增删改查时都是通过的本地连接
远程连接一般是在其他机器上直接连接本机的服务器,比如通过其他机器的终端,或者Navicat等数据库工具。