mysql 8.0安装后必须手动完成安全初始化,否则root默认使用caching_sha2_password插件和临时密码,导致mysql_secure_installation脚本因认证方式不匹配或命令缺失而失败;需先查日志获取临时密码,登录后切换为mysql_native_password插件并设强密码,再运行脚本或手动等效加固。

MySQL 8.0 安装后必须手动完成安全初始化,不能跳过;否则 root 账户默认用 caching_sha2_password 插件 + 临时密码,mysql_secure_installation 脚本大概率直接失败。
为什么 mysql_secure_installation 找不到或运行报错
MySQL 8.0.4+ 官方包(尤其是 apt/brew/yum 安装)默认不附带 mysql_secure_installation 脚本:
- Debian/Ubuntu:需额外安装
mysql-server包(sudo apt install mysql-server),它才包含该脚本 - macOS brew:脚本在
$(brew --prefix)/bin/mysql_secure_installation,但不在 PATH 中,得用全路径执行 - RPM/YUM(CentOS/RHEL):安装
mysql-community-server后通常自带,但需确认which mysql_secure_installation
即使脚本存在,运行时提示 Access denied for user 'root'@'localhost',根本原因是:脚本尝试用空密码连接,而 MySQL 8.0+ 的 root 默认认证插件是 caching_sha2_password,且初始密码是日志里的临时密码,不是空的。
怎么拿到并使用临时密码登录
临时密码只生成一次,记录在 MySQL 错误日志里,必须先查到它才能登录:
- Linux(systemd):
sudo grep 'temporary password' /var/log/mysqld.log - Linux(非 systemd 或自定义路径):
sudo grep 'temporary password' /var/log/mysql/error.log - macOS(brew):
sudo cat /usr/local/var/mysql/*.err | grep "temporary password"
拿到密码后,立即登录:mysql -u root -p,粘贴临时密码。登录成功后,**第一件事不是运行脚本,而是切换认证方式**:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新强密码';
密码必须含大小写字母、数字、特殊字符(MySQL 8.0 默认启用 validate_password 插件)。改完立刻 exit,再用新密码试 mysql_secure_installation。
运行 mysql_secure_installation 时的关键选项
脚本交互中,以下几项直接影响后续应用连通性,不能无脑选 Y:
-
Remove anonymous users?:选 Y 会删掉
''@'localhost'用户。某些本地开发工具(如旧版 Laravel Valet、部分 Docker Compose 模板)依赖这个空用户直连,删了就会报Access denied for user ''@'localhost' -
Disallow root login remotely?:建议选 Y。若需远程管理,应单独建专用账户(如
admin@'192.168.1.%'),而非开放root远程权限 - Remove test database and access to it?:选 Y。test 库无实际用途,且默认允许任意用户访问,属安全隐患
最后一步 “Reload privilege tables now?” 必须选 Y,否则前面所有操作不生效。
没脚本或脚本彻底不可用时的替代方案
如果确认找不到 mysql_secure_installation,或因环境限制无法运行,可手动等效操作:
- 改 root 密码并切插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass!123'; - 删匿名用户:
DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES; - 禁 root 远程:
DELETE FROM mysql.user WHERE User='root' AND Host!='localhost'; FLUSH PRIVILEGES; - 删 test 库:
DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%'; FLUSH PRIVILEGES;
验证是否生效:SELECT host, user, plugin FROM mysql.user WHERE user='root'; —— 结果应只有 localhost 一行,且 plugin 是 mysql_native_password。
临时密码只在首次启动时生成一次,错过就只能跳过授权表重置;caching_sha2_password 和 mysql_native_password 的兼容性差异,是绝大多数连接失败的根源,不是网络或权限配置问题。











