从 .zip 安装 MySQL for Windows 并重置 root 密码

ret*_*tif 8 mysql windows password-recovery mysql-5.7

我只想在我的 PC(使用 Windows 8.1 x64)上安装 MySQL 服务器,没有 Workbench 或其他东西。所以我.zipdev.mysql.com/downloads下载了存档。这是 x86_64 版本 5.7.9 (MySQL Community Server (GPL)) 上的 Win64 下载。

我将它安装为 Windows 服务,但没有mysql数据库,只有information_schema. 所以我执行了这个:

mysql_upgrade.exe --upgrade-system-tables
Run Code Online (Sandbox Code Playgroud)

mysql创建了数据库。但是随之而来的是root用户发生了一些事情,因为我无法再访问mysql了。

所以我决定重置这个突然出现的密码(因为我之前没有它)。我在官方手册中建立了以下解决方案,我是这样启动服务器的:

mysqld.exe --skip-grant-tables --console
Run Code Online (Sandbox Code Playgroud)

然后我mysql没有密码打开:

mysql.exe –u root
Run Code Online (Sandbox Code Playgroud)

然后尝试重置root密码:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD(‘passhere');
Run Code Online (Sandbox Code Playgroud)

但我收到了这个错误:

错误 1131 (42000):您以匿名用户身份使用 MySQL,不允许匿名用户更改密码”。

这是什么?我怎么匿名了?所有命令都在cmd.exe管理员下执行。

在这种情况下,我应该怎么做才能重置 root 密码?

更新 1:我试图检查当前用户:

SELECT USER(), CURRENT_USER();
Run Code Online (Sandbox Code Playgroud)

这给出了:

+--------+----------------+
| USER() | CURRENT_USER() |
+--------+----------------+
| root@  | @              |
+--------+----------------+
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我是这样开始的mysql.exe -u root

然后我检查了用户表:

SELECT user FROM mysql.user;
Run Code Online (Sandbox Code Playgroud)

这给出了:

+-----------+
| user      |
+-----------+
| mysql.sys |
+-----------+
Run Code Online (Sandbox Code Playgroud)

这就更奇怪了。也没有密码字段:

SELECT user, password FROM mysql.user;
Run Code Online (Sandbox Code Playgroud)

错误 1054 (42S22):“字段列表”中的“密码”列未知

所以我不能更改它的密码。

而且我无法创建新用户:

CREATE USER 'root'@'localhost' IDENTIFIED BY 'passhere';
Run Code Online (Sandbox Code Playgroud)

ERROR 1290 (HY000): MySQL 服务器正在使用该--skip-grant-tables选项运行,因此无法执行此语句

现在我迷路了。

更新 2:我想,我从一开始就做错了一切。显然,我mysqld.exe --initialize以某种方式错过了一个命令。

所以,这就是我从 .zip-archive 安装 MySQL 的方式,感谢@RolandoMySQLDBA

  1. 解压存档,准备my.ini.
  2. 执行mysqld.exe --initialize,从.err文件中获取临时密码。
  3. 将 MySQL 安装为服务并运行它

    mysqld --install MySQL --defaults-file="d:/path/to/mysql/my.ini"
    
    Run Code Online (Sandbox Code Playgroud)
  4. mysql -u root -p使用临时密码连接到它。

  5. 更改临时密码:

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'NEWPASSWORD';
    
    Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 7

既然你开始mysqld--skip-赠款表,你不能执行任何标准的GRANTREVOKESET PASSWORD命令。尽管如此,您可以root@localhost按如下方式更改密码:

UPDATE mysql.user SET password=PASSWORD(‘passhere') WHERE user='root' and host='localhost';
Run Code Online (Sandbox Code Playgroud)

然后,重新启动 mysqld,您就可以重新开始工作了。

至于你是匿名的,如果你现在登录并运行

SELECT USER() HowYouAttemptedToLogin,CURRENT_USER() HowYouWereAllowedToLogin;
Run Code Online (Sandbox Code Playgroud)

您会注意到HowYouWereAllowedToLogin将有一个空白的用户名和一些主机。

试一试 !!!

更新 2015-11-17 16:24 美国东部时间

MySQL 5.7 中不再存在称为passwordin的列mysql.user

它被重命名authentication_string

正确的方法

你应该做的是运行

mysqld --initialize
Run Code Online (Sandbox Code Playgroud)

这将为您创建数据文件夹。

root@localhost 被分配了一个临时密码,该密码在以以下日期时间和字符串开头的错误文件中可见

2015-11-17T20:56:02.175980Z 1 [Note] A temporary password is generated for root@localhost:
Run Code Online (Sandbox Code Playgroud)

你可以用它登录然后运行 ALTER USER

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
Run Code Online (Sandbox Code Playgroud)

请参阅有关SET PASSWORD的 MySQL 5.7 文档