MySQL root密码忘记了。

26

我已经有一段时间没有使用PHP MySQL了,现在需要再次使用它。但问题是我忘记了MySQL控制台的密码,并且尝试登录到PHPMyAdmin时出现错误#1045。

在MySQL网站上,我看到了一篇文章,介绍如何重置root密码(http://dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html#resetting-permissions-windows)。

步骤如下:

create a mysql-init.txt file containing UPDATE mysql.user SET Password=PASSWORD('newpass') WHERE User='root';
FLUSH PRIVILEGES;

我将其保存为C:\me\mysql-init

然后在命令提示符中写了--

C:\wamp\bin\mysql\mysql5.5.8\bin\mysqld --init-file=C:\me\mysql-init.txt 

我尝试使用双反斜杠,但它仍然不起作用。MySQL控制台要求输入密码,但不接受新密码。我做错了什么?我有几个表,该怎么办?

提前感谢。


这个视频帮助我在一个生产服务器上更改密码。 - Prem
这个回答解决了你的问题吗?如何重置或更改MySQL root密码? - Jee Mok
确保您在命令提示符中以管理员身份运行。我不得不用""括起我的txt文件。 .\mysqld.exe --init-file="C:\MySQLDEV\my_init.txt" - Hein du Plessis
8个回答

39

以下是需要遵循的步骤:

  1. 使用以下命令查找MySQL配置文件:$ mysql --help | grep -A 1 "Default options"

图片描述

在Ubuntu 16上,文件位置通常为/etc/mysql/mysql.conf.d/mysqld.cnf

  1. 使用以下命令编辑配置文件:$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

  2. [mysqld]块下添加skip-grant-tables并保存更改。

图片描述

  1. 使用以下命令重启MySQL服务:sudo service mysql restart

  2. 检查MySQL服务状态:sudo service mysql status

图片描述

  1. 使用以下命令登录到mysql:$ mysql -u root

  2. 并更改root密码:

mysql> FLUSH PRIVILEGES;

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass';

  1. 通过删除skip-grant-tables行或使用#(井号)注释它来恢复MySQL配置文件更改。

  2. 最后重启MySQL服务,一切就准备好了。


1
救命的解决方案 :) - Sandeep Pandey
1
对于旧版本的MySQL,例如MySQL 5.5:密码更改为SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass'); - Paul Libbrecht
这应该被标记为答案。 - Fletchy

15

我在Adelave的回答中无法让mysqld工作。但是以下方法适用于我:

使用--skip-grant-tables选项停止并启动mysql。

service mysql.server stop
service mysql.server start --skip-grant-tables

然后连接到您的mysqld,不使用用户名/密码

mysql

然后在 mysql 命令行上更新密码

 mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root'; 
 mysql> FLUSH PRIVILEGES;
 mysql> \q

然后正常重启MySQL。

 service mysql.server restart

1
这适用于Mac OSX 10.9.1上的MySQL 5.6.16,它对我有效;-) - AndaluZ
2
start -skip-grant-tables 命令会抛出 ERROR! The server quit without updating PID file 错误。 - SexyBeast
错误 1064 (42000):您的 SQL 语法存在错误,请查看与您的 MySQL 服务器版本相对应的手册以获取正确的语法。在 Mysql 8 上发生。 - AaA

13
尝试使用--skip-grant-tables选项启动mysql
mysqld --skip-grant-tables
然后使用mysql命令行连接到您的mysqld,不需要用户名/密码。

shell> mysql

然后输入命令。
> mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass')
>        WHERE User='root'; mysql> FLUSH PRIVILEGES;

