昨天晚上重装了下虚拟机,遇到点mysql账号相关的麻烦事,纠结了一晚上,早上起来,终于解决了。
我一般都是ssh到虚拟机上,直接用控制台对mysql进行日常管理的,这里就会用到host名为localhost的www用户,为了方便,是没有进行密码设置的,密码为空。
而我的应用程序呢,一般是用的127.0.0.1这个host下的www用户,密码不为空。
mysql> select host,user,password from user;
+-----------+------+-------------------------------------------+
| host | user | password |
+-----------+------+-------------------------------------------+
| localhost | www | |
| 127.0.0.1 | www | *password |
+-----------+------+-------------------------------------------+
这时便出现了一个比较怪的问题:
当我以127.0.0.1这个host进行mysql登录的时候,不管是ssh控制台
mysql -h 127.0.0.1 -u www -p
还是用rails 应用程序连接,均报以下错误:
Mysql::Error: Access denied for user 'www'@'localhost' (using password: YES)
怎么回事呢?为什么会把我的127.0.0.1这个host解析成localhost呢?
明明我指定用127.0.0.1这个host登录,Mysql为什么偏要给我换成localhost呢
仔细看看上面那个mysql.user这个表,你就会发现。
同样是www用户,host为localhost的数据行在host为127.0.0.1的这条数据行的前面。
当mysql解析这个127.0.0.1的时候,他会把他当成localhost来使。所以就找到了第一行,不带密码的www@localhost,马上就进行认证,看密码符不符合,来确认是否进行连接。
不知道这个算不算mysql的事,当连接数据库进行认证的时候,他会从上至下遍历,找到第一条满足条件的host和user数据,然后返回进行密码校验。
www@localhost这条数据在www@127.0.0.1这条数据之上,所以不管你来的是localhost,还是127.0.0.1, mysql都将用第一条无密码的www@localhost去进行密码校验。
交换一下顺序就OK了
mysql> select host,user,password from user;
+-----------+------+-------------------------------------------+
| host | user | password |
+-----------+------+-------------------------------------------+
| 127.0.0.1 | www | *password |
| localhost | www | |
+-----------+------+-------------------------------------------+
以上仅是个人观点,如有不正确的地方,请指正。
分享到:
相关推荐
mysql -h 127.0.0.1 的时候,使用 TCP/IP 连接, mysql server 认为该连接来自于127.0.0.1或者是”localhost.localdomain” mysql -h localhost 的时候,是 不使用TCP/IP 连接的,而使用 Unix socket ;此时,...
今天在mac上搭建好了php的环境,把先前在window、linux下运行良好的程序放在mac上,居然出现访问不了数据库,数据库连接的host用的是localhost,可以确认数据库配置是正确的,因为在java中使用localhost访问正常,...
mysql_connect(‘localhost’,’root’,’zzzizzz1′); 使用strace获取系统调用: 复制代码 代码如下: strace php connects.php 2>&1 | grep connect #127.0.0.1 -> internet socket connect(3, {sa_family=AF_INET...
localhost与127.0.0.1的区别localhost与127.0.0.1的区别是什么?相信有人会说是本地ip,曾有人说,用127.0.0.1比localhost好,可以减少一次解析。看来这个入门问题还有人不清楚,其实这两者是有区别的。 no1: ...
您可以使用IP地址或服务器名称,例如,127.0.0.1 或 localhost MySQL数据库名称:表示要连接的数据库的名称。 用户名和密码:指定用于连接MySQL数据库服务器的MySQL用户的用户名和密码。该帐户必须具有足够的权限...
仔细思考了下,既然mysql是正常启动的,本地连接不上,是否和mysql绑定ip有关,因为之前将其作为远程数据库使用的,因此对其绑定的ip进行了修改。 切换到对应路径,打开mysql配置文件: 可以看到绑定的ip地址为192....
问题:一台服务器的PHP程序通过localhost地址无法...大部分情况下,可以用localhost代表本机127.0.0.1,但是在MySQL连接时,二者不可混用,而且MySQL中权限设置中localhost与127.0.0.1也是分开设置的。当设置为127.0.0.
mysql> insert into mysql.user(Host,User,Password) values('localhost','zhouz',password('1234')); 3)允许外网 IP 访问 mysql>insert into mysql.user(Host,User,Password) values('%','zhouz',password('1234...
最近用 Node 写一个小玩意,需要用到 MySQL 数据库,现在用得最广泛的是 mysql 这个库。然后呢,现在 ORM 这么火,干脆也上 ORM 吧,正好我也不会可以学习一下,于是找到了 Sequelize.js 这个 ORM 库。 发现问题 看...
最近部署mysql5.6,发现默认mysql只允许本地提供服务,如果要进行若干配置,记录如下。...需要使用root权限登录mysql,更新mysql.user表,设置指定用户的Host字段为%,默认一般为127.0.0.1或者localhost。 1
_mysql 40907 0.4 2.1 4907248 350300 s000 S 5:46下午 0:00.95 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql...
mysql的root账户,我在连接时通常用的是localhost或127.0.0.1,公司的测试服务器上的mysql也是localhost所以我想访问无法访问,测试暂停. 解决方法如下: 1,修改表,登录mysql数据库,切换到mysql数据库,使用sql语句查看”...
" host " : " 127.0.0.1 " , " port " : 27017 , " db " : " test " , " collection " : " blog_posts " }, " mysql " : { " host " : " localhost " , " user " : " root " , " password " : " " , " db ...
mysql的root账户,我在连接时通常用的是localhost或127.0.0.1,公司的测试服务器上的mysql也是localhost所以我想访问无法访问,测试暂停. 解决方法: 1,修改表,登录mysql数据库,切换到mysql数据库,使用sql语句查看”...
打开 application.properties 修改 MySQL 和 Redis 连接信息. spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.cache.type=redis spring.datasource.username=root spring.datasource.password=123456...
host' => array( 'memcache://127.0.0.1:11212' ) ) ); //MySql配置 //slave数据库从库可以使用多个 $GLOBALS['config']['db'] = array( 'host' => array( 'master' => 'localhost', 'slave' => array('...
将root用户对应的记录只保留一条host为localhost的记录; 然后将root用户对应的host属性由localhost改为% 再执行命令 flush privileges; 2.修改/etc/mysql/my.cnf 老的版本中 >skip-networking =>...
MySQL-Ansible 使用Ansible备份Mysql 这很有趣,它将排除mysql数据库,仅备份对我们很重要的数据库ansible-playbook playbook.yml --extra-vars " host=localhost user=username pass=password db_host=127.0.0.1 ...
DB_HOST=127.0.0.1 DB_DATABASE=blog DB_PREFIX=blog_ DB_USERNAME=root DB_PASSWORD=123.comg 分别写入数据库服务器地址、所连接的数据库名、表前缀、用户名、密码 其中表前缀DB_PREFIX 字段默认没有,需要在config...
在项目的根文件夹中,使用任何终端,运行以下命令行以在localhost中启动Docker容器: docker-compose up -d 设置环境 将/app/.env.example文件复制到名为“ .env”的新文件中 在.env文件中,更改以下行: DB_...