1045错误主因是User@Host组合在mysql.user表中不存在或Host不匹配,如Navicat填127.0.0.1但仅存在'root'@'localhost';需查Host字段、用GRANT创建对应账号、执行FLUSH PRIVILEGES,并确认bind-address=0.0.0.0、防火墙及云安全组放行3306。
1045 错误不是密码错了,而是 mariadb 认为你没权限——根本原因是 user@host 这个组合在权限表里压根不存在,或者 host 不匹配。
查清楚你到底用哪个账号连的
Navicat 填的是 root、127.0.0.1,但 MariaDB 里可能只有 'root'@'localhost'。这两个不互通:localhost 走 Unix socket,127.0.0.1 走 TCP,权限完全独立。
- 登录 MariaDB 执行:
SELECT User, Host FROM mysql.user WHERE User = 'root'; - 看输出里有没有
'root'@'127.0.0.1'或'root'@'%';没有就说明连不上是必然的 - 别只看用户名,
Host列才是关键——哪怕只差一个点(比如'192.168.1.100'vs'192.168.1.%')都会失败
用 GRANT 创建对应 Host 的账号,别硬改表
直接 UPDATE mysql.user 改 authentication_string 字段极容易锁死账户,尤其 MariaDB 10.4+ 默认用 caching_sha2_password 或 unix_socket 插件。
- 本地开发连本机:执行
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '你的密码' WITH GRANT OPTION; - Navicat 填
127.0.0.1:用'root'@'127.0.0.1',不是'localhost' - 局域网其他机器连:用
'root'@'192.168.1.%',避免滥用'root'@'%' -
每次 GRANT 后必须执行
FLUSH PRIVILEGES;,否则权限不生效
确认 bind-address 和 skip-networking 没拦住连接
如果 bind-address = 127.0.0.1 或配置里有 skip-networking,MariaDB 根本不监听 TCP 请求,Navicat 就算填对账号也连不到服务端。
- 检查配置文件(Ubuntu/Debian 在
/etc/mysql/mariadb.conf.d/50-server.cnf,CentOS 在/etc/my.cnf.d/server.cnf) - 确保
[mysqld]段下有bind-address = 0.0.0.0(或明确列出可访问的 IP) - 确认没有
skip-networking这行——macOS/macports 安装的 MariaDB 默认就开了它 - 改完重启服务:
sudo systemctl restart mariadb,再用sudo ss -tlnp | grep :3306验证是否监听*:3306
云环境要额外过三道关:白名单、安全组、公网地址
云厂商(阿里云、腾讯云等)的 MariaDB 实例默认关闭公网访问,光配好账号没用。
- 控制台进实例 → 网络与安全 → 白名单,添加你当前电脑的公网 IP(不是内网 IP),测试阶段可填
0.0.0.0/0 - 确认实例已开启“公网地址”,有些平台要单独申请弹性 IP 并绑定
- 安全组规则必须放行
3306/tcp,这个比系统防火墙还外一层,漏掉就彻底不通 - Navicat 连接时主机名填公网域名(如
rm-xxx.mysql.rds.aliyuncs.com),不是内网地址
真正卡住人的地方,从来不是“不知道怎么赋权”,而是查 mysql.user 时忽略 Host 列、改完配置忘了 FLUSH PRIVILEGES、或者云上只开了白名单却没开公网地址——这三处漏掉任何一环,1045 就稳稳报给你。


















