ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

宝塔MySQL远程连接Navicat报1045:权限、host与插件排查

宝塔MySQL远程连接Navicat报1045:权限、host与插件排查 1. 从1045报错反推宝塔装完MySQL后远程连接到底卡在哪宝塔面板装完 MySQL本地 phpMyAdmin 点一下就进去了结果打开 Navicat 填好 IP、端口、root 密码点测试连接——弹出来一长串1045 - Access denied for user root123.45.67.89 (using password: YES)。这个画面我见过太多次了几乎每个第一次把数据库挪到云服务器上的人都会在这儿撞一次墙。先把话说透1045 不是密码打错了这么简单。它是 MySQL 服务端在告诉你——这次握手用的账号来源主机密码三者组合起来对不上。注意报错串里那个root123.45.67.89斜杠后面跟的是你从哪台机器发起的连接而不是服务器自己。很多人盯着密码反复改却忽略了后面那个 IP 才是真正的线索。这篇东西我想讲清楚的是宝塔面板装 MySQL 之后从 Navicat 远程连进来中间到底隔着几道门1045 又是卡在哪一道上。它适合两类人——一类是刚用宝塔搭站、需要本地 GUI 管理数据库的新手另一类是能连上但偶尔被 1045 卡住、想知道根因的老手。读完之后遇到 1045 你应该能自己顺着链路排下来而不是在网上乱搜一堆改密码的偏方。1.1 error 1045 的字面含义与三类真实成因MySQL 的报错号是分层的。1045 属于认证阶段的错误意思是服务端已经收到了你的连接请求但在校验账号密码这一步拒绝了。它和连接超时10061 无法连接完全是两回事——后者是网络根本没通前者是网络通了、但对方不认你的身份。拆开看1045 背后大概有三类原因。第一类是密码确实不对比如宝塔装完生成的随机密码你没复制全或者中途改过忘了。第二类是来源主机不匹配账号表里root只允许从localhost登录你从外网 IP 过来MySQL 找不到root你的IP这条记录只能用拒绝来回应。第三类是密码验证插件不兼容MySQL 8.0 默认用caching_sha2_password某些老版本 Navicat 或老驱动握手失败报错也可能落到 1045 上。提示拿到 1045 的第一件事别急着重置密码先看报错串里后面那个主机名。如果它是你的公网 IP说明请求已经打到 MySQL 了问题基本出在账号的 host 授权或密码插件上。1.2 为什么本地能连、Navicat连不上认证来源的差异phpMyAdmin 为什么总是好的因为它在服务器本机运行连的是127.0.0.1或者 socket 文件此时 MySQL 看到来源是localhost正好命中rootlocalhost那条记录。而 Navicat 从你办公电脑连过来MySQL 看到的是你的公网出口 IP去匹配的是root你的IP或root%。一个是本机通行证一个是外部通行证两套根本不一样。这就是最反直觉的地方本地能登完全不能证明远程也能登它们走的是 MySQL 权限表里两条不同的路。搞懂这一点后面所有排查都会顺很多。2. 宝塔面板里MySQL的安装与初始化几个默认值必须记牢宝塔把 MySQL 的安装做成了傻瓜式点几下就装好了但正因为太省事很多默认值你根本没看到出了问题就抓瞎。这一节把装完之后你必须知道的信息点捋一遍。2.1 软件商店安装MySQL的选择与等待过程进宝塔面板左侧软件商店搜 MySQL会看到一堆版本。选哪个我的建议是新项目直接上 5.7 或 8.0别碰 5.6 以下。5.7 兼容性最稳生态里大部分老教程、老框架都验证过8.0 性能和新特性更好但要注意它默认的密码插件是caching_sha2_password老客户端可能有兼容问题——这一点后面第 5 节专门讲。点安装之后是编译安装视服务器性能大概要 5 到 20 分钟期间面板会有进度。这里有个细节别在安装过程中去点别的软件同时安装宝塔的安装队列偶尔会因为资源抢占出现编译中断重装反而更费时间。装完之后软件商店里那一条会显示设置和卸载同时左侧菜单会多出数据库入口。2.2 安装完成后的关键信息在哪看root密码与端口装完第一件事去左侧数据库点开右上角的root密码。这里能看到当前 root 的密码旁边一般有复制按钮。宝塔生成的是随机强密码复制的时候务必确认没漏掉首尾字符尤其是以特殊符号开头结尾时很容易被漏选。端口默认是 3306可以在数据库页面或者软件商店 - MySQL - 设置 - 配置修改里确认。如果你改过端口Navicat 里就必须填改后的端口否则连不上。这两个信息密码、端口加上服务器公网 IP就是 Navicat 连接的全部必要参数先把它们记在一个安全的地方。2.3 phpMyAdmin 能连不等于 Navicat 能连前面已经点过这层这里再强调一次实际含义宝塔的数据库页面之所以能管理是因为它内部走 phpMyAdmin本质是 localhost 连接。所以哪怕你在面板里能建库、能改表Navicat 那边照样可能 1045。判断远程能不能连唯一靠谱的标准就是用外部客户端真的连一次别拿面板内的操作当证据。3. 让Navicat进来的三道门用户权限、访问来源、端口放行从外网连进宝塔的 MySQL中间隔着三道门账号的 host 授权、端口的网络放行、以及服务端是否监听外部地址。三道门全开Navicat 才连得上任何一道没开都可能是 1045 或连接超时。3.1 宝塔数据库界面里权限设置为所有人的含义在数据库页面每个数据库列表右侧有个权限选项点进去通常是本地服务器和所有人两个选择。选所有人宝塔会自动把该库对应账号的 host 改成%意思是允许从任何 IP 来源访问。这一步就是解决 1045 里来源主机不匹配那一类的关键动作。但注意它改的是你操作的那个账号不是 root。如果你要用 root 远程连得在别的地方处理 root 的 host见 3.3。很多新手把库权限改成所有人后发现还是 1045就是因为连的是 root 而不是那个库账号。3.2 云服务器安全组与系统防火墙双放行3306端口放行分两层缺一不可。第一层是云服务商的安全组阿里云、腾讯云、华为云后台都有安全组或防火墙规则默认只开 22、80、443 这些。你得手动加一条规则放行 TCP 3306来源可以是0.0.0.0/0不推荐或者你办公网的固定出口 IP推荐。第二层是服务器系统自身的防火墙。宝塔面板安全页面里能直接加放行端口填 3306 即可。如果服务器用的是 firewalld也可以命令行加firewall-cmd --zonepublic --add-port3306/tcp --permanent firewall-cmd --reload用 ufw 的机器则是ufw allow 3306/tcp我踩过最典型的一个坑只开了安全组、忘了系统防火墙结果连接直接超时反过来只开系统防火墙、安全组没开也是一样。两个地方都确认放行了网络这一层才算通。3.3 root用户的host字段localhost与%的区别MySQL 的用户表里每条账号记录是用户名来源主机配对的。root 默认通常只有rootlocalhost和root127.0.0.1没有root%。你想从外网用 root 连要么新建一个root%要么直接改现有的。登录 MySQL 先看现状SELECT user, host, plugin FROM mysql.user;如果 root 那几行的 host 只有 localhost那远程用 root 必然是 1045。要新增一个允许远程的 root可以这样CREATE USER root% IDENTIFIED BY 你的强密码; GRANT ALL PRIVILEGES ON *.* TO root% WITH GRANT OPTION; FLUSH PRIVILEGES;改完再连。这里要提醒一句让 root 对全网开放是危险操作具体怎么收尾更安全放到第 6 节讲。4. Navicat 连接参数逐项填法与被拒时的排查链路参数不多但每一个都容易填错。这一节先把填法讲清楚再给一条完整的排查链路。4.1 新建连接时主机、端口、用户名的正确填法Navicat 里连接 - MySQL打开几个关键字段这样填字段填法常见错误主机服务器公网 IP填了内网 IP 或域名没解析端口3306或你改的漏改端口用户名root 或你的库账号多打了空格密码宝塔/MySQL 里的真实密码复制时漏字符主机这一项如果你服务器绑了域名填域名也行但要确认域名解析到了正确的公网 IP。密码字段最容易出问题——从网页复制密码时末尾经常带一个看不见的空格粘贴进去就成了错密码报 1045。我习惯复制完手动检查一下长度。4.2 1045 Access denied 逐步排查的完整过程假设你现在拿到 1045按这个顺序走别跳步看报错串里的来源 IP。它是不是你的出口 IP如果是说明网络已通进第 2 步如果不是可能是安全组或网络层面的问题。确认账号 host 授权。登 MySQL 跑SELECT user, host FROM mysql.user;看你要用的账号有没有匹配你来源 IP 的 host 行。确认密码。如果 host 没问题还报 1045在服务器本地用同样账号密码mysql -u 用户 -p登一次能登说明密码对问题在 host不能登说明密码确实错了。确认密码插件。本地能登、远程 1045且报错里using password: YES很可能就是插件兼容问题进第 5 节处理。确认服务端监听。netstat -tlnp | grep 3306看是不是0.0.0.0:3306如果只监听127.0.0.1:3306说明 MySQL 没对外开放要改bind-address。这条链路的核心思路是逐层缩小范围先分网络通不通再分账号对不对再分插件兼不兼容最后分监听地址。每走一步可能性就少一半。4.3 用命令行验证先把变量缩小到最小排查时命令行比 GUI 更可信因为它把变量压到最少。在服务器本地先测mysql -u root -p -h 127.0.0.1能进说明账号密码和插件在本地都是好的。再从你自己的电脑如果装了 mysql 客户端测远程mysql -u root -p -h 服务器公网IP -P 3306这条命令能复现 Navicat 的所有行为但报错会更干净。如果命令行远程也报 1045那问题在服务端配置不在 Navicat如果命令行能连、Navicat 报 1045那就要怀疑 Navicat 版本或它的连接配置了。5. 绕不开的几个坑密码字符、加密方式、缓存刷新到这儿网络和授权都通了还报 1045通常就是下面这几个细节在作祟。这些坑我在不同项目里反复遇到过。5.1 caching_sha2_password 与老客户端的兼容问题MySQL 8.0 默认认证插件是caching_sha2_password而一些老版本 Navicat、老版本的 MySQL 驱动只认mysql_native_password。握手时客户端发不出服务端要的凭证格式结果就落到 1045 上。解决办法是把账号的认证插件切回老的ALTER USER root% IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;改完再连。需要说明的是这属于兼容性妥协官方推荐仍是新插件如果你的 Navicat 是较新版本优先升级客户端而不是降级插件。判断是不是这个原因可以看SELECT user, host, plugin FROM mysql.user;如果 plugin 列显示caching_sha2_password而你客户端又很老那嫌疑就很大。5.2 密码里的特殊符号导致连接串解析出错宝塔生成的随机密码经常带#、、\、!这类符号。这些字符放在 URL 形式的连接串里会被当成特殊分隔符导致客户端解析出的密码和真实密码不一致从而 1045。注意如果密码里有或#在命令行-p后面直接接密码时尤其容易出问题建议用-p后回车交互输入别写成-p密码。规避方式有两种一是建一个密码里只含大小写字母和数字的专用账号专供远程连接二是在需要拼连接串的地方对特殊字符做转义。前者更省心我一般这么做。5.3 改完权限要 FLUSH PRIVILEGES 吗严格来说用CREATE USER、GRANT、ALTER USER这类语句改权限时MySQL 会自动刷新不需要手动FLUSH PRIVILEGES。只有当你直接用INSERT/UPDATE去改mysql.user表这种底层操作时才必须手动刷一次才生效。之所以很多教程都让你加上FLUSH PRIVILEGES是因为加它不会有坏处。但你要知道它刷新的到底是什么——是让 MySQL 重新加载权限表到内存。理解了这点你就能判断什么时候它是必要的、什么时候只是保险动作。6. 远程连上之后的安全收尾能连上只是第一步把数据库长期暴露在公网上才是真正的心病。连上之后顺手做几件事能省掉以后很多麻烦。6.1 不要让root对全网开放前面为了排查可能临时开了root%。排完就该收掉。root 权限太大一旦密码泄露整个服务器等于拱手让人。更合理的做法是root 保持只允许 localhost另建一个权限受限的专用账号用于远程。DROP USER root%; CREATE USER app_user你的办公出口IP IDENTIFIED BY 字母数字组合密码; GRANT ALL PRIVILEGES ON 你的库名.* TO app_user你的办公出口IP; FLUSH PRIVILEGES;这样即使账号密码被人拿到对方也只能从你的固定网段访问且只能操作指定的库风险面小得多。6.2 建专用账号 限制来源IP限制来源 IP 的时候有个现实问题家庭宽带的公网 IP 经常变。如果 IP 一变就连不上可以考虑把 host 放宽到某个较小的网段或者干脆用内网 跳板的方式管理而不是长期对整个公网开放。另外改过bind-address让 MySQL 监听0.0.0.0之后也别只是靠安全组挡——系统防火墙和安全组应该形成双重限制任何一层被误开另一层还能兜底。我个人在这类配置上的体会是远程连接这套东西能连只是及格线怎么在随时能管理和尽量少暴露之间找平衡才是重点。我现在的习惯是生产库的 root 永远只留 localhost远程管理一律用专用账号加 IP 白名单只有在自己内网测试机上才会图省事直接开%。这个习惯让我少担了很多心也避免了好几次因为密码顺手写错导致的 1045 反复折腾。另外分享一个排查上的小技巧每次遇到 1045先把完整报错原文整段复制出来看别只看1045 拒绝访问几个字。那串用户来源IP (using password: YES/NO)里using password: NO和YES是两个完全不同的方向——NO说明客户端根本没把密码发出去YES说明发了但不对。就这么一个词能帮你少走一大半弯路。
返回列表