MySQL 5.7+ 在 CentOS 上首次安装后无默认密码,需从 /var/log/mysqld.log 中用 sudo grep 'temporary password' 提取临时密码,登录后必须用 ALTER USER 强制重设满足复杂度要求的新密码,否则报错 ERROR 1820。

MySQL 5.7+ 在 CentOS 上首次安装后没有默认密码,但会生成一个临时随机密码,必须先找到它才能修改——直接 mysql -u root -p 然后输空密码或猜密码,99% 会失败。
怎么找到 MySQL 初始化时生成的临时密码
安装完 mysql-community-server 后,MySQL 服务启动时会在错误日志里写入临时密码。这个日志位置取决于配置,但 CentOS 默认是:
-
/var/log/mysqld.log(最常见,尤其使用官方 RPM 安装时) - 少数情况在
/var/lib/mysql/hostname.err(hostname是你的机器名)
执行命令快速提取:
sudo grep 'temporary password' /var/log/mysqld.log
输出类似:A temporary password is generated for root@localhost: sX9aK!mQ2#pL,冒号后那串就是临时密码。
⚠️ 注意:如果日志为空或没搜到,说明 mysqld 没成功启动过,先运行 sudo systemctl start mysqld 再查。
用临时密码登录并立刻修改 root 密码
不能跳过这步直接设新密码——MySQL 5.7+ 强制要求首次登录后必须改密,否则后续任何操作(包括 SET PASSWORD)都会报错 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
登录后立即执行:
mysql -u root -p
输入刚才拿到的临时密码,然后在 MySQL 提示符下运行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPass123!';
- 密码必须满足默认策略:至少 8 位、含大小写字母、数字、特殊字符
- 如果不想被策略拦住,可先临时调低强度(不推荐生产环境):
SET GLOBAL validate_password.policy = LOW; - 改完后退出再重新登录验证:
exit→mysql -u root -p
为什么用 mysql_secure_installation 有时不生效
这个脚本本意是辅助初始化安全配置,但它依赖当前 root 是否已认证。如果 root 还没用临时密码登录过,脚本会卡在“Enter password for user root:”并提示 Access denied ——不是脚本坏了,而是你还没完成首次认证。
- 正确顺序:先用临时密码登录 → 执行
ALTER USER改密 → 再运行sudo mysql_secure_installation - 如果跳过第一步直接跑脚本,它可能误判为“密码为空”,然后尝试用空密码登录,必然失败
- 脚本里“Remove anonymous users”“Disallow root login remotely”这些选项,和改初始密码是两件事,别混为一谈
改完密码还连不上?检查 socket 和 host 匹配
即使密码正确,mysql -u root -p 仍报 Access denied,大概率是用户权限绑定的 host 不对:
- 临时密码只对
'root'@'localhost'有效;如果你用mysql -h 127.0.0.1 -u root -p,实际走的是'root'@'127.0.0.1',这是另一个用户记录 - 确认当前 root 用户有哪些 host 记录:
SELECT User,Host FROM mysql.user WHERE User='root'; - 如需支持本地 IP 连接,补一条:
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'YourNewStrongPass123!'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION; - 别忘了
FLUSH PRIVILEGES;
socket 文件路径异常(比如 Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock')通常意味着 mysqld 没在跑,或配置里 socket 路径和客户端默认不一致——此时优先看 sudo systemctl status mysqld 是否 active (running)。


















