MySQL 8.0+ 初始化后root默认无密码但常被临时密码锁定,需查错误日志获取临时密码登录,再用ALTER USER设符合validate_password策略的新密码;必要时可禁用插件或调低策略,远程访问应避免开放root@'%',紧急重置密码须配合--skip-grant-tables与FLUSH PRIVILEGES。
ALTER USER
MySQL 8.0 安装后首次启动,root@localhost 用户默认没有密码,但可能被临时密码锁定(尤其使用 mysqld --initialize 方式初始化时)。此时直接连不上,或连接后执行命令报错 ERROR 1820 (HY000): You must reset your password。
/var/log/mysqld.log 或 /usr/local/mysql/data/*.err,搜索 A temporary password is generated
mysql -u root -p,粘贴日志里的临时密码(注意末尾可能有空格)
SET PASSWORD,要改用 ALTER USER 并指定密码策略validate_password 插件限制MySQL 8.0 默认启用 validate_password 插件,要求密码至少 8 位、含大小写字母+数字+特殊字符。若只想设简单密码(如开发环境),得先关插件或调低策略。
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'validate%';
UNINSTALL COMPONENT 'file://component_validate_password';(MySQL 8.0.29+)或
UNINSTALL PLUGIN validate_password;
SET GLOBAL validate_password.policy = LOW;,再设密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';
生产环境严禁开放 root@'%'。如果只是本地开发机想让宿主机连 Docker 里的 MySQL,改 root@localhost 即可,无需开远程。
SELECT User, Host FROM mysql.user WHERE User = 'root';
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'your_strong_password'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;
127.0.0.1:检查 my.cnf 中 bind-address 是 0.0.0.0 还是注释掉仅限紧急情况。停 MySQL 后加 --skip-grant-tables 启动,会跳过权限检查,但此时所有用户免密可登录,且不能执行 CREATE USER 等 DDL —— 必须先 FLUSH PRIVILEGES 才能写入密码。
mysqld --skip-grant-tables --user=mysql &
mysql -u root(不加
-p)FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';
这个流程里最容易漏掉 FLUSH PRIVILEGES,导致密码修改不生效;另外,--skip-grant-tables 模式下 UPDATE mysql.user 会失败,必须用 ALTER USER。