mysql找回root密码

时间:2023-02-09 12:03:20

一、常用非安全

skip-grant-tables
1、关闭mysql服务
略(可以kill,尽量别用kill -9)

2、参数启动mysql
bin/mysqld_safe --defaults-file=my.cnf --skip-grant-tables --skip-networking &
#在mysql8.0以skip-grant-tables选项启动,会自动启用--skip-networking
--skip-networking参数。其会让实例关闭监听端口,自然也就无法建立TCP连接,而只能通过本地socket进行连接。

3、更改密码
mysql -S /usr/local/mysql57/data/mysql.sock
5.6:
update mysql.user set password=password('123456') where host='localhost' and user='root';
5.7:
update mysql.user set authentication_string=password('123456') where host='localhost' and user='root';
8.0:
移除了PASSWORD()函数及不再支持SET PASSWORD ... = PASSWORD ('auth_string')语法。
所以需要先通过flush privileges操作触发权限表的加载,再使用alter user语句修改root用户的密码
flush privileges;
alter user 'root'@'localhost' identified by '123456';

4、刷新权限
flush privileges;

5、重启mysql
先关闭再重启
bin/mysqld_safe --defaults-file=my.cnf &

总结:
1. 如果只添加了--skip-grant-tables,修改完密码后,其实无需重启,执行flush privileges即可。
2. 从安全角度出发,建议加上--skip-networking。但因其是静态参数,将其剔除掉需要重启实例。
3. 加上--skip-networking,虽然可以屏蔽掉TCP连接,但对于本地其它用户,只要有socket文件的可读权限,都能无密码登录。还是存在安全隐患。
4. 不建议通过update的方式修改密码,更通用的其实是alter user。

二、最新较安全

1、关闭mysql


2、创建一个文件
vim init.sql
alter user 'root'@'localhost' identified by '123456';

3、重新启动mysql
使用--init-file参数,启动实例
bin/mysqld_safe --defaults-file=my.cnf --init-file=/usr/local/mysql57/init.sql &
#--defaults-file需要放在--init-file前面

4、启动成功后删除文件即可
rm -f /usr/local/mysql57/init.sql

5、补充
如果mysql实例是通过服务脚本来管理的,除了创建sql文件,整个操作可简化为一步。
service mysqld restart --init-file=/usr/local/mysql57/init.sql