记一次线上误删mysq所有账号密码恢复!
这几天一直在整理线上mysql账号,需要把某些账号的drop权限revoke掉。有一台机器的mysql使用mysql命令登录进去后,(通过select current_user查看实际登录的是root@localhost)执行revoke操作提示需要输入密码。为什么啊?后面再说!
也就是当前登录的账号'root'@'localhost'没有权限执行grant、revoke子命令!为什么?
这时我就分别查看root@localhost、[email protected]的权限,发现前人留了一个坑在这里,如图:
'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