MySql--忘记root密码后如何重置

摘要

忘记root密码后如何重置

  • 先关闭mysql服务

1
2
3
sudo systemctl stop mysqld
# 或者直接kill进程
sudo kill -9 $(ps -ef | grep mysqld | grep -v grep | awk '{print $2}')
  • 以不检查权限的方式启动MySQL,即开启无权限模式

1
sudo mysqld_safe --skip-grant-tables &
  • 登录mysql,此时不需要密码即可登录

1
mysql -u root -p
  • 重置root密码为空

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 选择mysql数据库
USE mysql;

# 修改密码的方法是更新mysql.user表中的authentication_string字段。
# 请注意,您应该使用mysql_native_password作为您的插件名称。这是因为MySQL8.0更改了默认的身份验证插件。
# 这是修改密码的SQL语句,这里将root密码置为空,即清除root密码
# 为什么这里要设置为空,而不是设置一个新的密码,原因是UPDATE语句不支持mysql_native_password,
# 需要使用ALTER USER语句,但是此时是无权限模式,其不支持ALTER USER语句,所以我们先设置为空,然后关闭无权限模式后再重新设置密码。
UPDATE user SET authentication_string=null WHERE User='root';

# 刷新权限:
FLUSH PRIVILEGES;
# 退出MySQL
exit;
  • 停止以 --skip-grant-tables 模式运行的 MySQL,重新启动 MySQL 服务

1
2
3
4
5
# 关闭mysql服务,此时不需要密码
sudo mysqladmin -u root -p shutdown

# 启动mysql服务
sudo systemctl start mysqld
  • 重新登录mysql并设置root密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 此时依旧不需要密码即可登录
mysql -u root -p

# 设置root密码
-- 这里使用mysql_native_password插件认证
-- 不过从Mysql8.0.4开始,默认使用的是 caching_sha2_password 插件认证
-- 不过笔者在使用最新版的8.4.0时发现其默认已经不支持mysql_native_password了,所以这里需要替换为caching_sha2_password
-- 也可以在配置文件中开启`mysql-native-password=ON`
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword';
# 或者直接使用缺省的配置:caching_sha2_password
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

# 也可以加上远程登录的密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'newpassword';

# 刷新权限:
FLUSH PRIVILEGES;
# 退出MySQL
exit;

# 此时登录就要密码了
mysql -u root -p

# 查询用户密码
select user,host,authentication_string from mysql.user;