今天使用了将近一年的数据库突然连接不上了,昨天还好好的,今天就提示我:
Access denied for user 'root'@'localhost'(using password YES)
我确定我使用的密码是正确的,这就很奇怪了;
那怎么办呢?只能现在Mysql的配置文件中加入
skip-grant-tables
进行免密登录了,我的电脑是ubuntu的,mysql配置文件在/etc/mysql/mysql.conf.d/mysqld.cnf;
修改保存好配置文件后,重启下mysql服务:
sudo service mysql restart
然后登录用mysql -uroot -p登录mysql,不需要输入密码;
但是我程序调用免密登录的时候,发现已久无法登录,报错:
connect ECONNREFUSED 127.0.0.1:3306
这又有点奇怪了,我命令直接连数据库是可以的,说明端口3306是正常的,没有被防火墙关掉;
那排除法我觉得可能是这个127.0.0.1的问题,所以我又将配置文件中的bind-address=127.0.0.1给注掉了;
重启数据库程序调用数据库服务,发现已久报上面这个错,简直蒙圈;后来查找资料发现:
在mysql的用户表中,
即使root的host包含了主机名,127.0.0.1那么依然是无法正常登录的,这里必须要有localhost的host才行
所以还是回到命令行工具,登录数据库后使用以下命令新增root的localhost并设定密码:
use mysql;
alter user 'root'@'localhost' IDENTIFIED BY 'xxxx密码';
grant all on *.* to root@'localhost' identified by 'xxxx密码' with grant option;
flush privileges;
完了之后再删掉数据库配置表中的skip-grant-tables并重启数据库服务
再登录数据库,发现用刚设置的密码能成功登录;
还是很困惑以前的密码为啥无法登录,查看mysql的user表,发现里面有个password_expired字段,
我想可能是我原先的这个root帐号的这个字段属性是Y,意思就是过期了吧;
那么怎么知道密码的有效期是多长呢?可以使用以下命令进行查看:
show viriables like 'default_password_lifetime';
默认系统的密码生命周期是360天;
如果要认密码永不过期的话,可以使用以下方法:
set global default_password_lifetime=0;
或者在配置文件中添加配置;[如果不做上面修改,可以直接修改配置文件,但是改完后要重启服务才生效]
[mysqld]
default_password_lifetime=0
修改root密码永不过期:
alter user 'root'@'localhost' password expire never;
修改后,可使用如下指令查看:
select user,host,password_lifetime,password_last_changed,password_expired from mysql.user;
可以看到的是password_lifetime的值变成0了;
如果要恢复默认策略,可进行如下操作:
alter user 'root'@'localhost' password expire default;
折腾了大半天,总算解决了,记录下希望能帮助有需要的人。