如何在MySQL 8.0.11中重置root密码?

93

我忘记了 MySQL 的 root 密码,需要进行更改。按照以下步骤:

  • 第1步:停止 MySQL 服务器进程。

    第2步:使用 --skip-grant-tables 选项启动 MySQL (mysqld) 服务器/守护进程,以避免提示输入密码。

    第3步:以 root 用户身份连接到 MySQL 服务器。

具体步骤可以在以下网站找到:https://www.howtoforge.com/setting-changing-resetting-mysql-root-passwords#recover-mysql-root-password

mysql> use mysql;
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD("TOOR");
mysql> flush privileges;
mysql> quit

首先出现错误,所以我尝试了:

mysql> use mysql;
mysql> update user set password=PASSWORD("TOOR") where User='root';
mysql> flush privileges;
mysql> quit

总是出现同样的错误消息:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '("TOO
R") WHERE User='root'' at line 1

我该如何解决这个问题?


看起来关键字TOOR有问题,但我找不到你在哪里使用它。你能给我们展示一下你实际运行的SQL吗? - halfer
第一个错误是什么? - CodeCaster
我按照视频中的步骤在我的一个服务器上更改了密码。https://youtu.be/gFo5DV_pSg8 - Prem
8个回答

183

正如这里所说:

该函数已在MySQL 8.0.11中删除。

1. 如果您在skip-grant-tables模式下,在mysqld_safe中:

UPDATE mysql.user SET authentication_string=null WHERE User='root';
FLUSH PRIVILEGES;
exit;

然后,在终端中输入:

mysql -u root

在 MySQL 中:

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';

2. 不在跳过授权表模式中
仅在 MySQL 中:

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';

2
在SKIP-GRANT-TABLES模式下 - sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables。适用于8.0.1版本。 - Piash Sarker
1
我遇到了 ERROR 1146 (42S02): Table 'mysql.role_edges' doesn't exist 的问题,所以在将根密码设置为空后,我不得不执行 mysql_upgrade -u root 才能使其正常工作。 - Gregory R. Sudderth
10
为了使这项工作正常运行,我不得不使用 mysql_native_password 而不是 caching_sha2_password。执行以下操作:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpasswd';。尽管不确定原因。 - dvlcube
1
我在命令的顺序上遇到了麻烦,但在Ubuntu 20中对我有用:sudo service mysql stop``sudo mysqld_safe --skip-grant-tables&,然后使用mysql -u root打开mysql控制台UPDATE mysql.user SET authentication_string=null WHERE User='root'; flush_privileges; ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd'; exit; ps -fea | grep mysqld sudo kill -9 [pid from previous command] 最后sudo service mysql stop - Ulises Layera
@Jack Chern,你真是个了不起的人,我花了一整天的时间解决这个问题,读了很多文章,重启了服务器也没有结果。非常感谢你。 - umutyerebakmaz
显示剩余3条评论

75

使用sudo登录mysql

sudo mysql

那么

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
exit;

测试一下

mysql -u root -p

太棒了!这个方法完美地起作用了!谢谢你,而且我不需要刷新或重启。 - Ugur Kazdal
1
请注意,使用此密码算法会导致 Java 应用程序出现错误“不允许公钥检索”。最好使用老式的本地密码算法ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; 否则您可能需要强制更改应用程序设置。 - Kevin Guanche Darias
节省了我很多时间! - showtime
这应该是被接受的答案。 - Thanh Nguyen
1
sudo mysql在我的情况下没有解决任何问题:ERROR 1045 (28000):拒绝访问用户'root'@'localhost'(使用密码:NO) - Sxilderik
显示剩余6条评论

17

试试这个:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newPasswd';

2
在添加skip-grant-tables之前,此语句不可用,添加后用户会收到以下错误信息:ERROR 1290 (HY000):MySQL服务器正在使用--skip-grant-tables选项运行,因此无法执行此语句。 - richardwhitney

6
如果您使用的是Windows系统,可以尝试以下步骤:

