刚装完 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或带插件声明的变体。
