文章目录
1.客户允许重启数据库服务
2.客户不允许重启数据库服务
1。当客户允许重启mysql服务
原理(用户密码存在某一张表中,只要修改某张表中的密码即可)(8.0以上不适用用第二个方法)
方法一:my.cnf中 【mysqld】配置行下skip_grant_tables #跳过授权的表,修改配置文件需要重启服务生效。
原理:进入数据库后查看表结构 desc mysql.user; 找到字段authentication_string 密码存在此字段中 故可以查询此表中需要的字段 select name,host,authentication_string from mysql.user; 查到加密后的字符串
得知mysql使用password('') 函数加密密码 思路是制作一个新的加密串替换旧的字段下的字符串,即可完成修改密码操作。(注意user表中有多个用户,需要指定需要修改用户),改后要flush privileges;
例 update mysql.user set authentication_string=password('xxxxxx') where user='root' and host='localhost';
flush privileges;
#注:低版本使用 8.0以上不适用
方法二:8.0版本以上操作方法 my.cnf中 【mysqld】配置行下skip_grant_tables #跳过授权的表 修改配置文件需要重启服务生效
./mysql进库
执行update mysql.user set authentication_string='' WHERE user='root' and host='localhost'; #将root密码设置为空
exit 后注释my.cnf中 【mysqld】配置行下skip_grant_tables 重启数据库
重启后./mysql 进入库
use mysql
alter user root@'localhost' identified by '123456'; #即可更改密码 退出新密码重进即可。
2.客户不允许重启数据库服务
客户不允许重启mysql服务 原理(知道另一台oadb库的root密码,物理文件覆盖,加载新文件拷整个data下oadb库文件,不推荐只拷user的文件,可能和其他表有关联)
!!!有风险,实在没有办法可用,后果是恢复后只有root用户,其他用户会消失,根据业务重新创建对应用户
例:
一覆盖 scp -r ip:/mysql/data/oadb /mysql/data/
二加载数据 ps aux |grep mysqld 查看到主进程号(一定是主进程)
kill -SIGHUP 进程号 #SIGHUP作用为服务对应磁盘文件的热加载(不用重启加载,类似nginx reload) 即可使用已知的数据库的root密码登录还原后数据库。