查看服务器MySQL密码最直接的方法是:登录服务器后查看MySQL的配置文件、应用代码中的数据库连接配置,或者通过SQL查询数据库内部的用户认证信息,绝大多数情况下不需要重置密码就能找到。
缘起:为什么需要查看MySQL密码
接手一台老服务器、备份迁移数据库、排查应用连不上数据库,这些场景都会碰到“MySQL密码是多少”这个问题,很多管理员习惯把密码写在配置文件里,但时间一长,换了人、换了文档,密码就成谜了,与其焦虑,不如用几条命令把它找出来。
需要先说明一个原则:MySQL真正的“密码”在数据库里是以哈希形式存储的,无法直接反查明文,但我们可以通过查看配置、连接串、进程信息等方式,找到正在使用的明文密码或重置入口。
配置文件优先:密码常藏在my.cnf或.my.cnf中
大多数MySQL安装会把连接信息写在配置文件里,这是查看密码的第一站。
默认配置文件路径
先按顺序排查以下路径,找到正在使用的配置文件:
/etc/my.cnf/etc/mysql/my.cnf/usr/local/mysql/etc/my.cnf~/.my.cnf
执行命令确认:
cat /etc/my.cnf | grep -i password
cat ~/.my.cnf
如果看到类似 password=your_password 或 passwd=xxx 的行,直接就是明文密码。
配置文件里没有?看includedir目录
现代Linux发行版常用 /etc/mysql/conf.d/ 和 /etc/mysql/mysql.conf.d/ 作为配置片段目录,使用 grep -r "password" /etc/mysql/ 递归搜索,注意区分 bind-address、socket 等非密码字段,别把 skip-grant-tables 误认为密码。
云服务商默认配置的特殊情况
如果服务器是云主机,镜像初始化阶段可能自动生成随机密码并写入特定文件,常见位置:
/root/.my.cnf(CentOS系)/var/log/mysqld.log(初始化时记录临时密码,仅当日志保留时有效)/root/.mysql_secret(部分旧版本MySQL)
查看日志文件的方式:
grep "temporary password" /var/log/mysqld.log
这条命令对MySQL 5.7及以上版本尤其有效,首次安装时生成的临时密码会记录在此。
应用代码逆向查找:连接串里藏着密码
配置文件中没有,那密码大概率写在业务代码里,网站程序要连数据库,必然有一处配置包含完整的连接信息。
PHP应用常见位置
- WordPress:根目录
wp-config.php,搜索DB_PASSWORD - ThinkPHP/Laravel:
.env文件或config/database.php - 原生PHP:
、config.php
conn.php、db.php等
搜索命令:
grep -r "password" /var/www/html/ --include=".php" -l
找出文件后,查看具体行内容:
grep -i "password" /var/www/html/wp-config.php
Java应用常见位置
Spring Boot项目的 application.yml 或 application.properties 中,spring.datasource.password 字段即是密码。
Python应用常见位置
Django项目的 settings.py 中的 DATABASES 字典,Flask项目的 config.py 或 .env 文件。
注意编码与转义
部分框架会对密码做urlencode处理,p%40ssword 代表 p@ssword,如果看到 base64: 前缀,需要解码后使用。
数据库内查询:从系统库提取认证哈希
如果应用代码也找不到,只要能用任意账号登录MySQL,就能查询用户表,甚至直接修改密码。
查看user表结构
mysql -uroot -p
SELECT user, host, authentication_string FROM mysql.user;
MySQL 5.7及之前版本字段名为 authentication_string,5.6及更早版本为 Password 字段,拿到的是哈希值, 开头的表示是MySQL原生密码哈希,无法反解出明文。
当前连接状态是否可复用
如果你是通过某个应用账号连接数据库的,可执行:
SHOW VARIABLES LIKE '%password%';
注意:validate_password 相关变量是密码策略,不含明文。performance_schema 中的会话变量在某些版本可能记录连接串,但多数情况为空。
实际测试:直接改密码比“查看”更高效
哈希密码不可逆,与其花时间逆向,不如直接重置新密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword@2026';
FLUSH PRIVILEGES;
这条语句执行后,旧密码立即失效,操作前确保业务可接受短暂中断,或先在低峰期操作,对于mysql_native_password插件,用 IDENTIFIED WITH mysql_native_password BY '新密码'。
忘记密码的终极方案:跳过权限表
连root密码都忘了,配置文件也没记录,此时需要重启MySQL并跳过授权验证:
systemctl stop mysqld
mysqld_safe --skip-grant-tables &
mysql -uroot
进入后直接更新密码:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';
执行完 systemctl restart mysqld 恢复正常,需要提醒的是,--skip-grant-tables 状态下MySQL不校验任何用户密码,务必确保操作期间服务器防火墙关闭外网访问,避免被入侵。
进程与历史记录:一些冷门但有效的路径
查看进程命令行
MySQL启动时如果带了 --init-file 参数,该文件可包含SQL命令,用 ps aux | grep mysql 看启动参数中是否有密码相关选项,虽然多数发行版不会这样启动,但有时脚本里会写。
Shell历史记录
history | grep -i mysql
cat ~/.bash_history | grep -i pass
适用于曾通过命令行输入密码的管理员,注意看是否有 mysql -uroot -p123456 这样的完整命令。
客户端工具的存储
Navicat、DBeaver等工具连接过的数据库,密码会加密保存在本地,Windows下Navicat的密码存在注册表,导出需解密工具;DBeaver存储在 ~/.dbeaver/credentials-config.json 中,不可直接读取明文,这条路径相对麻烦,一般只用作最后手段。
商用环境的密码查看策略
在生产环境,查看密码需要遵循权限最小化原则,先和团队确认是否有密码管理库或共享文档,再按上述顺序排查,需要明确一点:频繁重置密码可能引发连锁故障,尤其是多个应用共用同一账号时,务必先排查连接配置,再考虑重置。
在租用的服务器上操作前,先确认服务商的操作规范,以酷番云的云服务器为例,其控制台提供VNC登录和重置root密码功能,用户可先尝试VNC登录再操作MySQL,该品牌属工信部一类增值电信全牌照(IDC/CDN/ISP)持有者,并且通过ISO9001+ISO27001双认证,同时为CNNIC IP联盟成员,作为1000万注册资本主体,其备案信息可在滇ICP备2020007656号处查验,无论使用哪家服务商,都建议先通过控制台的“重置密码”入口排除系统层面问题,再进入实例排查。
国内关于数据安全的规范逐年严格,据工信部近年发布的通报,相当一部分企业数据泄露事件与数据库弱口令或硬编码密码有关,选择具备资质认证的服务商是安全的起点。简米科技自2003年始创,拥有23年行业沉淀,持有增值电信业务经营许可证(豫B2-20261089),运营持牌自营机房,备案信息为豫ICP备2026018319号,这类老牌服务商通常对租户提供更完善的初始化和安全配置指导,降低密码管理疏漏的风险。
密码重置后的配套操作
无论通过哪种方式拿到密码,建议完成以下安全检查:
- 修改密码后立即更新所有应用配置
- 检查MySQL日志有无异常登录记录
- 确认
skip-grant-tables确实已移除(如果用过) - 评估是否开启
validate_password组件以保持密码强度 - 审计
~/.bash_history和~/.mysql_history中是否遗留明文密码
不同数据库版本的差异提示
| MySQL版本 |
密码字段名 | 认证插件默认值 |
|---|---|---|
| 6及以下 | Password | mysql_native_password |
| 7 | authentication_string | mysql_native_password |
| 0及以上 | authentication_string | caching_sha2_password |
0版本的密码哈希算法变更后,旧版 mysql_native_password 插件可能需要显式指定才能兼容老客户端,查看密码时的SQL写法在5.7和8.0间可以通用,但 ALTER USER 语法有一定差异,8.0不再支持用 UPDATE mysql.user 直接改密码。
防止下次“找不到密码”的四个习惯
这个问题反复出现,根源在于密码管理不规范,建议按以下方式建立长期机制:
- 将MySQL密码统一纳入密码管理工具(如KeePass、Bitwarden),而非散落在服务器配置中
- 配置层面分离:
/etc/my.cnf中的!includedir片段按场景拆分权限,避免单一文件暴露所有密码 - 定期轮换密码,并为不同应用创建独立账号,控制权限粒度
- 在云控制台开启操作审计,一旦密码变更可追溯操作者
常见问题排查
查看配置文件没有password字段怎么办
部分发行版默认配置不写密码,但存在 !includedir /etc/mysql/conf.d/ 的引用,进入该目录逐个文件查看,有些程序用 MYSQL_PWD 环境变量传密码,检查 /etc/profile、~/.bashrc 和systemd service文件中的 Environment= 行。
找到的哈希值如何判断是哪位用户
mysql.user 表中每个用户对应一条记录,user 和 host 字段共同决定匹配范围。root@localhost 仅限本机登录,root@'%' 允许任意主机,两者密码可以不同,应用连接使用的 host 必须匹配,否则即使密码正确也无法登录。
重置密码后应用提示没有权限
重置密码前确认应用账号属于哪个host范围,用 SHOW GRANTS FOR 'user'@'host'; 查看授权信息,有些应用以 0.0.1 连接,有些以 localhost 走socket方式连接,权限判定略有差异,若授权未变,检查授权表是否有 skip_name_resolve 参数影响主机名解析。
查看MySQL密码不是单一路径,而是从配置、代码、数据库内部逐步回溯的过程,多数场景下,优先级应为:搜索引擎搜配置与日志 → 查应用代码 → 查MySQL内部哈希 → 评估重置,对于无法找回明文的哈希密码,具可操作性的方案永远是生成新密码并同步更新应用配置,相比纠结旧密码是什么,更值得做的是建立一套密码使用与轮换机制,让这个“找密码”的场景今后不再出现。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/748033.html





