在 CentOS 系统中管理 MySQL 或其分支 MariaDB 时,忘记 root 密码是一个常见但棘手的问题,许多管理员的第一反应是“查看”密码,但出于安全考虑,MySQL 数据库并不会以明文形式存储用户密码,而是存储其哈希值,直接“查看”原始密码在技术上是不可能的,正确的做法是遵循一套标准的流程来重置密码,本文将详细介绍在 CentOS 环境下,针对不同情况重置 MySQL/MariaDB root 密码的完整步骤,并提供相关的安全建议。

首次安装后的临时密码
对于较新版本的 MySQL(如 5.7 及以上)或 MariaDB,在首次安装并启动服务后,系统会为 root 用户生成一个临时的、随机的密码,这个密码会被记录在日志文件中,这是唯一能“看到”密码的场景。
查找临时密码
您需要登录到 CentOS 服务器,并使用 grep 命令在 MySQL 的错误日志中搜索包含“temporary password”的行。
sudo grep 'temporary password' /var/log/mysqld.log
对于 MariaDB,日志文件路径可能略有不同:
sudo grep 'temporary password' /var/log/mariadb/mariadb.log
执行命令后,系统会返回类似以下的输出,其中最后一部分就是您的临时密码:
2025-10-27T10:30:15.123456Z 1 [Note] A temporary password is generated for root@localhost: >kE!tR>a;8fG
使用临时密码并修改
获取到临时密码后,您可以使用它来首次登录数据库,登录后,系统会要求您立即修改为一个新密码。
mysql -u root -p
系统提示输入密码时,粘贴您刚刚找到的临时密码,成功登录后,执行以下 SQL 命令来修改密码(请将 'YourNewStrongPassword' 替换为您的新密码,新密码需要符合密码策略要求,如包含大小写字母、数字和特殊符号):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword'; EXIT;
忘记现有 root 密码的重置方法
如果您已经设置了密码但忘记了它,那么唯一的途径就是通过重置流程,这个过程的核心是绕过 MySQL 的权限验证机制,在不提供密码的情况下登录并修改密码。
步骤 1:停止 MySQL/MariaDB 服务
您需要停止正在运行的数据库服务,使用 systemctl 命令可以轻松完成此操作。
对于 MySQL:

sudo systemctl stop mysqld
对于 MariaDB:
sudo systemctl stop mariadb
步骤 2:以“跳过授权表”模式启动服务
以“安全模式”或“跳过授权表”模式重新启动数据库,这个模式会跳过所有权限检查,允许任何用户以 root 身份登录,但会限制网络连接,只能在本地操作。
sudo mysqld_safe --skip-grant-tables &
这里的 & 符号表示将进程放在后台运行,执行后,您可以按 Enter 键返回到命令行提示符。
步骤 3:无密码登录数据库
您可以直接使用 mysql 命令以 root 用户身份登录,而无需任何密码。
mysql -u root
步骤 4:重置 root 密码
登录成功后,您就进入了 MySQL 的命令行界面,您需要根据数据库的版本来选择正确的 SQL 语句来更新密码。
| 数据库版本 | 操作步骤 | 代码示例 |
|---|---|---|
| MySQL 5.7+ | 直接使用 ALTER USER 语句修改密码。 |
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword'; |
| MySQL 5.6 及更早版本 / MariaDB | 切换到 mysql 数据库。使用 UPDATE 语句更新 user 表。刷新权限。 |
USE mysql;UPDATE user SET Password=PASSWORD('YourNewPassword') WHERE User='root';FLUSH PRIVILEGES; |
注意: 对于 MySQL 5.7+,执行完 ALTER USER 后无需 FLUSH PRIVILEGES;,但对于旧版本和 MariaDB,FLUSH PRIVILEGES; 这一步至关重要,它会让修改后的权限立即生效。
完成密码修改后,输入 EXIT; 或按 Ctrl+D 退出 MySQL 客户端。
步骤 5:正常重启数据库服务
需要终止正在运行的“安全模式”进程。

sudo pkill mysqld
或者,您也可以使用 killall 命令:
sudo killall mysqld_safe
确认进程已经结束后,再以正常方式重新启动数据库服务。
对于 MySQL:
sudo systemctl start mysqld
对于 MariaDB:
sudo systemctl start mariadb
步骤 6:使用新密码验证登录
使用您刚刚设置的新密码尝试登录,以确保重置流程成功。
mysql -u root -p
系统提示输入密码时,输入您的新密码,如果成功登录,恭喜您,密码重置已完成。
安全建议与最佳实践
在成功重置密码后,为了保障数据库的安全,请遵循以下建议:
- 使用强密码:新密码应至少包含12个字符,并混合大小写字母、数字和特殊符号。
- 避免明文存储:切勿在任何脚本、配置文件或代码中以明文形式存储数据库密码。
- 权限最小化原则:为应用程序创建专用的数据库用户,并仅授予其所需的最小权限,避免直接使用 root 账户进行应用连接。
- 定期备份:制定并执行定期的数据库备份计划,以防数据丢失。
- 审查用户账户:定期检查
mysql.user表,移除不再需要的用户账户和权限。
相关问答 (FAQs)
问题 1:如果执行 sudo mysqld_safe --skip-grant-tables & 命令后,服务无法启动或报错怎么办?
解答: 这通常是由于权限问题或 SELinux 策略阻止了非常规启动方式,请检查 MySQL 的错误日志(/var/log/mysqld.log)以获取详细的错误信息,如果日志中提示与 SELinux 相关的错误,您可以尝试临时将其设置为宽容模式进行排查:sudo setenforce 0,完成密码重置后,务必记得重新启用:sudo setenforce 1,这只是临时的故障排查手段,长期解决方案应为正确的 SELinux 策略配置。
问题 2:我可以不通过命令行,直接修改数据库的数据文件(如 user.MYD)来找回密码吗?
解答: 绝对不要这样做,数据库的数据文件是经过高度优化的二进制格式,直接手动编辑极易导致文件损坏、数据表损坏甚至整个数据库实例崩溃,造成不可逆的数据丢失,正如前文所述,文件中存储的是密码的哈希值,而非明文,即使找到也无法直接使用,遵循本文介绍的命令行重置流程是唯一安全、可靠且官方推荐的方法。