美文网首页
mysql8.0.19 root用户连续输错密码被锁定的解决方法

mysql8.0.19 root用户连续输错密码被锁定的解决方法

作者: langlyyy | 来源:发表于2021-10-21 18:23 被阅读0次

如果紧急,直接看第四步

前置:为何会上锁?
由于这个数据库一开始是开发部署和管理的,而且是生产库,没有备份,有开发频繁输入root的错误密码,导致root这个账户被锁定了

现象:
如果mysql被锁了,通过mysql -u root -p登录,输入正确的密码后,会显示下面的内容:

Access denied for user 'root'@'localhost'. Account is locked.

解决办法:
  1. 通过其他高权限的账号,对root账号进行解锁.
  2. 通过备份data下面的数据,然后重置mysql.
  3. 通过配置--skip-grant-tables,跳过权限管控进行解锁.
  4. 通过服务启动加载--init-file参数,执行sql语句对root解锁.

过程:
  1. 一开始是想到使用root账号的,后面查询得知,只有一个kaifa的只读账号,所以第一种方法就直接失效了。
  2. 第二种方法只适用于自己玩的机器,或者没有业务的,这种方法首先是时间长,其次是不知道你备份的数据是否是正确的,有可能血本无归。
  3. 第一、二种方法不行,就想到了行业通用的做法(哈哈哈哈哈),通过--skip-grant-tables参数,跳过权限管控,然后直接解锁。
一般情况下这个方法都是有效的,并且看了官方文档上面说的,也是可以通过这个参数去解决的。

但在测试的过程中发现,mysql8.0之后,--skip-grant-tables参数不能配置在my.cnf,会报错,不知道是什么原因。后面通过
mysqld --user=mysql --port=3306 --skip-grant-tables --socket=/tmp/mysqlx.sock启动。
但启动后发现mysql没有启动3306端口port: 0

2021-10-20T09:56:30.180742Z 5 [ERROR] [MY-000061] [Server] 1290  The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement.
2021-10-20T09:56:30.181040Z 0 [System] [MY-010931] [Server] /data/mysql/bin/mysqld: ready for connections. Version: '8.0.19'  socket: '/tmp/mysql.sock'  port: 0  MySQL Community Server - GPL.

看官方文档后,发现是由于启用--skip-grant-tables后,服务还会启动 --skip_networking 禁用远程连接,后面根据网上的方法通过
mysql -S /tmp/mysqlx.sock 进行连接,但这种连接方法也不行,会提示Can't connect to MySQL server on 'localhost' (111)。折腾了这种方法很多次,也试过换个参数都是不行,后面直接放弃了。

  4. 后面发现可以通过--init-file参数在服务启动的时候执行sql语句
编写sql

[root@ajgi bin]# cat /tmp/init-sql.sql
ALTER USER 'root'@'localhost' ACCOUNT UNLOCK;
update mysql.user set account_locked='N' where user='root';
commit;

执行命令

[root@ajgi bin]# /data/mysql/bin/mysqld --socket=/tmp/mysql.sock --port=3306 --init-file=/tmp/init-sql.sql --skip-grant-tables

后面发现没有执行成功,查看日志发现有报错

2021-10-20T09:56:30.164897Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2021-10-20T09:56:30.167247Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/data/mysqldb' in the path is accessible to all OS users. Consider choosing a different directory.
2021-10-20T09:56:30.180742Z 5 [ERROR] [MY-000061] [Server] 1290  The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement.
2021-10-20T09:56:30.181040Z 0 [System] [MY-010931] [Server] /data/mysql/bin/mysqld: ready for connections. Version: '8.0.19'  socket: '/tmp/mysql.sock'  port: 0  MySQL Community Server - GPL.
2021-10-20T09:56:30.301613Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/tmp/mysqlx.sock'
2021-10-20T09:58:27.567733Z 0 [System] [MY-010910] [Server] /data/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.19)  MySQL Community Server - GPL.

不知道是因为我的sql问题还是什么问题,把--skip-grant-tables参数去掉,和少些了ALTER USER ‘root’@‘localhost’ ACCOUNT UNLOCK;这句

[root@ajgi bin]# cat /tmp/init-sql.sql
update mysql.user set account_locked='N' where user='root';
commit;

