MySQL root密码更改

188
我一直在尝试重置我的MySQL root密码。我运行了mysqld_safe --skip-grant-tables,更新了root密码,并检查了用户表以确保密码已更改。
在重新启动MySQL守护进程后,我尝试使用刚设置的新root密码登录,但仍然收到用户'root'的访问被拒绝错误。我还尝试完全删除并重新安装MySQL(包括删除my.cnf文件),但仍然没有成功。接下来我该怎么办?

2
请发布您的实际错误。 - Vishwanath Dalvi
26
如果你没有被锁定,SET PASSWORD FOR 'root'@'localhost' = PASSWORD('somepassword'); 是最安全的方法。 - sabgenton
我按照视频中的步骤在我的一台服务器上更改了密码。https://youtu.be/gFo5DV_pSg8 - Prem
1
可能是重复的问题:ERROR 1698 (28000): Access denied for user 'root'@'localhost' - SanThee
4
服务器版本:8.0.20-0ubuntu0.20.04.1(Ubuntu)错误1064(42000):您的SQL语法有误;请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方式,在第1行附近输入'PASSWORD("1")'为 'root'@'localhost' 设置密码为 "somepassword":SET PASSWORD FOR 'root'@'localhost' = PASSWORD("somepassword"); - discipleartem
2
Ubuntu 20.04的root用户认证插件为auth_socket。该插件不支持密码。下面有一个解决方案。解决方案是在一条语句中更改插件和密码:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Password'; "WITH mysql_native_password"部分更改了插件。 - cbmckay
32个回答

240
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('mypass');
FLUSH PRIVILEGES;

10
在5.7版本中,这个方法对我有效,而被接受的答案则无效。 - Stoopkid
6
如果你的MySQL root密码为空,则这是正确的解决方案。 - fschuindt
7
在MySQL 5.7.x版本中,mysql表中已经没有密码字段了,它被authentication_string所取代。将用户root的authentication_string字段更新为MyNewPass密码,请运行以下代码:
UPDATE mysql.user SET authentication_string=PASSWORD('MyNewPass') WHERE user='root'; FLUSH PRIVILEGES;
- Robert Anthony S. Tribiana
3
这对我来说没问题,但实际上不要做任何事情。 - Freedo
2
需要使用额外的命令 FLUSH PRIVILEGES 来使更改生效,无需重新启动数据库服务器。 - NetVicious
显示剩余7条评论

116
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

你可以在MySQL文档中找到 重置Root密码


3
这个查询对我有用,但新密码无法使用(访问被拒绝)。只有在我重新创建root用户后才开始工作 https://askubuntu.com/a/784347/160368。 - Artem P
1
在MySQL 8.0.20上,只需使用以下命令初始化数据文件夹 mysqld --initialize --console 即可正常工作。 - Ahmed HENTETI
1
这个返回"OK",而UPDATE mysql.user SET authentication_string=PASSWORD('mypass') WHERE User='root';SET PASSWORD FOR 'root'@'localhost' = PASSWORD('mypass');在8.0.33-0ubuntu0.22.04.2上返回"ERROR 1064 (42000): You have an error in your SQL syntax;"。 - philburns

84

请查阅MySQL参考手册中的以下内容:

首先登录MySQL:

mysql -u root -p

然后在mysql提示符下运行:

UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';

然后

FLUSH PRIVILEGES;

点击此页面查看更多信息:重置Root密码:Unix系统

更新:

对于某些版本的mysql,密码列不再可用,您将收到以下错误消息:

ERROR 1054 (42S22):'field list'中不存在'Password'列

在这种情况下,请使用ALTER USER,示例如下答案


1
当我更新用户密码时,出现了一个错误:“您正在使用安全更新模式,并尝试更新一个没有使用关键列的WHERE的表...”,请参阅https://dev59.com/N2gu5IYBdhLWcg3wRlFh以了解如何解决此错误。 - Joe Borysko
25
错误1064(42000):您的SQL语法有误;请查看与您的MySQL服务器版本相对应的手册以了解在第1行附近使用正确的语法,其中包括'('MyNewPass')WHERE User ='root''。 - discipleartem
4
PASSWORD函数似乎已被移除。请查看此线程以获取替代方案 https://dev59.com/ElQK5IYBdhLWcg3wKc_k - Krapow

38
请按照以下步骤操作:
  1. sudo service mysql stop
  2. sudo mysqld_safe --skip-grant-tables
  3. sudo service mysql start
  4. sudo mysql -u root
  5. use mysql;
  6. show tables;
  7. describe user;
  8. update user set authentication_string=password('1111') where user='root';
  9. FLUSH PRIVILEGES;

使用密码 "1111" 登录。


5
flush privileges 是最后一步非常重要的操作。 - Khom Nazid
这真是让人抓狂。我按照所有的教程重置了密码,一切都正常,除了当我用新密码登录时,它不起作用。 - Shidomaru NeveRage
1
如果mysqld无法启动并出现以下消息: mysqld daemon with databases from /var/lib/mysql mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended请执行以下操作: mkdir /var/run/mysqld chomod 777 /var/run/mysqld 然后从头开始启动所有内容。 - jokermt235
3
第二步 - 我建议使用:sudo mysqld_safe --skip-grant-tables --skip-networking &。重要的是要以 & 结尾来使命令在后台运行。传递 --skip-networking 选项以跳过网络连接,这可以防止其他客户端连接到MySQL服务器。来源 - MaxiGui
chmod 777 = “设置权限,使得(U)用户/所有者可以读取、写入和执行。(G)组可以读取、写入和执行。(O)其他人可以读取、写入和执行。”那么这样安全吗? - Peter Mortensen
简洁明了是好的,但你能详细解释一下吗?例如,为什么前三个步骤是必需的?如果不遵循这些步骤会发生什么?步骤6和7不仅仅是信息性的(哪一个?),而且真的是必需的吗?请通过编辑(更改)您的答案来回复,而不是在评论中回复(不要包含“Edit:”、“Update:”或类似的内容 - 答案应该看起来像今天写的)。 - Peter Mortensen

