B.4.3.2 如何重置 root 密码

如果您从未为 MySQL 分配root密码,则服务器根本不需要使用密码root进行连接。但是,这是不安全的。有关分配密码的说明,请参阅第 2.10.4 节“保护初始 MySQL 帐户”

如果您知道root密码并想要更改它,请参阅第 13.7.1.1 节“ ALTER USER 语句”第 13.7.1.7 节“ SET PASSWORD 语句”

如果您之前分配了root密码但忘记了密码,则可以分配一个新密码。以下各节提供了适用于 Windows 和 Unix 及类 Unix 系统的说明,以及适用于任何系统的通用说明。

B.4.3.2.1 重置根密码:Windows 系统

在 Windows 上,使用以下过程重置 MySQL 'root'@'localhost'帐户的密码。要更改具有不同主机名部分的root帐户的密码,请修改说明以使用该主机名。

  • 以 Management 员身份登录到系统。

  • 如果 MySQL 服务器正在运行,请停止它。对于作为 Windows 服务运行的服务器,请转到服务 Management 器:从“开始”菜单中,依次选择“控制面板”,“Management 工具”和“服务”。在列 table 中找到 MySQL 服务并停止它。

如果服务器未作为服务运行,则可能需要使用任务 Management 器强制其停止。

  • 创建一个包含一行密码分配语句的文本文件。用您要使用的密码替换密码。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
  • 保存文件。本示例假定您将文件命名为C:\mysql-init.txt

  • 打开控制台窗口以转到命令提示符:从“开始”菜单中,选择“运行”,然后 Importing cmd 作为要运行的命令。

  • 使用设置为init_file的系统变量启动 MySQL 服务器以命名该文件(请注意,选项值中的反斜杠已加倍):

C:\> cd "C:\Program Files\MySQL\MySQL Server 5.7\bin"
C:\> mysqld --init-file=C:\\mysql-init.txt

如果您将 MySQL 安装到其他位置,请相应地调整 cd 命令。

服务器在启动时执行init_file系统变量命名的文件的内容,更改'root'@'localhost'帐户密码。

要使服务器输出显示在控制台窗口中而不是日志文件中,请将--console选项添加到mysqld命令中。

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

C:\> mysqld
         --defaults-file="C:\\ProgramData\\MySQL\\MySQL Server 5.7\\my.ini"
         --init-file=C:\\mysql-init.txt

可以使用服务 Management 器找到合适的--defaults-file设置:从“开始”菜单中,依次选择“控制面板”,“Management 工具”和“服务”。在列 table 中找到 MySQL 服务,右键单击它,然后选择Properties选项。 Path to executable字段包含--defaults-file设置。

  • 服务器成功启动后,删除C:\mysql-init.txt

现在,您应该可以使用新密码以root的身份连接到 MySQL 服务器。停止 MySQL 服务器并正常重启。如果将服务器作为服务运行,请从 Windows 服务窗口中启动它。如果手动启动服务器,请使用通常使用的任何命令。

如果ALTER USER语句未能重置密码,请尝试使用以下语句重复该过程以直接修改usertable:

UPDATE mysql.user
    SET authentication_string = PASSWORD('MyNewPass'), password_expired = 'N'
    WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
B.4.3.2.2 重置根密码:Unix 和类似 Unix 的系统

在 Unix 上,使用以下过程重置 MySQL 'root'@'localhost'帐户的密码。要更改具有不同主机名部分的root帐户的密码,请修改说明以使用该主机名。

这些说明假定您将从通常用于运行它的 Unix 登录帐户启动 MySQL 服务器。例如,如果使用mysql登录帐户运行服务器,则在使用说明之前,应以mysql身份登录。另外,您也可以使用root身份登录,但是在这种情况下,您必须*带有--user=mysql选项才能开始mysqld。如果不使用--user=mysql就以root的身份启动服务器,则服务器可能会在数据目录中创建root拥有的文件,例如日志文件,并且这些文件可能会导致与权限有关的问题,以备将来服务器启动时使用。如果发生这种情况,您将需要将文件的所有权更改为mysql或将其删除。

  • 以运行 MySQL 服务器的 Unix 用户(例如mysql)登录到系统。

  • 如果 MySQL 服务器正在运行,请停止它。找到包含服务器的进程 ID 的.pid文件。该文件的确切位置和名称取决于您的分发,主机名和配置。常见位置是/var/lib/mysql//var/run/mysqld//usr/local/mysql/data/。通常,文件名的 extensions 为.pid,以mysqld或系统的主机名开头。

通过向mysqld进程发送普通的kill(而不是kill -9)来停止 MySQL 服务器。在以下命令中使用.pid文件的实际路径名:

shell> kill `cat /mysql-data-directory/host_name.pid`

cat命令使用反引号(而不是正引号)。这些导致cat的输出被替换为kill命令。

  • 创建一个包含一行密码分配语句的文本文件。用您要使用的密码替换密码。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
  • 保存文件。本示例假定您将文件命名为/home/me/mysql-init。该文件包含密码,因此请勿将其保存在其他用户可以读取的位置。如果您不是以mysql身份登录(服务器以该用户身份运行),请确保该文件具有允许mysql读取的权限。

  • 使用设置为init_file的系统变量启动 MySQL 服务器以命名该文件:

shell> mysqld --init-file=/home/me/mysql-init &

服务器在启动时执行init_file系统变量命名的文件的内容,更改'root'@'localhost'帐户密码。

根据正常启动服务器的方式,可能还需要其他选项。例如,在init_file参数之前可能需要--defaults-file

  • 服务器成功启动后,删除/home/me/mysql-init

现在,您应该可以使用新密码以root的身份连接到 MySQL 服务器。停止服务器并正常重启。

如果ALTER USER语句未能重置密码,请尝试使用以下语句重复该过程以直接修改usertable:

UPDATE mysql.user
    SET authentication_string = PASSWORD('MyNewPass'), password_expired = 'N'
    WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
B.4.3.2.3 重置根密码:通用说明

前面的部分提供了专门针对 Windows 和 Unix 及类 Unix 系统的密码重置说明。另外,在任何平台上,您都可以使用mysqlClient 端重设密码(但是这种方法不太安全):

  • 如有必要,请停止 MySQL 服务器,然后使用--skip-grant-tables选项重新启动它。这使任何人都可以不使用密码并具有所有特权进行连接,并禁用诸如ALTER USERSET PASSWORD之类的帐户 Management 语句。因为这是不安全的,所以您可能需要结合使用--skip-grant-tables和启用skip_networking系统变量来防止远程 Client 端连接。

  • 使用mysqlClient 端连接到 MySQL 服务器;不需要密码,因为服务器是使用--skip-grant-tables启动的:

shell> mysql
  • mysqlClient 端中,告诉服务器重新加载授权 table,以便帐户 Management 语句起作用:
mysql> FLUSH PRIVILEGES;

然后更改'root'@'localhost'帐户密码。用您要使用的密码替换密码。要更改具有不同主机名部分的root帐户的密码,请修改说明以使用该主机名。

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

现在,您应该可以使用新密码以root的身份连接到 MySQL 服务器。停止服务器并正常重启它(不使用--skip-grant-tables选项,而无需启用skip_networking系统变量)。

如果ALTER USER语句未能重置密码,请尝试使用以下语句重复该过程以直接修改usertable:

UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPass')
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;