mysql 8.0 默认无匿名用户,故 mysql_secure_installation 跳过其密码设置;若存在需手动 drop user ''@'localhost';root 必须先改用 mysql_native_password 插件并设密码才能运行该脚本。

mysql_secure_installation 运行时提示 “Skipping password set for anonymous user”
这是 MySQL 8.0 默认行为:匿名用户(''@'localhost')在新安装中已被移除,mysql_secure_installation 检测不到它,就跳过相关步骤。你看到的不是“没禁用”,而是“根本不存在”。
但如果你是从旧版本升级而来,或手动创建过空用户名账号,仍可能残留匿名用户——这时需要手动清理,不能依赖脚本自动处理。
- 运行
SELECT User,Host FROM mysql.user WHERE User='';确认是否存在空用户名账号 - 若返回结果非空,执行
DROP USER ''@'localhost';(注意单引号包裹空字符串) - MySQL 8.0 不支持
DROP USER ''@'%';语法错误写法,必须明确指定 Host
执行 mysql_secure_installation 前必须确保 root 账户有密码
MySQL 8.0 默认启用 auth_socket 插件认证的 root@localhost,该账户不设密码、不走密码校验——而 mysql_secure_installation 要求 root 用密码登录,否则会卡在连接阶段或报错 Access denied for user 'root'@'localhost'。
- 先用
sudo mysql -u root免密登录(依赖系统 socket 或 auth_socket) - 执行
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的强密码'; -
FLUSH PRIVILEGES;生效后,再运行mysql_secure_installation - 不改插件类型直接设密码无效:MySQL 8.0 中
SET PASSWORD对auth_socket用户不生效
mysql_secure_installation 在 MySQL 8.0 中实际只做三件事
它不再删除匿名用户(因默认不存在),也不再禁用远程 root(8.0 默认不创建 root@'%'),核心动作只剩:
- 重置
root@localhost密码(前提是已切换为mysql_native_password) - 删除
test数据库及关联权限(如果存在) - 移除
root@localhost对performance_schema的部分权限(仅限某些发行版打包行为)
所谓“安全加固”主要靠你后续手动操作:DROP USER 清理多余账号、REVOKE 收紧权限、关闭 skip-networking 外的监听地址等。
为什么 DROP USER ''@'localhost' 后仍被重建?
极少见但真实存在:某些 Linux 发行版(如 Ubuntu 22.04 的 mysql-server 包)在服务重启时,会通过 systemd 的 ExecStartPre 脚本自动调用 mysql_install_db 或初始化逻辑,意外重建匿名用户。
- 检查
systemctl cat mysql或/lib/systemd/system/mysql.service中是否有预启动脚本 - 确认
/var/lib/mysql/下无残留的debian-start或自定义 init 文件 - 最稳妥方式:执行
DROP USER后,立即CREATE USER 'dummy'@'localhost' IDENTIFIED BY 'x';占位,并监控mysql.user表变更
匿名用户本身不是高危项,真正危险的是它搭配了宽泛权限(如 GRANT ALL ON *.*)。只要没显式授权,空用户连数据库都列不出来。











