mysql忘记密码了,一般步骤如下

(1) 停库systemctl mysqld stop

(2)启库跳过鉴权

mysqld_safe --skip-grant-tables --skip-networking &

--skip-grant-tables 跳过数据库权限验证

--skip-networking 该变量控制是否关闭TCP/IP连接,默认允许,如果启用,则只能本地socker连接。 如果只是本地客户端连接,强烈建议开启。

(3)修改密码

alter user root@'localhost' identified by '123456';

(4)重启库

pkill mysqld

systemctl start mysqld

密码忘记,登录报密码错误

使用skip-grant-tables方式跳过密码验证

发现依然无法登录

可能情况,执行了flush privileges;

原因分析:

设置skip-grant-tables 则会将acl_init (dont_read_acl_tables=true) 该值设置为true,不进入鉴权,也就是不进行密码验证,而一旦执行flush privileges,

flush privileges会重新加载acl_reload。acl_reload会将 dont_read_acl_tables=false 该值设置为flase,而再次构建内存数组acl_users,等价于又进入了密码鉴权,所有有了如上密码报错。

补充:

flush privileges命令的作用就是清空MySQL内存中acl_users数组的数据内容,重新从mysql.user表中加载用户的权限信息。
所以当我们不是通过create user、grant 、revoke、drop命令来操作用户和权限,而是通过update语句直接去修改了mysql.user表中的数据的时候,MySQL内存中的acl_users数据信息是没有被更新的,所以此时我们想让我们对mysql.user表的修改直接生效,就需要手动的去更新acl_users数组的信息,而这个更新内存权限信息的操作,也就是通过flush privileges;命令来实现的。

复现: