MySQL 8.0.4+ 默认不自带 mysql_secure_installation 脚本,需通过 mysql-server 包安装或手动配置 PATH; root 默认使用 caching_sha2_password 插件及临时密码,须先查日志获取并切换为 mysql_native_password 才能运行脚本。

mysql_secure_installation 找不到命令
MySQL 8.0.4+ 默认不自带 mysql_secure_installation 脚本,尤其是用包管理器(如 apt、brew)或二进制包安装时,它可能根本没被部署到 /usr/bin/ 或 /usr/local/mysql/bin/。不是你漏了步骤,是它压根没放进去。
实操建议:
- 先查有没有:
which mysql_secure_installation或find /usr -name "mysql_secure_installation" 2>/dev/null - 如果没找到,且你装的是 MySQL 官方 APT/YUM 源包,运行
sudo apt install mysql-server(Debian/Ubuntu)或sudo yum install mysql-server(RHEL/CentOS)——这个包会附带脚本 - Mac 上用
brew install mysql安装的,脚本在$(brew --prefix)/bin/mysql_secure_installation,但需手动加到 PATH 或用全路径执行
运行 mysql_secure_installation 提示 “Access denied for user 'root'@'localhost'”
这是最常卡住的地方:脚本默认尝试用空密码登录 root,但 MySQL 8.0+ 安装后 root 用户默认使用 caching_sha2_password 插件 + 随机生成的临时密码,不是空密码,也不是你设的密码。
实操建议:
- 先查临时密码:
sudo grep 'temporary password' /var/log/mysqld.log(Linux systemd)或sudo cat /usr/local/var/mysql/*.err | grep "temporary password"(macOS brew) - 用临时密码登录:
mysql -u root -p,粘贴临时密码 - 登录后立刻改认证方式(否则脚本仍连不上):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码'; - 再退出,用新密码重试
mysql_secure_installation
执行过程中 “Remove anonymous users?” 选 Y 后应用报错连不上
匿名用户(''@'localhost')看似没用,但某些旧版 PHP 应用、本地开发工具(比如早期 Laravel Valet、Docker Compose 的默认配置)会依赖它直连,删掉就直接报 Access denied for user ''@'localhost'。
实操建议:
- 生产环境必须选 Y;开发机建议先选 N,确认所有本地服务能连通后再手动清理
- 检查是否有应用硬编码了空用户名:
mysql -u "" -h localhost -e "SELECT USER();"看是否还能连 - 若已误删且应用崩了,不用重装,进 MySQL 执行:
CREATE USER ''@'localhost'; GRANT USAGE ON *.* TO ''@'localhost';
“Disallow root login remotely?” 选 Y 后运维连不上了
这个选项本质是删掉 'root'@'%' 这类远程 host 的账号,只保留 'root'@'localhost'。但它不会动你之前手动创建的其他远程用户(比如 'admin'@'192.168.%'),也不会关掉网络监听——MySQL 依然在 3306 端口收包,只是 root 不响应远程请求了。
实操建议:
- 选 Y 是对的,但别指望靠它防住所有风险;真正要远程管理,应该建专用低权限账号,比如:
CREATE USER 'ops'@'10.0.0.%' IDENTIFIED BY '强密码'; GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'ops'@'10.0.0.%'; - 确认防火墙放行了 3306(
sudo ufw status或sudo firewall-cmd --list-ports) - 检查
bind-address是否锁死为127.0.0.1(/etc/mysql/mysql.conf.d/mysqld.cnf),如果是,改成0.0.0.0或具体内网 IP
临时密码位置、认证插件切换、匿名用户残留影响——这三个点,比“按提示一路回车”重要得多。漏掉任意一个,后续都得翻日志、进容器、改配置,反而更费时间。


















