1045错误主因是mysql 8.0+初始化未完成,root@localhost记录authentication_string为空或plugin为caching_sha2_password不兼容宝塔;需用skip-grant-tables清空认证字段,再通过alter user统一设为mysql_native_password并赋强密码,同时确保localhost与127.0.0.1两条记录均生效。

宝塔面板安装MySQL后报1045,不是安装失败,而是初始化没走完 —— root用户在mysql.user表里压根没被正确写入或认证方式不兼容。
MySQL 8.0+ 安装后root@localhost实际不存在
宝塔调用mysqld --initialize生成初始密码时,只会在error.log里输出一次随机密码(路径如/www/server/data/主机名.err),但不会自动把该密码写入mysql.user表,更不会为root@localhost设置有效authentication_string。结果就是:你用日志里的密码去连,MySQL查到root@localhost这条记录的authentication_string为空或为INVALID,直接拒掉,报1045。
- 执行
SELECT user, host, authentication_string, plugin FROM mysql.user WHERE user = 'root';,大概率看到root@localhost的authentication_string是空字符串或NULL -
plugin字段若为caching_sha2_password,而宝塔底层用的老版客户端驱动,也会触发1045(不是密码错,是插件不认) - 别信“安装完成就可用”,MySQL 8.0起,
--initialize只生成密码、不激活账户
手动初始化必须分两步:先清空旧状态,再用ALTER USER重置
不能用UPDATE user SET password=PASSWORD('xxx')这种老写法 —— MySQL 5.7.6之后password字段已废弃,PASSWORD()函数在8.0里直接报错;也不能只改root@'%',宝塔默认走localhost(socket连接),root@'127.0.0.1'和root@'localhost'是两条独立记录。
- 停MySQL:
systemctl stop mysqld - 临时加
skip-grant-tables进/www/server/mysql/my.cnf的[mysqld]段,再systemctl start mysqld - 免密登录:
mysql -u root,然后逐行执行:USE mysql;<br>UPDATE user SET authentication_string = '' WHERE user = 'root';<br>FLUSH PRIVILEGES;
- 删掉
my.cnf里的skip-grant-tables,重启:systemctl restart mysqld - 再登录:
mysql -u root -p,输日志里那个初始密码 → 成功后立刻执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的强密码';<br>ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '你的强密码';<br>FLUSH PRIVILEGES;
宝塔连接MySQL时真正校验的是哪几条记录
宝塔后台填的“数据库地址”留空或填localhost,它底层用的是Unix socket连接,强制匹配root@localhost;如果填127.0.0.1,则走TCP,匹配root@127.0.0.1。这两条记录的plugin和authentication_string必须同时有效,缺一不可。
- 执行
SELECT user, host, plugin FROM mysql.user WHERE user='root' AND host IN ('localhost', '127.0.0.1');确认两者plugin都是mysql_native_password - 宝塔的MySQL管理页“配置修改”里,
bind-address若设为127.0.0.1,那root@localhost就完全失效,必须确保bind-address是0.0.0.0或注释掉 - 防火墙放开3306端口没用 ——
localhost走本地socket,不经过网络栈,iptables或firewalld对它完全透明
最容易被跳过的其实是root@localhost和root@127.0.0.1的双重校验,以及plugin必须统一为mysql_native_password —— 少一步,宝塔点“测试连接”就卡在1045。











