修改MySQL的root密码,在命令行下确实有好几种办法,具体用哪种,往往取决于你是否还记得旧密码,以及你用的MySQL版本。简单来说,如果你能正常登录,那改密码就是一句话的事;如果密码忘了,那就得走一套“曲线救国”的流程,让MySQL在启动时不检查权限,然后进去改。
我整理了六种在命令行下重设或修改MySQL root密码的方案,每种都有它的适用场景和一些需要注意的地方。
使用 mysqladmin
命令 (当旧密码已知时)
这是最直接,也最简单的一种方式,如果你还记得root的旧密码,那么用
mysqladmin来改是最省心的。
mysqladmin -u root -p'旧密码' password '新密码'
这里需要注意,
-p后面直接跟着旧密码,中间没有空格。如果你的旧密码里有特殊字符,最好用引号括起来。这种方式,说实话,我个人觉得是最“优雅”的,因为它不需要你进入MySQL客户端,一步到位。
使用 SQL ALTER USER
命令 (MySQL 5.7.6+ 及 8.0+ 推荐)
如果你已经能够以root或其他拥有足够权限的用户登录到MySQL客户端,那么使用SQL语句来修改密码是更通用也更推荐的做法,特别是对于新版本的MySQL。
登录MySQL客户端:
mysql -u root -p
输入旧密码后,在MySQL提示符下执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
这个命令是MySQL 5.7.6版本之后引入的,也是8.0版本推荐的修改用户密码的方式。它更符合SQL标准,也更清晰地表达了“修改用户”的意图。我个人偏爱这种,因为它语义明确,出错的概率小。
使用 SQL SET PASSWORD
命令 (MySQL 5.7.6 之前及兼容)
在
ALTER USER出现之前,或者在一些老旧的MySQL版本中,
SET PASSWORD是修改当前用户密码的常用方式。同样,你需要先登录MySQL客户端。
mysql -u root -p
在MySQL提示符下执行:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码');或者对于某些版本,也可以直接:
SET PASSWORD = PASSWORD('新密码');(这会修改当前登录用户的密码)。需要注意的是,
PASSWORD()函数在MySQL 8.0中已经被弃用,所以如果你用的是新版本,最好还是用
ALTER USER。我记得以前踩过这个坑,旧脚本在新版本上直接报错,当时就有点懵。
通过跳过权限验证表 (--skip-grant-tables
) 重置 (最常用应急方案)
这是当你彻底忘记root密码时的“救命稻草”。这个方法的核心思想是:让MySQL服务器启动时,不加载权限表,这样任何人都可以无密码登录,然后你就可以进去修改root密码了。
步骤:
sudo systemctl stop mysql # 或者 service mysql stop
(具体命令取决于你的操作系统和MySQL安装方式)
以跳过权限表模式启动MySQL:sudo mysqld_safe --skip-grant-tables & # 或 sudo mysqld --skip-grant-tables &
(注意
&让它在后台运行,或者直接用
systemctl启动,但需要修改配置文件) 如果你是systemd系统,更稳妥的办法是:
sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables" sudo systemctl restart mysql
(完成后记得
sudo systemctl unset-environment MYSQLD_OPTS并重启MySQL) 无密码登录MySQL:
mysql -u root刷新权限并修改密码: 登录后,首先要刷新权限,因为
--skip-grant-tables模式下,你可能会遇到一些操作受限的情况。
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
-- 或者对于旧版本
-- UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE User = 'root';
-- FLUSH PRIVILEGES;
退出MySQL客户端并正常重启MySQL服务:exit; sudo systemctl stop mysql sudo systemctl start mysql
这一整套流程,虽然看起来步骤多,但非常实用。我个人觉得,作为DBA或者开发者,掌握这个是基本功。
针对 MySQL 8.0+ 的特定重置流程 (结合 ALTER USER
和 --skip-grant-tables
)
MySQL 8.0 引入了
caching_sha2_password作为默认的认证插件,这导致一些旧的修改密码方式不再适用,或者需要额外的步骤。在通过
--skip-grant-tables进入后,修改密码的命令还是
ALTER USER,但需要确保用户使用的认证插件是兼容的。 流程与方案4类似,但在MySQL客户端内部修改密码时,需要注意:
FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码' PASSWORD EXPIRE NEVER; -- 如果需要强制指定认证插件,例如为了兼容旧客户端: -- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
PASSWORD EXPIRE NEVER是为了避免密码立即过期
