如果紧急,直接看第四步
前置:为何会上锁?
由于这个数据库一开始是开发部署和管理的,而且是生产库,没有备份,有开发频繁输入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)
重新启动后,登录页面看到终于成功了,折腾了一个下午的我
成功登录后,查询看到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
网友评论