32

这是针对WAMP v3.0.6及以上版本的更新答案。

在MySQL命令行客户端、phpMyAdmin或任何MySQL图形用户界面中:

UPDATE mysql.user
SET authentication_string=PASSWORD('MyNewPass')
WHERE user='root';

FLUSH PRIVILEGES;

在MySQL 5.7.x版本中,MySQL表中不再有密码字段。它已被替换为authentication_string。(这是针对终端/CLI的。)

在MySQL命令行客户端、phpMyAdmin或任何MySQL GUI中:

UPDATE mysql.user SET authentication_string=PASSWORD('MyNewPass') WHERE user='root';

FLUSH PRIVILEGES;

这个答案是为数不多的几个之一,建议更新 mysql.user 数据表。请注意,如果您正在使用其他数据库(通过 use 命令设置),您将收到一个错误提示说数据表 user不存在。谢谢您,先生! - Aleksandar
1
适用于我。我正在使用5.7.x版本,没有mysql.user表。其他答案已经过时。 - Siwei
很高兴能帮忙! - Robert Anthony S. Tribiana
7
在MySQL 8.0+版本中,函数PASSWORD已经不存在。请参见https://dev59.com/ElQK5IYBdhLWcg3wKc_k 。因此,您可以使用CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass')))))替代PASSWORD('mypass'),这个新函数的作用与旧的PASSWORD函数相同。 - FlameStorm
2
@FlameStorm 这拯救了我们的一天。我认为你应该写一个答案。 - kayochin
显示剩余3条评论

31

我也进行了搜索,可能有些答案适用于某些情况,

我的情况是在Ubuntu 18.04.2 LTS系统上使用Mysql 5.7:

(获取root权限)

$ sudo bash

(为根数据库用户设置密码 + 分步实施安全措施)

# mysql_secure_installation

通过密码而不是套接字为root用户提供访问权限

(+编辑:显然你需要再次设置密码?)

(不要将其设置为'mySecretPassword'!!!)

# mysql -u root

mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> set password for 'root'@'localhost' = PASSWORD('mySecretPassword'); 
mysql> FLUSH PRIVILEGES;
mysql> exit;

# service mysql restart

感谢zetacu(和erich)在搜寻几个小时之后提供这个精彩的回答

祝使用愉快 :-D

S.

编辑(2020):

这种方法不再有效,请参考此问题以供参考...


1
到目前为止,这是最好的答案,至少适用于mysql服务器5.7。 - Zoltán Hajdú
1
最佳答案。谢谢。 - Luciano Fantuzzi
3
在新安装后,mysql_secure_installation 对我很有效。 - Troy

23

我找到问题所在了!当我更改密码时,我忘记了对其进行哈希处理。我使用以下查询语句解决了这个问题:

update user set password=PASSWORD('新密码') where user='root';

我忘记了PASSWORD('新密码')并只是将新密码以明文形式放入其中。


请确保您回来并接受您的答案,以便其他人可以看到解决方案。 - ghostJago
1
如果您被锁定,http://dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html 显示了如何使用 --init-file= 来执行此操作。 - sabgenton
4
为什么我使用相同的命令时,会返回以下错误?Error 1054 (42S22):在“字段列表”中未知列“Password”。 - Adrian M.
5
您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法,位于第1行,附近是'(‘新密码’)where user='root''。 - discipleartem
1
我也遇到了这个错误。语法错误。请添加解决方案。 - indianwebdevil
在哪里运行这个查询? 即使对于mysql -v,我也无法得到任何结果。 - ahmednawazbutt

23

在MySQL 8中,您需要指定密码哈希方法:

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'new-password';

1
这是唯一对我有效的。 - code2be
别忘了也执行FLUSH PRIVILEGES命令。这个命令适用于MySQL使用新的密码哈希算法(我记得这是在MySQL 8.0中引入的,安装时不是强制要求的,只是建议执行)。 - Yvan

21

在MySQL 8.0.4+版本中:

要更新当前的根用户:

select current_user();
set password = 'new_password';

更新另一个用户:

set password for 'otherUser'@'localhost' = 'new_password';

在更新密码之前设置密码策略:

set global validate_password.policy = 0;
set password = 'new_password';
set password for 'otherUser'@'localhost' = 'new_password';

更新 root 密码的另一种 / 更好的方法:

mysql_secure_installation

你想继续使用5.x身份验证,以便仍然可以使用旧应用程序吗?

my.cnf文件中。

default_authentication_plugin = mysql_native_password

更新root

set global validate_password.policy = 0;
alter user 'root'@'localhost' identified with mysql_native_password by 'new_password';

12

1
错误 1064 (42000):您的 SQL 语法有误;请检查与您的 MySQL 服务器版本相对应的手册,以获取在第 1 行使用 'IDENTIFIED BY 'MyNewPass'' 的正确语法。 - trainoasis
刚刚通过CLI粘贴了完全相同的SQL代码 :o - trainoasis
当然,通过ssh连接到我的服务器并输入mysql -u root -p命令以进入mysql cli。 - trainoasis

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