上午后两节课,正好讲到了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服务启动到现在所有连接加起来的总数。日常排障主要看全局状态,因为它能反映整个数据库的总体健康度。
常用的状态变量我整理成了一张表:
| 状态变量 | 作用 |
|---|---|
| Uptime | MySQL服务已运行的秒数,判断服务是否刚重启过 |
| Threads_connected | 当前打开的连接数,过高说明连接池配置有问题 |
| Threads_running | 正在执行的线程数,这个值高说明CPU忙不过来 |
| Questions | 从启动到现在执行的语句总数,可用于估算QPS |
| Slow_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是连接线程的ID,User和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,错误信息一般是Can't 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 'root'@'localhost'代表着MySQL已经收到你的连接请求了,但拒绝了这次访问,说白了就是凭证不对。
凭证问题有两层。第一层是密码确实错了,这个重设密码就行。第二层是Host限制。MySQL里用户是由“用户名+来源主机”共同决定的,root@localhost只允许从本机登录,如果你从另一台电脑用root远程连接,就会报1045。
想看当前用户和主机限制,可以执行:
SELECT user, host, plugin FROM mysql.user;如果确实需要远程访问,我建议创建一个专用账号,而不是修改root的Host:
CREATE USER 'dev'@'%' IDENTIFIED BY '强密码'; GRANT ALL PRIVILEGES ON *.* TO 'dev'@'%'; FLUSH PRIVILEGES;%表示任意主机,这里注意密码强度别太弱,毕竟开放在网络上的数据库暴露面很大。
4.3 报错2059:MySQL 8认证插件和旧版客户端的兼容问题
2059报错几乎只出现在MySQL 8连接旧版客户端时,错误信息是Authentication plugin 'caching_sha2_password' cannot be loaded。
MySQL 8.0默认的认证插件是caching_sha2_password,这是更安全的密码认证方式。但Navicat旧版本不认识这个插件,就会报2059。这个问题的本质不是密码错,而是双方“语言不通”。
解决方案有两个。一个是把MySQL用户的认证插件改回旧的mysql_native_password:
ALTER USER 'root'@'localhost' 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连接报错,越查越偏。正确的做法是直接看完整的错误信息字符串,比如Can't connect、Access denied,这些关键词比数字更能定位问题。
5. 课堂笔记之外的一点个人体会
上午后两节课最大的收获,不是记住了几个命令,而是把“状态查看”和“工具连接”这两件事串起来了。MySQL的状态信息是它是否健康的“体检报告”,Navicat是让这份报告更容易读懂的“可视化仪表盘”,两者缺一不可。
我个人实操中养成了一个习惯:连接数据库后先执行一遍SHOW GLOBAL STATUS和SHOW PROCESSLIST,再开始干活。花30秒看一遍连接数、慢查询数和正在执行的语句,比出了问题再回来看日志省心得多。如果你也经常搞混各种状态变量,可以把自己常用的命令整理成一个SQL脚本,保存在Navicat的查询收藏里,需要时一键执行。
再分享一个Navicat的小技巧:连接保存后,可以在“历史日志”里看到之前执行过的所有语句,有时候写了一半的SQL忘了保存,去历史日志里翻一翻就能找回来。这个功能不显眼,但对学习过程记录很有用。MySQL和Navicat的组合用好了,能让你把精力集中在SQL本身和数据逻辑上,而不是浪费在“为什么连不上”这种环境问题上。