alter user 是 mysql 5.7.6+ 中最安全、轻量的改密方式,无需重启服务;需配合 flush privileges 生效,且须确认 host(如 'localhost' 或 '127.0.0.1')并避免使用已弃用的 set password 或 update user。

直接用 ALTER USER 设置密码,不重启服务
MySQL 5.7.6+ 默认允许空密码登录(尤其在 CentOS、Ubuntu 或 macOS 上安装后),只要能进 mysql> 提示符,就不用停服务、不用改配置。这是最安全、最轻量的方式。
- 先执行
mysql -u root -p,回车跳过密码(或输入安装时生成的临时密码,它通常在/var/log/mysqld.log里,搜temporary password) - 成功进入后,立刻运行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_strong_password'; - 必须跟一句:
FLUSH PRIVILEGES;——漏掉这步,新密码不会生效,下次登录仍失败 - 退出重试:
exit,再mysql -u root -p输入新密码验证
为什么不能用 SET PASSWORD 或 UPDATE user?
MySQL 5.7 把密码字段统一收口到 authentication_string,但直接写表或旧函数会埋坑:
-
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('xxx');虽然能用,但PASSWORD()函数已在 8.0+ 移除,5.7 里也属于遗留语法,不推荐 -
UPDATE user SET password = ...在 5.7 中会失败——字段名已改为authentication_string,写错字段名报错且无提示 - 如果误把
authentication_string设为空字符串(''),root 可能变成免密登录,这在生产环境极其危险
遇到 Access denied 连不进怎么办?走跳过权限流程
当你连 mysql -u root -p 都被拒,说明要么密码记错,要么初始密码没拿到(比如日志被清过)。这时必须绕过验证,但要注意安全边界:
- 停服务:
sudo systemctl stop mysqld(Ubuntu/CentOS)或brew services stop mysql(macOS Homebrew) - 加参数启动:
sudo mysqld --skip-grant-tables --skip-networking &——--skip-networking是关键,防止远程未授权访问 - 无密码登录:
mysql -u root,然后立刻切库:USE mysql; - 只更新本地 root:
UPDATE user SET authentication_string = PASSWORD('newpass123'), password_expired = 'N' WHERE user = 'root' AND host = 'localhost'; - 强制刷新:
FLUSH PRIVILEGES;,然后exit,再sudo pkill mysqld杀掉临时进程,最后sudo systemctl start mysqld
容易被忽略的细节:host 匹配和插件兼容性
5.7 的 root 用户默认有多个记录,常见的是 'root'@'localhost' 和 'root'@'127.0.0.1',它们是不同账户:
- 用
SELECT user, host, authentication_string FROM user WHERE user = 'root';查清楚你实际在用哪个 host 登录 - 如果从本机用 TCP 连(如某些 GUI 工具),可能走的是
'root'@'127.0.0.1',只改localhost无效 - 部分客户端(尤其是老版本 PHP 或 Navicat)不支持
caching_sha2_password插件,登录报错时,加插件声明:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass';
真正卡住人的从来不是命令记不全,而是没确认当前连接的 host 是哪个、没刷新权限、或者忘了 --skip-networking 导致临时实例暴露在公网。操作前花三十秒看一眼 SELECT user, host FROM mysql.user WHERE user = 'root';,能省掉大半排障时间。











