记一次线上误删mysql所有账号密码恢复!

记一次线上误删mysq所有账号密码恢复!

 

背境

这几天一直在整理线上mysql账号,需要把某些账号的drop权限revoke掉。有一台机器的mysql使用mysql命令登录进去后,(通过select current_user查看实际登录的是root@localhost)执行revoke操作提示需要输入密码。为什么啊?后面再说!

也就是当前登录的账号'root'@'localhost'没有权限执行grant、revoke子命令!为什么?

这时我就分别查看root@localhost、[email protected]的权限,发现前人留了一个坑在这里,如图:

记一次线上误删mysql所有账号密码恢复!_第1张图片

'root'@'localhost' 用户没有使用with grant option子句;

[email protected]该用户使用了with grant option 子句;

那么with grant option有什么用呢?

子句 "WITH GRANT OPTION" 表示该用户可以为其他用户分配权限。

那么我就使用[email protected]登录,但是提示需要密码,但是密码忘记了,那就使用root@localhost进入后去掉[email protected]就行咯!(所以这里就是上面root@localhost使用grant权限需要密码的原因的,因为都是root用户,host不同。)

于是我使用root@localhost登录后,不知道是我有多久没有使用update语句了还是刚刚过完年没有缓过来,我很直接输入update mysql.user set password = ' ';

我居然就按下直接回车,这下完了,没有加where条件,把这个mysql上所有的用户密码清空!!!

(这是一个业务库,有好几个业务账号代码里面配置了账号密码的)完了完了。。。

 

处理

一会后我才缓过神来,并没有真正载入授权表,我还没有执行full privilege,谢天谢地,谢谢mysql这个full privilege机制!!

顺便说下full privilege ?

简单来说,修改了mysql库后并不会立马载入授权表,当你执行full privileges mysql引擎会重新载入授权表,你的修改才会立马生效。

但是我得把原来的密码恢复啊!!!

幸好,之前通过select host,user,password from mysql.user 查出来密码,是通过md5加密的。

那也没关系,通过grant 重新授权为all,密码直接使用这个md5加密的密码就可以了咯。

这里说一下grant的时候输入明文的密码和md5加密后的密码怎么样恢复:

目前我是知道md5加密的密码的,使用

grant all on *.* to 'xxx'@'%' identified by password 'md5加密后的密码';

如果知道原密码,使用

grant all on *.* to 'xxx'@'%' identified by '12345';

 

处理流程

先直接使用mysql 直接登录进去,flush后退出使用[email protected],执行grant 再flush

预案

假如full privileges 后使用[email protected]不能登录或使用root@localhost不能grant,

1.修改配置文件,去掉 #skip-grant-tables 的注释,重启mysql服务

vim /etc/my.cmf

去掉注释#skip-grant-tables

2.再处理!!

检查

那么问题好解决了,先直接使用mysql 直接登录进去,flush后退出使用[email protected],执行grant 再flush,后面就是使用账号登录测试,show processlist 看连进来的socket的mysql-proxy log。

 

反省

update 操作一定要想清楚要不要加where!!

上班不要想妹子le

 

 

 

 

 

 

 

你可能感兴趣的:(运维)