重置Windows中MySQL 8.0的root密码

  1. 停止MySQL 8.0服务
  2. 前往路径C:\Program Files\MySQL\MySQL Server 8.0\bin并打开cmd
  3. 运行mysqld --console --skip-grant-tables --shared-memory
  4. 在同一路径下打开新的cmd
  5. 运行以下命令
  6. mysql -u root
  7. select authentication_string,host from mysql.user where user='root';
  8. UPDATE mysql.user SET authentication_string='' WHERE user='root';
  9. 现在关闭两个cmd
  10. 尝试启动MySQL 8.0服务。
  11. 使用用户名为root和空白密码连接。
  12. 从用户管理中更改密码。
https://gist.github.com/pishangujeniya/0f839d11a7e692dadc49821c274a2394上找到了这个。

1

步骤1:在您的根目录(例如C:)中创建一个新文件 步骤2:编写此ALTER USER 'root'@'localhost' IDENTIFIED BY 'abc'并保存 步骤3:如果您的Mysql服务已经运行,请停止它并打开CMD 步骤4:转到您的Mysql安装目录(例如C:\ Program Files \ MySQL \ MySQL Server 8.0 \ bin)并键入此命令

mysql --init-file=C:/init.sql

步骤5:执行此命令,您就可以开始了 :)

查看此视频以获取更多说明:https://www.youtube.com/watch?v=LsdV-7dFOhk


1
我正在使用8.0.23,但遇到了多个问题。以下是这些问题及解决方案。我按照mysql文档进行重置,尽管遇到了一些问题。我提供了我的解决方案和一个示例重置脚本。
问题
  1. 按照其他人概述的步骤会有各种失败
  2. 运行守护程序的用户是mysql,我无法切换到mysql id
  3. 出现错误can't create lock file /var/run/mysqld/mysqlx.sock.lock,mysqld文件夹被mysql服务删除。
  4. 运行后必须使用kill -9 mysql进程,非常丑陋
解决方案
  1. 使用https://dev.mysql.com/doc/refman/8.0/en/resetting-permissions.html中的步骤
  2. 在运行mysql命令时使用--user=mysql
  3. 在运行命令之前创建/var/run/mysqld文件夹并将其chown为mysql:mysql
  4. 在启动sql以进行重置后使用mysqladmin shutdown来停止sql
在脚本中,我将root重置为New%Password
# create password reset file
cat << EOF >/tmp/deleteme
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'New%Password';
EOF
# create /var/run/mysqld
mkdir /var/run/mysqld
chown mysql:mysql /var/run/mysqld
# start mysqld and run the command
mysqld --init-file=/tmp/deleteme --user=mysql &
# wait for sql to start
while [ ! -f /var/run/mysqld/mysqlx.sock.lock ]; do sleep 1; done
sleep 3
# stop sql
mysqladmin -u root -pNew%Password shutdown
while [ -f /var/run/mysqld/mysqlx.sock.lock ]; do sleep 1; done
#clean up temp file
rm /tmp/deleteme

0
这个答案适用于mysql Ver 8.0.34-0在ubuntu 22.04上。
  mysql --version
  sudo /etc/init.d/mysql stop
  sudo mkdir /var/run/mysqld
  sudo chown mysql /var/run/mysqld/
  sudo mysqld_safe  --skip-grant-tables&

你需要在跳过授权表命令显示几行后输入。
  sudo mysql --user=root mysql
  mysql>exit
  mysql -u root -p

-7

使用SQLYog,您可以执行命令

  • 用户创建

    CREATE USER 'tester'@'localhost' IDENTIFIED BY 'Pass123#d'
    
  • 授权

    GRANT ALL PRIVILEGES ON sakila.* TO 'tester'@'localhost'
    
  • 在MySQL 8.0中更改密码

    ALTER USER 'tester'@'localhost' IDENTIFIED BY 'Pass123#d';
    

    或者如果您知道authentication_string,可以直接将其设置为更新

    UPDATE mysql.user 
    SET authentication_string='*F9B62579F38BE95639ACB009D79427F2D617158F'  
    WHERE USER='root'
    
  • 在mysql的低版本中更改密码

    GRANT USAGE ON *.\* TO 'tester'@'localhost' IDENTIFIED BY 'Pass123#d'
    SET PASSWORD FOR 'tester'@'localhost' = PASSWORD('Pass123#d');
    

3
可以再解释清楚一点吗?"SQLYog"是什么?如果无法使用root登录,这一切如何运作? - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接