刚装完mysql的root密码取决于安装方式和版本:5.7+官方包会生成临时密码并记录在错误日志,而某些apt安装可能为空;可通过grep查日志、无密码登录验证或运行mysql_secure_installation初始化安全配置。

刚装完 MySQL,root 密码是空的还是随机生成的?
取决于你的安装方式和 MySQL 版本。MySQL 5.7+ 官方二进制包或 RPM/DEB 安装后,mysqld 会自动生成一个临时 root 密码,记录在错误日志里;而某些一键脚本(如 ubuntu 的 apt install mysql-server)可能跳过这步,导致 root 密码为空。别猜,直接查:
- 查临时密码:
sudo grep 'temporary password' /var/log/mysqld.log(linux)或sudo grep 'temporary password' /usr/local/mysql/data/*.err(macos) - 若没找到且能无密码登录:
mysql -u root -p回车即可进,说明密码为空 - 若提示
access denied但你确定没设过密码,大概率是安装时被跳过了初始化流程
用 mysql_secure_installation 一次性配齐安全项
这是最省心、也最符合生产习惯的方式,尤其适合刚装完还没动过权限表的环境。它不只是设密码,还顺手干掉几个常见安全隐患:
- 运行:
sudo mysql_secure_installation - 首次会问当前密码——如果刚装完且没改过,直接回车(空密码)
- 关键选项:选
y设置新密码(必须满足策略:至少 8 位、含大小写字母+数字+特殊符);移除匿名用户;禁止root远程登录(Disallow root login remotely? [Y/n]建议选y);删测试库;重载权限表 - 注意:该脚本不会修改
root@'%'用户,只处理root@localhost,所以远程连不上是正常现象
ALTER USER 修改密码时,认证插件不匹配怎么办?
MySQL 8.0 默认用 caching_sha2_password 插件,但老客户端(如某些 PHP 扩展、旧版 navicat、甚至部分 Python MySQL 驱动)不支持,连上就报错:Client does not support authentication protocol requested by server。
- 登录后执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的强密码'; - 不要只写
IDENTIFIED BY,必须显式指定WITH mysql_native_password - 改完立刻
FLUSH PRIVILEGES;,不用重启服务 - 验证:用同一个客户端重连,看是否还报插件错误
跳过权限表重置密码,为什么加了 --skip-networking?
很多人照着教程加 --skip-grant-tables 却忘了加 --skip-networking,结果重置中途被远程攻击者连进来把密码又改了——这不是危言耸听,而是真实风险。
- 正确启动方式:
sudo mysqld_safe --skip-grant-tables --skip-networking & -
--skip-networking关闭 TCP/IP 端口,只允许本地 socket 连接,杜绝远程干扰 - 改密码后,必须退出 MySQL、停掉这个
mysqld_safe进程,再用正常方式sudo systemctl restart mysql启动服务 - 切记:改完立即删掉配置文件里的
skip-grant-tables行,否则下次重启又失效
最常被忽略的一点:MySQL 8.0+ 的 PASSWORD() 函数已彻底移除,任何包含它的语句(比如 UPDATE user SET authentication_string = PASSWORD('xxx'))都会报错。别抄老博客代码,认准 ALTER USER ... IDENTIFIED BY 或带插件声明的变体。