如何找回我的MySQL用户名和密码?

189

我忘记了我的 MySQL 用户名和密码。如何找回它?

11个回答

203

停止MySQL进程。

使用--skip-grant-tables选项启动MySQL进程。

使用-u root选项启动MySQL控制台客户端。

列出所有用户;

SELECT * FROM mysql.user;

重置密码;

UPDATE mysql.user SET Password=PASSWORD('[password]') WHERE User='[username]';

不要忘记在完成操作后:

停止MySQL进程

正常启动MySQL进程(即不使用--skip-grant-tables选项)

否则,你的数据库安全可能会受到威胁。


8
更新普通用户密码后,无需重启守护进程即可重置用户。只需执行"FLUSH PRIVILEGES;"命令即可。而--skip-grant-tables选项仅适用于root用户密码重置!这通常不建议用于标准用户的重置。 - Amos Folarin
使用“dpkg-reconfigure mysql-server-5.5”命令重置root MySQL密码的意义是什么? - phillipsK
25
在MySQL 5.7.*中,mysql.user表中没有名为password的列,请使用authentication_string代替。 - Adib Aroui
3
我发现这篇文章(https://dev59.com/5nI-5IYBdhLWcg3wta_w#35277160)非常有帮助。 - Alien Life Form
1
PASSWORD()函数在5.7.5版本之后已被弃用。请参见https://dev59.com/ElQK5IYBdhLWcg3wKc_k。 - Leland Hepworth
显示剩余3条评论

48

很抱歉,您的用户密码无法找回。它已经通过单向哈希进行了哈希处理,如果您不知道这是什么,那么这是不可逆转的。我建议跟随上面的Xenph Yan的建议,只需创建一个新的密码。

您还可以使用来自手册的以下程序来重置 Windows 上任何 MySQL root 帐户的密码:

  1. 以管理员身份登录系统。
  2. 停止运行中的 MySQL 服务器。对于作为 Windows 服务运行的服务器,请前往服务管理器:

开始菜单 -> 控制面板 -> 管理工具 -> 服务

然后在列表中找到 MySQL 服务并将其停止。如果您的服务器没有作为服务运行,则可能需要使用任务管理器强制停止它。

  1. 创建一个文本文件,并将以下语句放入其中。将密码替换为要使用的密码。

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

    UPDATEFLUSH语句必须写在单独的一行上。 UPDATE语句将重置所有现有root账户的密码,FLUSH语句告诉服务器重新加载授权表到内存中。

  2. 保存文件。例如,文件名为C:\mysql-init.txt.
  3. 打开控制台窗口以进入命令提示符:

    开始菜单->运行->cmd

  4. 使用特殊的--init-file选项启动MySQL服务器:

    C:\> C:\mysql\bin\mysqld-nt --init-file = C:\mysql-init.txt
    

    如果你将MySQL安装到除了C:\mysql之外的其他位置,请相应调整命令。

    服务器会在启动时执行由--init-file选项指定的文件的内容,并更改每个root账户密码。

    如果你想要服务器输出显示在控制台窗口而不是日志文件中,你还可以在命令中添加--console选项。

    如果你使用MySQL安装向导安装MySQL,则可能需要指定--defaults-file选项:

    C:\> "C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld-nt.exe" --defaults-file="C:\Program Files\MySQL\MySQL Server 5.0\my.ini" --init-file=C:\mysql-init.txt
    

    可以在服务管理器中找到适当的 --defaults-file 设置:

    开始菜单 -> 控制面板 -> 管理工具 -> 服务

    在列表中找到 MySQL 服务,右键单击它,选择“属性”选项。可执行文件路径字段包含 --defaults-file 设置。

  5. 服务器成功启动后,请删除 C:\mysql-init.txt
  6. 停止 MySQL 服务器,然后再次以正常模式重新启动它。如果您将该服务器作为服务运行,请从Windows服务窗口启动它。如果您手动启动服务器,请使用您通常使用的任何命令。

现在,您应该能够使用新密码作为 root 连接到 MySQL。


6
感谢你的回答,Jake。我想给你点个赞,但由于声望积分的原因,stackoverflow不允许我这样做。你的解释“不幸的是,你的用户密码无法恢复。它已经使用单向哈希进行了散列,如果你不知道的话,这是不可逆转的。” 是我理解为什么所有其他我在谷歌上阅读的内容只给了我更改密码的指示的关键。好的解释比单纯的指示更有洞察力。 - dsdsdsdsd
1
@jake 我在服务列表中找不到 mysql,请告诉我该怎么做? - user2098012
1
为什么你的是mysqld-nt而不是mysqld - Pacerier
顺便问一下,是否有--init-file的非文件选项?(类似于mysql.exe的--execute命令。) - Pacerier

35

对这里最有用的答案进行了改进:

1] 无需重新启动mysql服务器
2] MySQL服务器连接到网络时存在安全问题

