MySQL 8.0+ 初始化后 root 密码为空?用 mysql_secure_installation
不起作用
MySQL 8.0+ 安装后默认使用
caching_sha2_password插件,且 root 用户可能被设为
auth_socket或空密码(取决于安装方式)。直接执行
mysql -u root -p常报
Access denied,不是密码错了,而是认证方式不匹配。 Debian/Ubuntu 的
apt install mysql-server默认禁用密码登录,root 绑定
auth_socket,此时
mysql_secure_installation会跳过密码设置 CentOS/RHEL 的
yum/dnf install mysql-server可能生成临时密码,记录在
/var/log/mysqld.log中,关键词是
A temporary password is generated若已用
mysql_secure_installation却没改密码,大概率是因为它检测到 root 已有认证方式(如 socket),就跳过了密码步骤
绕过验证重置 root 密码:停服务 + --skip-grant-tables
这是最可靠、跨平台的兜底方法,适用于所有 MySQL 版本,但需有服务器 root 权限。
先停服务:sudo systemctl stop mysql(或
mysqld,依系统而定) 手动启动 mysqld 并跳过权限检查:
sudo mysqld --skip-grant-tables --skip-networking &(
--skip-networking防止远程未授权访问) 另开终端连入:
mysql -u root(此时无需密码) 刷新权限并重设密码(注意语法):
FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '你的强密码';退出,杀掉 mysqld 进程,再用
systemctl start mysql正常启服务
设置完成后必须改的三个安全项
仅设密码远远不够。MySQL 默认配置对生产环境极不友好,以下三项不改,等于裸奔。
bind_address:检查
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu)或
/etc/my.cnf(CentOS),确保
bind_address = 127.0.0.1,禁止监听公网(
0.0.0.0是高危配置) 删除匿名用户:
DROP USER ''@'localhost';限制 root 登录范围:
RENAME USER 'root'@'%' TO 'root'@'127.0.0.1';(避免 root 能从任意 IP 登录;如需远程管理,应新建专用用户并限制 IP 和权限)
验证是否真生效:用新密码连、检查插件、查 host
别只信自己敲了命令。实际连一次,看底层到底认不认。
执行:mysql -u root -p -h 127.0.0.1(强制走 TCP,避开 socket 认证歧义) 成功登录后查:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';—— 确认
plugin是
caching_sha2_password(非
auth_socket),且
host是
127.0.0.1或
localhost再试:
mysql -u root -p -h localhost—— 若失败但上一条成功,说明
localhost走的是 socket,需额外运行
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '密码';MySQL 的 root 安全配置本质是三件事:密码强度、认证插件统一、网络暴露面最小化。很多人卡在第一步就以为搞定了,结果
host字段残留
%,或者
plugin没切过去,导致应用连不上或安全策略形同虚设。
