Navicat连MariaDB报1045错误通常因权限配置不当而非密码错误:需确认连接方式(localhost/socket vs 127.0.0.1/TCP),检查root用户Host值,用GRANT授权并FLUSH PRIVILEGES,避免直接UPDATE表;云环境注意Navicat连接设置及skip-networking配置。
Navicat连MariaDB报1045: Access denied for user 'root'@'localhost',先别急着重置密码
绝大多数情况下,这个错误不是密码真错了,而是权限没开对——特别是 mariadb 默认禁用 root 远程登录,且新版本(10.4+)改用 authentication_string 字段存密码,老方法直接 update user set password=... 会失效甚至锁死账户。
- 先确认你是本地连还是远程连:如果 Navicat 和 MariaDB 在同一台机器,
Host填localhost或127.0.0.1行为不同(前者走 socket,后者走 TCP),权限记录可能分开存 - 检查实际生效的用户记录:
SELECT User, Host, authentication_string FROM mysql.user WHERE User = 'root';—— 注意看Host列是localhost、127.0.0.1还是% - 别信“重装/删库”这种方案:MariaDB 的权限表结构稳定,问题几乎都出在授权逻辑或认证插件上
用GRANT重新授权比直接改表安全得多
手动 UPDATE mysql.user 表风险高:字段名变化、加密方式不匹配、忘记 FLUSH PRIVILEGES 都会导致后续完全无法登录。用标准 SQL 授权既能绕过字段细节,又能自动适配当前认证机制。
- 如果只想让 root 从本机连(推荐开发环境):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '你的新密码' WITH GRANT OPTION; - 如果必须远程连(如腾讯云 CVM):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '强密码' WITH GRANT OPTION;,然后立刻执行FLUSH PRIVILEGES; - 注意:MariaDB 10.4+ 默认认证插件是
unix_socket或mysql_native_password,如果报错Plugin 'auth_socket' is not loaded,加一句ALTER USER 'root'@'%' IDENTIFIED VIA mysql_native_password USING PASSWORD('你的密码');
skip-grant-tables 是最后手段,且必须严格收尾
只有当你完全忘了 root 密码、又没其他管理账号时才启用它。但它会让整个数据库裸奔——任何能连上本地 socket/TCP 的人都能无密码操作所有库。
- 编辑
/etc/my.cnf或/etc/mysql/mariadb.conf.d/50-server.cnf,在[mysqld]下加一行:skip-grant-tables - 重启服务:
sudo systemctl restart mariadb(Linux)或net stop mariadb && net start mariadb(Windows) - 此时可直接
mysql -u root登录,但必须立刻执行:UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE User = 'root';+FLUSH PRIVILEGES; -
最关键一步:删掉配置文件里的
skip-grant-tables,再重启一次服务——漏这步,数据库就永远不校验密码
Navicat 连接设置里三个容易被忽略的细节
即使 MariaDB 权限全开,Navicat 自身配置不对也会触发 1045。尤其在云服务器或 Docker 环境下,网络层和认证层容易错位。
-
Connection标签页里,Host name/IP address别填localhost试远程——它会强制走 Unix socket,而云服务器通常只开放 TCP 端口;填127.0.0.1或真实公网 IP -
SSH标签页如果勾选了“Use SSH tunnel”,但没填对跳板机信息,Navicat 会静默 fallback 到直连,然后因权限不足报 1045,而不是 SSH 错误 - MariaDB 默认关闭
skip-networking,但如果配置里有这行,TCP 连接会被彻底禁用,只能本地 socket 连——检查my.cnf是否含skip-networking=1或bind-address = 127.0.0.1
真正卡住人的往往不是命令写错,而是改完权限没 FLUSH PRIVILEGES,或者改完配置没重启服务,又或者 Navicat 缓存了旧连接参数。每次操作后,用命令行 mysql -h 127.0.0.1 -u root -p 手动验证一次最稳。










