临时密码仅在MySQL 8.0初始化时输出一次,必须从mysqld.log或*.err文件中查找含“A temporary password is generated for root@localhost:”的行,复制冒号后完整字符串(含特殊字符且无空格换行)。
不是密码错了,是根本没找到那个临时密码——它只在初始化时输出一次,且默认不写进常规日志,必须查 mysqld.log 或 *.err 文件里带 A temporary password is generated for root@localhost: 的那行。
MySQL 8.0 不会把临时密码写到 /var/log/mysql/error.log 这种“看起来合理”的路径里。实际位置取决于 datadir 和 log-error 配置:
sudo mysqld --verbose --help | grep "datadir",或查 my.cnf 里的 datadir 值log-error 配置项决定,运行 sudo mysqld --verbose --help | grep "log-error" 查真实路径/var/lib/mysql/hostname.err(Linux)、C:ProgramDataMySQLMySQL Server 8.0Data*.err(Windows)、~/Library/Homebrew/var/mysql/*.err(macOS Homebrew)grep "temporary password" *.err 或 tail -n 50 hostname.err | grep "temporary" 搜索,必须复制冒号后全部字符(含 !、& 等),粘贴时不能带前后空格或换行90% 的 ERROR 1045 (28000): Access denied 不是密码本身错,而是连接环境不匹配:
mysql -uroot -p'xxx' 直接拼接:密码含 @、!、$ 时 shell 会提前解析,必须用 mysql -u root -p 回车后手动粘贴,或加单引号包住完整密码:mysql -u root -p'abc@123!'
root@localhost 和 [email protected] 是两个账号:前者走 Unix socket,后者走 TCP;临时密码只分配给 localhost,别加 -h 127.0.0.1
caching_sha2_password 插件,登录静默失败;可加 --default-auth=mysql_native_password 强制降级&、^ 等字符,建议改用 PowerShell 或 Git BashMySQL 8.0 要求首次登录后必须重置密码,否则连 SHOW DATABASES; 都被拦住:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';,SET PASSWORD 在 8.0+ 已被弃用validate_password 插件策略:默认要求 ≥8 位,且含大小写字母 + 数字 + 特殊字符;太简单会直接拒绝并报 ERROR 1819
UNINSTALL PLUGIN validate_password; 再改密SELECT user, plugin FROM mysql.user WHERE user = 'root'; 返回不是 mysql_native_password,得显式指定插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
当 grep 全路径都无结果,或日志为空、权限被拒、SELinux 拦截写入,说明初始化可能根本没成功:
data 目录是否为空、属主是否为 mysql:mysql、磁盘是否满mysqld --initialize --console(Linux/macOS)或 mysqld --initialize --console --shared-memory(Windows),盯住控制台输出,立刻复制那行临时密码--skip-grant-tables:编辑 my.cnf 加 skip-grant-tables,重启服务,用 mysql -u root 免密登录,再执行 ALTER USER 改密,改完务必删掉配置并重启最常被忽略的点:临时密码末尾的换行符、空格、主机名匹配、插件类型三者只要漏一个,就卡死在登录环节;别依赖“看起来像密码”的字符串,一定要从日志里原样复制那行冒号后的全部内容。