再执行命令

[root@ajgi bin]# /data/mysql/bin/mysqld --socket=/tmp/mysql.sock --port=3306 --init-file=/tmp/init-sql.sql --skip-grant-tables

查看日志发现启动成功

2021-10-20T10:28:14.597848Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/data/mysqldb' in the path is accessible to all OS users. Consider choosing a different directory.
2021-10-20T10:28:14.650257Z 0 [System] [MY-010931] [Server] /data/mysql/bin/mysqld: ready for connections. Version: '8.0.19'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server - GPL.
2021-10-20T10:28:14.855299Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/tmp/mysqlx.sock' bind-address: '::' port: 33060
2021-10-20T10:29:49.677778Z 0 [System] [MY-010910] [Server] /data/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.19)  MySQL Community Server - GPL.
2021-10-20T10:29:55.210163Z 0 [System] [MY-010116] [Server] /data/mysql/bin/mysqld (mysqld 8.0.19) starting as process 25990
2021-10-20T10:29:55.213519Z 0 [Warning] [MY-013242] [Server] --character-set-server: 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.

命令执行成功后,也没有报错了,然后关闭这个mysqld进程,去掉--init-file配置,按照原来的配置启动(如通过systemctl或者mysqld_safe)
重新启动后,登录页面看到终于成功了,折腾了一个下午的我

Image.png
成功登录后,查询看到root已经解锁
mysql> select user,host,account_locked from mysql.user;
+------------------+-----------+--------------+
| user             | host      |account_locked|
+------------------+ ----------+--------------+
| mysql.infoschema | localhost | Y            |
| mysql.session    | localhost | Y            |
| mysql.sys        | localhost | Y            |
| root             | localhost | N            |
+------------------+ ----------+--------------+

总结:
1.mysql8.0之后的版本,--skip-grant-tables参数配置可能会无效,或者各种各样的问题,如果需要解锁用户,或者忘记密码需要重置密码,可以通过--init-file参数编写sql语句进行解决。
2.网上教程很多都是复制黏贴的,千篇一律根本没有经过验证的。

参考文章
https://mariadb.com/kb/en/account-locking/
https://smarttechways.com/2021/05/04/lock-unlock-user-account-in-mysql/
https://www.codenong.com/cs106347475/
https://dev.mysql.com/doc/refman/8.0/en/server-options.html#option_mysqld_skip-grant-tables

相关文章

  • mysql8.0.19 root用户连续输错密码被锁定的解决方法

    如果紧急,直接看第四步 前置:为何会上锁?由于这个数据库一开始是开发部署和管理的,而且是生产库,没有备份,有开发频...

  • Ubuntu常用命令

    开启 / 锁定 / 解锁 root 用户 开启 root 用户登陆 之后会提示要输入root用户的密码,连续输入两...

  • ubuntu18.04的优化大全

    设置 root 用户密码 在 Terminal 下输入sudo passwd root 输入当前用户密码,回车 输...

  • 与产品在一起的日子2:场景

    昨天,产品经理发来一张图,说需要在用户中心后台加上一个解锁的功能,以解锁那些连续输错登录密码时被锁定的账号,如下图...

  • Python实现用户密码登录

    python基础-实现用户密码登录,输错三次锁定 作业需求: 1.输入用户名密码 2.认证成功后显示欢迎信息 ...

  • 登录接口

    ——登录接口—— 要求:·输入用户名密码 ·认证成功后显示欢迎信息 ·输错三次后锁定 大体思路...

  • su认证失败

    su认证失败 问题 发生这个错误的原因是root用户默认是被锁定的,只要使用passwd命令重新设置下root密码...

  • 树莓派用户账号

    树莓派默认有2个用户,pi和root,pi的默认密码是raspberry,root默认是没有密码且锁定 可使用以下...

  • Mac 终端进入root用户失败解决方法

    1、使用su - root 指令,输入密码切换root用户 报错:su: Sorry 2、解决方法 1.输入 ...

  • Ubuntu su认证失败解决方法

    Ubuntu su认证失败解决方法 Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许“su”...

网友评论

      本文标题:mysql8.0.19 root用户连续输错密码被锁定的解决方法

      本文链接:https://www.haomeiwen.com/subject/goxqaltx.html