1
非常感谢您的回复。目前它可以工作了。现在我能够登录phpmyadmin并复制我想要保存的所有表格。谢谢你。但是,当我稍后重新打开wamp服务器时,它无法接受密码。我必须像之前一样经历相同的过程,如mysqld --skip-grant-tables。 - user1187405
我安装的mysql版本没有密码列,而是使用以下命令: update mysql.user set authentication_string=password('MyNewPass') where User = 'root'; - Joshua
无法将datadir设置为/var/lib/mysql/。 - Salim Djerbouh
1
如果你的SQL版本告诉你它不是“在('MyNewPass')附近使用正确的语法”: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass'; - François Breton
非常感谢您的回复。目前它正在运行。在这种情况下,请接受答案,这将帮助未来阅读此问题的其他人。 - Mawg says reinstate Monica

5

如果其他答案无法解决问题,您可以尝试卸载/重新安装mysql。在我的ubuntu服务器上这个方法有效:

$sudo apt-get purge mysql*
$sudo apt-get autoremove
$sudo apt-get autoclean

更新分发

$sudo apt-get dist-upgrade

重新安装

$sudo apt-get install mysql-server

3
使用Windows命令提示符可以更改密码。
  1. 按下windows+R,运行services.msc,停止MySQL服务,并通过右键单击复制MySQL属性的路径 --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini",稍后需要使用。
  2. 创建文本文件reset.txt,文本内容为ALTER USER 'root'@'localhost' IDENTIFIED BY 'Your New Password';,并保存在C驱动器中。 enter image description here
  3. 以管理员身份打开命令提示符,然后更改MySQL所安装的目录"C:\Program Files\MySQL\MySQL Server 8.0\bin"
  4. 输入命令mysqld --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --init-file=C:\\reset.txt

enter image description here


3

Mac OS Mojave

$ brew services stop mysql

$ pkill mysqld

// warning: deletes all tables
$ rm -rf /usr/local/var/mysql/

$ brew postinstall mysql

$ brew services restart mysql

$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'p4ssword';
Query OK, 0 rows affected (0.04 sec)

mysql> exit
Bye

然后您就可以回到开发的正常状态。

$ sudo mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.

我不喜欢在我的.env文件中看到root这个词,所以通常会在之后进行以下操作,比如创建一个名为www.hockeysticks.net的网站:

#
CREATE DATABASE hockeysticks;

CREATE USER 'hockeysticks'@'localhost' IDENTIFIED BY 'hockeysticks';
GRANT ALL PRIVILEGES ON hockeysticks.* TO 'hockeysticks'@'localhost';

那么你的本地开发 .env 文件很简单:

DB_DATABASE=hockeysticks
DB_USERNAME=hockeysticks
DB_PASSWORD=hockeysticks

注意:如果您需要保留数据库,请使用 skip-grant-tables 方法。该方法有三个难点:

  1. 确保MySQL已停止,以便您可以使用 skip-grant-tables 重新启动它

  2. 确保您的密码更新SQL语法与您的MySQL版本相匹配

  3. 确保您将查询的末尾附加到 FLUSH PRIVILEGES;


0

以下内容适用于MariaDB 10.6.11:

在shell中进行下一步mysql root登录而无需密码的操作:

mysqld_safe --skip-grant-tables &

MySQL根登录

mysql -u root

使用 MySQL 数据库。
use mysql;

为新密码创建身份验证字符串

SELECT PASSWORD('asdlfjasldfkjklasdkflasdjfla');

输出:*B1D04474F8D522B69410FC0E731B35ED22E94A3C
现在检查用户root的priv权限。
select priv from global_priv where user='root';

输出: {"access":549755813887,"plugin":"mysql_native_password","authentication_string":"*LEICHEI2THEIYUOCH3PEE5OOVU8UQU4B","auth_or":[{}],"version_id":100611,"password_last_changed":1677497088}

使用新生成的身份验证字符串更新用户root的权限

update global_priv set Priv='{"access":549755813887,"plugin":"mysql_native_password","authentication_string":"*B1D04474F8D522B69410FC0E731B35ED22E94A3C","auth_or":[{}],"version_id":100611,"password_last_changed":1677497088}' where user='root';

刷新权限

flush privileges;

-1

使用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)

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');**

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