ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MySQL 状态查看与 Navicat 连接失败排查指南

MySQL 状态查看与 Navicat 连接失败排查指南 上午后两节课正好讲到了MySQL状态和Navicat链接MySQL这两块其实都是日常开发里最高频的操作一个是判断数据库到底健不健康一个是让你从黑窗口里解放出来。如果你刚装好MySQL不知道下一步干什么或者被Navicat连接时一堆报错劝退过这篇笔记应该能帮到你。我开始写这篇博文。1. 课前准备先把MySQL装明白再谈连接1.1 为什么课上要选Navicat这个工具MySQL本身自带的命令行客户端是最原汁原味的工具什么环境都能用而且没有图形界面依赖。但它有个很现实的问题——人眼不适合盯着一行行文本看表结构、看数据变更。上午老师演示的时候用命令行执行了一堆SHOW命令说真的看输出能看明白但效率确实低。Navicat算是图形化管理工具里上手最快的一类。它有免费的Lite版本Windows和macOS都有连接MySQL、MariaDB都没问题。正式版虽然收费但我建议学习阶段用免费版就够了。如果你想完全避开授权问题也可以考虑DBeaver或者MySQL官方的MySQL Workbench思路都是通的。MySQL Workbench其实也不错只是界面风格比较“工程风”Navicat更顺手尤其新建连接、查看服务器状态这些操作对新手非常友好。我需要先说清楚一件事这次课并不是让命令行工具退役而是让命令行和图形工具配合着用。命令行负责精确控制Navicat负责快速查看和操作两者结合才是效率最高的状态。1.2 安装MySQL 8.0时的几个关键配置如果你还没装MySQL我强烈建议直接装8.0系列不要回头去装5.7。8.0是目前的主流版本默认字符集已经是utf8mb4性能和安全机制也都更完善网上教程也最多。安装时我踩过的几个坑这里直接列出来端口号保持默认3306尽量不要改。后面所有连接工具都会默认先找3306改了端口每次都要多填一个参数而且排查问题的时候容易绕弯。选择Server Only就够了不需要装那些附带组件。连接工具的“Server”角色就是数据库本体。Authentication Method这一步很重要。MySQL 8默认使用caching_sha2_password认证插件这个后面会详细说和Navicat旧版本连接报错直接相关。装的时候可以保持默认也可以选Legacy关键看你手头Navicat是什么版本。Windows服务方式安装一定要勾上这样MySQL开机自动启动省去每次手动启动服务的麻烦。安装完成后第一时间打开命令行验证一下mysql -u root -p能进到mysql提示符就算成功了。别急着关窗口顺手执行一句SELECT VERSION();确认版本号和你安装的一致。2. MySQL状态怎么看从一个黑窗口说起2.1 SHOW STATUS和SHOW GLOBAL STATUS的区别学习状态查看老师是从SHOW STATUS讲起的。这个命令看起来简单里面有个容易忽略的细节——它默认显示的是当前会话的状态加上GLOBAL关键字之后显示的才是整个服务器的累计状态。SHOW STATUS; SHOW GLOBAL STATUS;这两条命令输出结果差别很大。会话级状态是从你登录到当前连接这段时间的统计数据全局级状态则是从MySQL服务启动到现在所有连接加起来的总数。日常排障主要看全局状态因为它能反映整个数据库的总体健康度。常用的状态变量我整理成了一张表状态变量作用UptimeMySQL服务已运行的秒数判断服务是否刚重启过Threads_connected当前打开的连接数过高说明连接池配置有问题Threads_running正在执行的线程数这个值高说明CPU忙不过来Questions从启动到现在执行的语句总数可用于估算QPSSlow_queries慢查询次数累计值判断是否存在慢SQL压力Bytes_received从客户端接收的字节数辅助判断网络传输量Bytes_sent返回给客户端的字节数过大说明返回了不必要的数据这里补充一个知识点QPS可以用两次快照之间的Questions差值除以时间间隔算出来。上课时老师用脚本做过一次其实原理就是状态轮询——每隔几秒采集一次状态变量的值计算差值得到实时速率。监控系统的原理也差不多所以别觉得这个命令简单它是所有性能监控的基石。判断MySQL健不健康我一贯的思路是先看Threads_connected是不是一直在涨再看Slow_queries有没有突变最后根据Bytes_sent判断是不是有应用拉取了超大结果集。这三个变量基本能覆盖80%的初级排查场景。2.2 用SHOW PROCESSLIST看实时连接状态状态变量是统计值SHOW PROCESSLIST则是实时快照直接列出当前所有连接和正在执行的语句。SHOW PROCESSLIST;输出结果里有几个关键列Id是连接线程的IDUser和Host是来源db是当前所在的数据库Command表示这个连接正在做什么Time是已经耗时多少秒State是当前执行状态Info是正在执行的SQL语句。排查的时候重点看两个地方。一是Command列的值正常的空闲连接是Sleep正在执行的是Query。如果大量连接都卡在Query并且Time很大说明有SQL在执行中阻塞了。比如UPDATE或DELETE操作忘了提交事务会把其他连接的更新操作全部堵住这种情况在状态面板里一眼就能看出来。二是State列。比较常见的Sending data本身不一定有问题但如果长时间处于这个状态多半是SQL写法有问题导致全表扫描。如果看到Waiting for table metadata lock那就说明有人对表的结构或者数据做了长时间的操作没释放锁后续对这个表的所有操作都会排队。这里有个小技巧生产环境不建议直接杀掉进程先通过SELECT * FROM information_schema.PROCESSLIST;把完整信息查出来确认是哪个客户端、哪条SQL再决定要不要KILL id。KILL要慎用杀掉别人的查询会造成业务报错一定要确认这条SQL不是关键业务。2.3 业务表里的“状态”别和MySQL状态搞混课上讲到一半老师特意强调了一个容易混淆的概念MySQL的运行状态和业务表里的状态字段是两码事。业务表里我们经常设计一个status字段比如订单状态、用户状态用0、1、2这类数字表示不同阶段。上课时举例建表的时候把status默认值设为0对应“待处理”或“启用”CREATE TABLE task ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100), status TINYINT DEFAULT 0 ); INSERT INTO task (title) VALUES (测试任务); UPDATE task SET status 1 WHERE id 1;这里的status是业务状态码应用层把它们映射成“待处理”“处理中”“已完成”。而2.1和2.2讲的SHOW STATUS、SHOW PROCESSLIST是数据库服务自身的运行指标。两者的排查工具和思路完全不同业务状态不对查的是应用逻辑和SQL更新MySQL状态不对查的是连接数、锁和慢查询。这个区分很重要不然遇到问题容易路径依赖一直盯着数据库状态看结果发现是业务代码把状态值写错了。我见过不止一次有人半夜排查“数据库卡了”结果发现是应用批量更新把几千条数据的status改成同一个值锁等待搞出来的跟数据库本身没有半毛钱关系。3. Navicat链接MySQL全流程从下载到连上3.1 新建连接前先确认MySQL的“当前状态”真正用Navicat连接MySQL的时候我建议你别直接开软件就填信息先花30秒确认三件事能省掉后面一堆报错排查。第一MySQL服务是否已经在运行。Windows下打开服务管理器找到MySQL服务看它的状态是不是“正在运行”。这点很像你要访问一个网站之前先确认服务器没宕机——数据库服务没起来Navicat再配置正确也连不上。第二端口是否在监听。Windows下可以执行netstat -ano | findstr 3306如果能看到LISTENING以及对应的PID说明MySQL正在监听3306端口。这一步相当于检查大门是否开着。第三账号和密码是否有把握。很多人装MySQL的时候设置的root密码过几天就忘了。忘记密码不用急着重装可以先用系统命令行登录记住是mysql -u root -p而不是直接进图形工具如果能进说明密码没忘后面直接填就行如果进不去再考虑用--skip-grant-tables重置密码的方案这个操作有风险只建议在本地学习环境用。这三步确认完再去Navicat里新建连接成功率会高很多。很多人一上来就点连接报错了才开始排查效率非常低。把前置条件先确认好是最高效的姿势。3.2 新建连接的关键配置项打开Navicat点击“连接”选择MySQL弹出的窗口里有几个字段需要认真填配置项填什么注意事项连接名随便起比如“本地学习库”只是个显示名称自己看得懂就行主机localhost或127.0.0.1本机连接用localhost远程连接填服务器IP端口3306除非安装时改过端口否则不要动用户名root也可以填后续创建的专用账号密码对应账号的密码可以先不填连接时再输入填完之后先别急着点确定点一下“测试连接”。如果返回“连接成功”再点确定保存。如果失败你会看到一个错误码后面第4节会专门讲这些错误码怎么处理。连接成功后左侧会出现一个数据库连接节点展开后可以看到数据库列表、表、视图、函数等。Navicat的界面逻辑是把一个MySQL服务器实例当作一个连接管理每个连接下面可以管理多个数据库。这一点和直接连某个数据库不同别搞混了。还要提一嘴SSL设置。Navicat新版默认会勾选“使用SSL”如果MySQL服务器没开SSL连接时可能报错。本机学习环境通常不需要SSL在“高级”或“SSL”标签页里把SSL相关的选项关掉连接会更省心。如果你遇到连接时异常中断或者握手失败的报错并且错误信息里有TLS字样先检查这部分的设置。3.3 连接成功之后怎么在图形界面里看服务器状态连接成功后很多人就开始沉迷建表、写SQL反而忽略了Navicat自带的状态查看功能。Navicat的“服务器状态”面板其实就是把命令行里的SHOW GLOBAL STATUS结果可视化。在Navicat主界面点击右上角或者工具菜单里的“服务器监控”可以看到一个实时刷新的面板里面有连接数、流量、查询数、慢查询等指标。这个面板本质上就是按固定周期去轮询状态变量然后画成折线图。如果你还是喜欢敲命令的感觉也可以在Navicat里新建查询直接执行SHOW STATUS; SHOW PROCESSLIST;Navicat会以表格形式展示结果比命令行阅读起来舒服得多。这也印证了之前说的图形工具只是命令行的可视化外壳核心还是那些SQL。有几个操作我建议你连接成功后立刻做一遍熟悉一下在左侧表列表里双击一张表查看表数据。右键表名选择“设计表”看字段定义。新建查询执行一遍SELECT * FROM 表名 LIMIT 10;。把这些基础操作过一遍Navicat的基本用法就掌握了。4. 连接失败排查笔记错误码就是最好的线索4.1 报错2003服务没起来还是端口不通如果Navicat报错2003错误信息一般是Cant connect to MySQL server on localhost (10061)。这个报错翻译成人话就是我找不到你要连的MySQL服务器。排查顺序我建议按这个来。首先回到服务管理器确认MySQL服务状态是不是“正在运行”。这一步能解决一半的问题很多2003报错就是服务没启动。其次用netstat -ano | findstr 3306看看端口有没有监听如果没有监听说明MySQL进程本身没起来或者配置改了端口。再次检查防火墙有没有拦截3306端口。如果是远程连接还有一个隐蔽原因MySQL默认只监听本机回环地址。也就是说即便服务器本身的3306端口开着外部网络也访问不了。这种情况下可以去MySQL配置文件里看bind-address的设置如果是127.0.0.1说明只允许本机连接改为0.0.0.0才能允许外部访问。这个修改后需要重启MySQL服务才生效。那种“资源处于联机状态但未对连接尝试做出响应”的情况我也遇到过描述很像但发生在校园内网环境里。排查思路还是一样先ping通不通再telnet端口通不通最后才轮到认证问题。4.2 报错1045账号密码正确但就是访问被拒1045的报错信息Access denied for user rootlocalhost代表着MySQL已经收到你的连接请求了但拒绝了这次访问说白了就是凭证不对。凭证问题有两层。第一层是密码确实错了这个重设密码就行。第二层是Host限制。MySQL里用户是由“用户名来源主机”共同决定的rootlocalhost只允许从本机登录如果你从另一台电脑用root远程连接就会报1045。想看当前用户和主机限制可以执行SELECT user, host, plugin FROM mysql.user;如果确实需要远程访问我建议创建一个专用账号而不是修改root的HostCREATE USER dev% IDENTIFIED BY 强密码; GRANT ALL PRIVILEGES ON *.* TO dev%; FLUSH PRIVILEGES;%表示任意主机这里注意密码强度别太弱毕竟开放在网络上的数据库暴露面很大。4.3 报错2059MySQL 8认证插件和旧版客户端的兼容问题2059报错几乎只出现在MySQL 8连接旧版客户端时错误信息是Authentication plugin caching_sha2_password cannot be loaded。MySQL 8.0默认的认证插件是caching_sha2_password这是更安全的密码认证方式。但Navicat旧版本不认识这个插件就会报2059。这个问题的本质不是密码错而是双方“语言不通”。解决方案有两个。一个是把MySQL用户的认证插件改回旧的mysql_native_passwordALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;这个方案立竿见影但不建议在正式环境这么干——相当于为了兼容老客户端故意降低安全标准。另一个方案是升级Navicat。新版本的Navicat已经完整支持caching_sha2_password直接就能连上。如果是学习环境优先考虑升级客户端保持MySQL默认的安全设置。我第一次遇到2059的时候第一反应是重装MySQL折腾了一下午最后才发现是认证插件的问题。所以遇到连接失败先看清楚错误码再动手能少走很多弯路。4.4 连接成功但操作很慢问题出在哪有一种情况特别折磨人连接是成功了但每次打开表、执行查询都慢吞吞的跟牛拉车一样。这种问题通常在客户端简单说就是“连接是通上了但每次沟通都在互相打听对方是谁”。有一种典型原因是DNS反查。MySQL默认会在客户端连接时反查主机名如果客户端的IP没有配置反查记录每次连接都要等超时。解决办法是在MySQL配置文件的[mysqld]段加上skip-name-resolve加完之后重启MySQL连接速度会有明显提升。注意这个配置会禁用主机名解析之后授权表里的Host字段就只能用IP而不能用域名了。还有一种情况是Navicat默认开启了某些后台行为比如打开表时先查一轮统计信息。这类问题可以试试在Navicat设置里关掉不必要的自动刷新和统计。说实话图形工具偶尔会帮倒忙表格开了“自动刷新”你有半屏数据在更新它就在那一直刷新界面体感上就会很卡。4.5 别被“400状态码”带偏热搜词里出现了一个“400状态码”我得专门说一句数据库连接报错里没有“400”这个错误码。400是HTTP协议里的状态码表示“请求格式错误”那是浏览器和Web服务器之间沟通用的语言。MySQL客户端的报错用的是MySQL自己的错误码比如2003、1045、2059这些是MySQL协议层面的编号。Navicat连接MySQL时报错弹窗里的数字基本都是MySQL错误码如果你在网上搜索时看到有人说“400”先看清楚他到底在说HTTP接口还是数据库连接避免被带进坑。我见过有人拿“HTTP 400”的思路去排查MySQL连接报错越查越偏。正确的做法是直接看完整的错误信息字符串比如Cant connect、Access denied这些关键词比数字更能定位问题。5. 课堂笔记之外的一点个人体会上午后两节课最大的收获不是记住了几个命令而是把“状态查看”和“工具连接”这两件事串起来了。MySQL的状态信息是它是否健康的“体检报告”Navicat是让这份报告更容易读懂的“可视化仪表盘”两者缺一不可。我个人实操中养成了一个习惯连接数据库后先执行一遍SHOW GLOBAL STATUS和SHOW PROCESSLIST再开始干活。花30秒看一遍连接数、慢查询数和正在执行的语句比出了问题再回来看日志省心得多。如果你也经常搞混各种状态变量可以把自己常用的命令整理成一个SQL脚本保存在Navicat的查询收藏里需要时一键执行。再分享一个Navicat的小技巧连接保存后可以在“历史日志”里看到之前执行过的所有语句有时候写了一半的SQL忘了保存去历史日志里翻一翻就能找回来。这个功能不显眼但对学习过程记录很有用。MySQL和Navicat的组合用好了能让你把精力集中在SQL本身和数据逻辑上而不是浪费在“为什么连不上”这种环境问题上。
返回列表