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语句未能重置密码,请尝试使用以下语句重复该过程以直接修改user
table:
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语句未能重置密码,请尝试使用以下语句重复该过程以直接修改user
table:
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 USER和SET PASSWORD之类的帐户 Management 语句。因为这是不安全的,所以您可能需要结合使用--skip-grant-tables和启用skip_networking系统变量来防止远程 Client 端连接。
-
使用mysqlClient 端连接到 MySQL 服务器;不需要密码,因为服务器是使用--skip-grant-tables启动的:
shell> mysql
- 在
mysql
Client 端中,告诉服务器重新加载授权 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语句未能重置密码,请尝试使用以下语句重复该过程以直接修改user
table:
UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPass')
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;