无需重新启动MySQL服务器。

更新mysql.user语句以更改密码后,使用FLUSH PRIVILEGES;

FLUSH语句告诉服务器将授权表重新加载到内存中,以便它注意到密码更改。

--skip-grant-options使任何人都可以连接而无需密码且具有所有权限。由于这是不安全的,您可能需要

--skip-grant-tables--skip-networking一起使用,以防止远程客户端连接。

来自:参考:resetting-permissions-generic


1
@ThinkingMonkey,这是否假设当前登录用户具有修改mysql.user的特权?然而,通常情况下并非如此。 - Pacerier

9

无需停机,轻松搞定

在终端中运行以下命令连接到DBMS(需要root访问权限):

sudo mysql -u root -p;

运行更新目标用户的密码(例如我的用户名是 mousavi,密码必须是 123456):
UPDATE mysql.user SET authentication_string=PASSWORD('123456') WHERE user='mousavi';  

在此时,您需要执行刷新操作以应用更改:

FLUSH PRIVILEGES;

完成了!您没有停止或重新启动mysql服务就完成了它。


6

虽然在没有暴力破解的情况下,无法直接恢复MySQL密码,但还有另一种方法-如果您使用MySQL Workbench连接到数据库,并将凭据保存到“保险库”中,则可以轻松解决问题。

在Windows上,凭证存储在%APPDATA%\MySQL\Workbench\workbench_user_data.dat中-使用CryptProtectData(没有任何额外的熵)进行加密。 解密非常容易:

std::vector<unsigned char> decrypt(BYTE *input, size_t length) {
    DATA_BLOB inblob { length, input };
    DATA_BLOB outblob;

    if (!CryptUnprotectData(&inblob, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &outblob)) {
            throw std::runtime_error("Couldn't decrypt");
    }

    std::vector<unsigned char> output(length);
    memcpy(&output[0], outblob.pbData, outblob.cbData);

    return output;
}

您可以查看此DonationCoder帖子,获取一个快速粗糙实现的源代码和可执行文件。

2
这很完美。在snemarch提到的线程上有一个可执行文件和源代码,可以检索存储在MySQL Workbench保险库中的用户帐户密码。如果我有读取或更新用户表的权限,那么这些其他方法也可能有效。 - RobbZ
但相对而言,使用Workbench的人非常少。 - Pacerier
这是另一种实现方式,可以在使用Visual Studio构建后运行,以恢复Workbench存储的用户名和密码信息:https://github.com/wclear/MySQLWorkbenchPasswordViewer - bnp887

5

从Windows cmd使用现有用户登录MySql:

mysql -u 用户名 -p
输入密码:****

然后运行以下命令:

mysql> SELECT * FROM mysql.user;

接下来,复制相应用户的加密MD5密码,网络上有几个在线密码解密应用程序。使用此解密密码,并在下次登录时使用它进行登录。 或使用以下命令更新用户密码:

mysql> UPDATE mysql.user SET Password=PASSWORD('[password]') WHERE User='[username]';

然后使用新密码和用户名登录。


5
如果您拥有MySQL运行的服务器上的root访问权限,您应该使用以下命令停止MySQL服务器。
sudo service mysql stop

现在使用以下命令启动mysql。
sudo /usr/sbin/mysqld --skip-grant-tables  --skip-networking &

现在您可以使用以下方式登录到mysql:

sudo mysql
FLUSH PRIVILEGES;
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');

完整的说明可以在这里找到 http://www.techmatterz.com/recover-mysql-root-password/

如果您需要恢复MySQL根密码,请按照上述说明进行。该指南提供了详细的步骤,并且非常易于遵循。


1

在MySQL 5.7.6和MariaDB 10.1.20之后(截至2022年),您可以:

更新具有root用户访问权限的mysql用户密码

ALTER USER 'some_user_name'@'localhost' IDENTIFIED BY 'a_super_secure_password';

更新Mysql的root用户

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'mynewpassword';

列出所有用户。
select user from mysql.user;

0

保存文件。在本例中,文件将被命名为C:\mysql-init.txt。 保存文件时需要管理员权限。


0
如果您已经设置了ODBC,您可以从ODBC配置文件中获取密码。对于Linux,这在/etc/odbc.ini中,在Windows注册表中的Software/ODBC文件夹中有几个位置(可能需要一些搜索)。

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