navicat连mariadb报1045错误主因是host不匹配,如navicat填127.0.0.1但权限表仅有'root'@'localhost';需查mysql.user表确认host值,用grant创建对应host账号并flush privileges;同时检查bind-address是否设为0.0.0.0、防火墙/安全组是否放行3306、max_connect_errors是否触发及navicat连接参数(host/ip、port、认证插件)是否正确。
navicat连mariadb报1045错误:不是密码错,是host不匹配
绝大多数1045 access denied for user 'root'@'localhost'错误,根本不是密码输错了,而是navicat实际连接的host和mysql权限表里记录的host对不上。比如你在navicat里填了127.0.0.1,但权限表里只有'root'@'localhost'——这两个在mariadb里是完全不同的账号,后者走unix socket,前者走tcp,权限不互通。
立刻执行这条SQL查清楚到底有哪些root记录:
SELECT User, Host, authentication_string FROM mysql.user WHERE User = 'root';
重点看Host列值是localhost、127.0.0.1还是%。如果只有localhost,而你用127.0.0.1连,就必然1045。
- 本地开发推荐用
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '你的密码' WITH GRANT OPTION; - 局域网其他机器要连,必须显式创建
'root'@'192.168.1.%'或'root'@'%'(后者仅限可信内网) -
别直接UPDATE mysql.user表:MariaDB 10.4+用
authentication_string字段存密码,且默认认证插件可能是unix_socket,硬改字段容易锁死账户 - 每次
GRANT后必须执行FLUSH PRIVILEGES;,否则不生效
bind-address=127.0.0.1导致Navicat根本连不到服务端
这是10060超时错误的头号原因。MariaDB默认只监听127.0.0.1,意味着所有来自本机以外的TCP请求都被系统直接拒绝,连防火墙都还没机会拦截。Navicat填的是服务器IP,走的就是TCP,结果就是“Connection refused”。
检查配置文件位置(不同系统路径不同):
- Ubuntu/Debian:
/etc/mysql/mariadb.conf.d/50-server.cnf - CentOS/RHEL:
/etc/my.cnf.d/server.cnf - 群晖NAS:
/usr/local/mariadb10/etc/my.cnf
在[mysqld]段下确认这一行:
bind-address = 0.0.0.0
改完必须重启服务:sudo systemctl restart mariadb。验证是否生效:
sudo ss -tlnp | grep :3306
看到*:3306或192.168.1.100:3306才算成功;如果还显示127.0.0.1:3306,说明改错了文件或被其他conf覆盖。
防火墙、云安全组、max_connect_errors三重拦截
即使MariaDB监听了0.0.0.0,外部请求仍可能卡在中间层:
- Linux防火墙:Ubuntu用
sudo ufw allow 3306,CentOS用sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload - Windows主机?检查Windows Defender防火墙入站规则,手动放行TCP 3306
- 云服务器(阿里云/腾讯云)?安全组默认**不放行3306**,必须进控制台配白名单,光开系统防火墙没用
-
max_connect_errors阈值被触发:反复输错密码或Navicat自动重试,达到默认100次后MariaDB会静默封禁该IP,报错仍是10060。查状态:SHOW STATUS LIKE 'Aborted_connects';,解封:FLUSH HOSTS;
Navicat连接参数填错的典型表现
很多人以为填对了密码就万事大吉,其实Host和Port错一个就全崩:
- Navicat默认Host填
localhost→ 它优先走socket,不走TCP,哪怕你开了bind-address=0.000.0也无效;局域网连接必须填服务器真实IP,如192.168.1.100 - 端口不是3306?比如群晖MariaDB10默认用
3307,Navicat里就得同步改 - 认证插件不兼容:MariaDB 10.4+默认用
unix_socket或caching_sha2_password,老版本Navicat不支持。解决方法:ALTER USER 'root'@'%' IDENTIFIED VIA mysql_native_password USING PASSWORD('你的密码'); - 虚拟机网络模式选错:仅主机(Host-Only)模式下,宿主机和虚拟机虽在同一网段,但外部设备无法访问虚拟机IP;改用NAT或桥接模式
最易被忽略的是skip-name-resolve没开——MariaDB尝试反向DNS解析客户端IP时超时,会导致连接卡顿甚至失败,尤其在虚拟机或容器环境下。在[mysqld]段加一行:skip-name-resolve,然后重启服务。











