Mysql用正确的帐号密码突然无法登录的原因及解决办法

今天使用了将近一年的数据库突然连接不上了,昨天还好好的,今天就提示我:

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;

折腾了大半天,总算解决了,记录下希望能帮助有需要的人。

 

 

你可能感兴趣的:(数据库)