ARTICLE DETAIL

资讯详情

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

MySQL查看全攻略:从命令行到数据字典,一文讲透

MySQL查看全攻略:从命令行到数据字典,一文讲透 我在后台收到最多的提问里“mysql怎么查看”绝对能排进前三。这句话在不同人嘴里代表完全不同的意思新手想知道MySQL装没装好、版本是多少开发想知道某张表的数据怎么排序、怎么筛选运维想知道当前连接数、慢查询、错误日志从哪里看。这个问题看着基础但偏偏没有一个统一的答案网上搜出来的结果又东一句西一句所以我干脆写一篇长文把“看MySQL”这件事从命令行、图形工具、日志、数据字典到常见报错一次性讲透。这篇文章不聊高深调优只解决一个核心问题用什么命令、去哪里看、怎么理解看到的结果。适合三批人——刚装好MySQL不知道下一步干什么的新手被线上告警追着跑、需要快速确认数据库状态的初级运维以及想补全自己“查看工具箱”的开发者。下面所有操作我都尽量按 MySQL 5.7 和 8.0 双版本兼容来写你照着敲就行。1. 先别急着敲命令弄清MySQL的“查看”到底分成哪几类1.1 最常见的“查看”需求其实有七种很多人以为“mysql怎么查看”对应某一条万能命令实际上MySQL把“查看”拆得很细。我自己习惯把查看类需求分成七类查版本和安装情况验证服务有没有起来查库、表、字段、索引这些结构信息查表里的业务数据也就是SELECT查询查当前连接、线程、锁等待这些运行状态查配置参数和系统变量查错误日志、慢查询日志、通用日志查元数据统计比如库大小、表行数、碎片情况。为什么要先分这个类因为我自己踩过坑。早年间我为了排查一个锁等待问题盯着SELECT查了半天后来才意识到应该去看SHOW ENGINE INNODB STATUS。工具没选对越查越乱。所以你现在可以对照一下自己属于哪一类再翻到对应章节比从第一条命令硬看到最后效率高得多。1.2 进入MySQL环境命令行和图形工具怎么选“查看”之前得先能进入MySQL。命令行是最通用的方式登录语法就这几行# 本机默认socket登录 mysql -uroot -p # 指定IP和端口登录 mysql -h127.0.0.1 -P3306 -uroot -p # 指定socket文件登录 mysql -S /tmp/mysql.sock -uroot -p参数不复杂-u后面跟用户名-p表示要输密码-h是主机地址-P是端口-S是socket文件路径。有个细节很多人不知道当你在Linux本机执行mysql -uroot -pMySQL默认走socket连接当你写mysql -h127.0.0.1 -uroot -p走的是TCP连接。这看起来只是写法差异实际上和很多连接报错直接相关后面第7章我会专门讲。如果你不喜欢黑屏敲命令常见图形工具也可以选我用下来的对比是这样的工具优点短板适用场景MySQL Workbench官方出品免费ER图功能强界面偏重连接配置略繁琐建表设计、可视化查看Navicat功能全界面友好适合日常开发商业软件要授权日常开发调试DBeaver免费开源支持多种数据库驱动可离线配置首次连MySQL可能下载驱动较慢跨数据库开发、临时连接我的建议很直接临时看两眼用命令行最快天天要写SQL、看表结构的开发用Navicat或DBeaver这类图形工具需要通过ER图梳理数据库关系时用Workbench。工具不冲突反而是互补的。如果你用DBeaver连不上MySQL多半是驱动没装好手动下载mysql-connector-java的jar包然后在连接设置里“Add Jar”指定文件就行这个后面也会再提一句。2. 库、表、字段、索引结构类的查看命令一网打尽2.1 看库看表SHOW DATABASES 与 SHOW TABLES进入MySQL之后第一步通常是看看当前实例上有哪些数据库SHOW DATABASES;这个命令会列出所有你有权限看到的库常见的information_schema、mysql、performance_schema、sys是系统自带的不用动。如果库多了想筛选可以用LIKESHOW DATABASES LIKE test%;它会把所有以test开头的库列出来适合库名有规律的环境。选定库之后看这个库下面有哪些表USE test; SHOW TABLES;同样支持模糊匹配SHOW TABLES LIKE user%;我要提醒一个最容易被忽略的点执行SHOW DATABASES只能看到你有权限的库。如果你用某个普通账号登录发现列表里根本没有生产库别急着怀疑数据丢了先想想是不是账号权限不够。这个问题我在后面第7章还会专门展开。2.2 看字段定义与建表语句DESC 与 SHOW CREATE TABLE确定要看的表之后下一步就是看表结构。两种方式最常用DESC users;也可以写完整单词DESCRIBE users;。输出会包含Field、Type、Null、Key、Default、Extra这几列含义分别是字段名、字段类型、是否允许NULL、索引类型、默认值、额外属性。举个例子常见的自增主键那一行Extra会显示auto_incrementKey会显示PRI看到这两项你就知道这是主键而且是自增的。如果你想把建表语句完整归档或者要精确查看字段注释、字符集、索引细节DESC就不够了得用SHOW CREATE TABLE users\G输出会直接给你一段完整的CREATE TABLE语句包括每个字段的注释、表级字符集、索引定义。这里强烈建议加\G而不是用分号结尾因为SHOW CREATE TABLE返回的内容是单行超长文本不加\G会挤得非常难读加了之后会按行拆开。这条命令在我要把表结构从一个环境复制到另一个环境的时候几乎是救命级别的好用。2.3 看索引和字符集SHOW INDEX 与 SHOW TABLE STATUS表结构看完了如果还想了解索引情况用SHOW INDEX FROM users;输出字段里Non_unique为0表示唯一索引为1表示普通索引Key_name是索引名Seq_in_index是索引中字段的顺序Column_name是字段名Cardinality是基数估算值代表该列的去重程度估算。注意Cardinality只是个估算值小表经常不准如果你想让它更贴近真实执行一下ANALYZE TABLE users;再查会好一些。这个估算值的实际意义是帮你判断索引选择性如果Cardinality接近表的行数说明这个索引区分度高查询条件用它通常很合适。查看表的整体状态比如行数、数据大小、碎片大小用SHOW TABLE STATUS LIKE users\G里面Rows是估算行数Data_length是数据文件大小Index_length是索引文件大小Data_free是碎片字节数。记得这里Rows同样是估算值InnoDB不会实时维护精确行数所以它只能用来大致判断表的量级。字符集这种“隐藏结构”也是查看高频点我把它放一起说SHOW CREATE DATABASE test; SHOW VARIABLES LIKE character_set_server;第一条能看库级字符集第二条能看实例级默认字符集。如果你发现中文存储乱码先查这两项再查表的字符集基本能把问题定位到库、表、连接三个层面中的某一个。3. 查数据是查看的主战场SELECT 的正确打开方式3.1 最基础整表查询与字段挑选结构看得再明白最终还是要落到数据上。最基础的查看方式SELECT * FROM users;*表示所有字段适合表比较小、字段比较少的时候快速扫一眼。但生产环境的大表千万别一上来就SELECT *原因不是语法错而是真的会把数据库IO打满。我见过不止一次开发在慢查询日志里看到超大SELECT点进去就是一条SELECT *没加LIMIT。所以更推荐的做法是只查需要的字段SELECT id, name, age, created_at FROM users;字段名尽量写清楚一方面减少传输量另一方面后面要接ORDER BY或WHERE时你能明确知道自己在查什么。3.2 条件筛选、排序、去重、分页面试题很喜欢问“mysql排序”实际开发里也几乎天天用。排序看这两类写法-- 单字段排序默认升序 SELECT name, age FROM users ORDER BY age DESC; -- 多字段排序先按age降序age相同再按name升序 SELECT name, age FROM users ORDER BY age DESC, name ASC;DESC是降序ASC是升序不写默认为ASC。多字段排序时越靠前的字段优先级越高这个顺序一旦搞反排序结果会和你预期差很远。条件筛选的骨架是WHERE配合排序和分页最典型的写法是这样的SELECT name, age FROM users WHERE age 18 AND city 北京 ORDER BY age DESC, id ASC LIMIT 20 OFFSET 0;LIMIT 20 OFFSET 0表示从第0行开始取20行换成分页就是第一页。跳页时OFFSET会变大比如第二页就是LIMIT 20 OFFSET 20。MySQL还支持LIMIT 20, 20这种老写法效果等同于LIMIT 20 OFFSET 20但是可读性差一点新代码建议用OFFSET。去重用DISTINCTSELECT DISTINCT city FROM users;这里有个小坑如果你写SELECT DISTINCT name, city去重的是name和city的组合不是单独对name去重很多新手在这里看懵。还有一个进阶但很重要的排序细节MySQL默认把NULL当作最小值处理所以ORDER BY age ASC时NULL会排在最前面。如果你希望NULL永远沉底可以这样写SELECT name, age FROM users ORDER BY ISNULL(age), age ASC;ISNULL(age)对NULL返回1非NULL返回0升序时1排在0后面自然就把NULL挤到尾部了。3.3 多表关联与聚合统计单表操作熟了以后多表关联是查看数据的必备技能。MySQL的JOIN并不神秘本质上就是“把两行按照条件拼成一行”。最常见的写法SELECT u.name, o.order_no, o.status FROM users u JOIN orders o ON u.id o.user_id WHERE o.status 1 ORDER BY o.created_at DESC LIMIT 50;JOIN前的u和o是别名让SQL更短。ON后面的u.id o.user_id就是两张表的连接条件。推荐在写JOIN时别省略ON条件否则会形成笛卡尔积结果行数是两张表行数的乘积数据量稍微大一点就是灾难。聚合统计也是“查看”的高频需求典型场景是看订单状态分布SELECT status, COUNT(*) AS cnt, SUM(total_amount) AS total FROM orders GROUP BY status HAVING COUNT(*) 100 ORDER BY cnt DESC;GROUP BY按status分组后COUNT(*)统计每组行数SUM算每组金额合计。HAVING和WHERE的区别是WHERE在分组前过滤行HAVING在分组后过滤组。你想统计“状态超过100单的分组”就必须用HAVING写在WHERE里会直接报错。如果你想知道一条SELECT在MySQL内部是怎么执行的还有个特别值得用的“查看”方式——EXPLAINEXPLAIN SELECT u.name FROM users u JOIN orders o ON u.id o.user_id WHERE o.status 1;EXPLAIN不真正执行查询而是输出执行计划里面有type、key、rows这几个关键列。type从好到差大致是system、const、eq_ref、ref、range、index、ALL看到ALL基本就是全表扫描索引没走对。rows是估算扫描行数。我排查慢SQL时第一步永远是EXPLAIN先看有没有全表扫描再决定要不要加索引。3.4 查看存储过程、触发器、函数“mysql怎么查看”里还有一个很容易被忽略的类别——存储对象。很多系统里存储过程和触发器是重要业务逻辑但新人不知道去哪看。看库里的存储过程SHOW PROCEDURE STATUS WHERE Db test;看某个存储过程的定义SHOW CREATE PROCEDURE test.my_proc\G看触发器SHOW TRIGGERS FROM test;看函数SHOW FUNCTION STATUS WHERE Db test;这些命令的共同逻辑是SHOW 对象类型 STATUS或CREATE。如果你嫌SHOW的内容不够详细还可以直接查数据字典SELECT * FROM information_schema.routines WHERE routine_schema test\G;信息量比SHOW命令更完整包括创建时间、修改时间、定义者等。对排查线上“某个存储过程是不是被改过”这类问题非常有用。4. 运行时状态怎么查看连接数、线程、性能指标4.1 当前谁在连我SHOW PROCESSLIST数据库出问题的时候第一件事往往是看当前有哪些连接、每条连接在干什么。对应命令是SHOW PROCESSLIST;需要看完整SQL时用SHOW FULL PROCESSLIST;因为默认版本会截断Info字段。输出的核心列有Id连接线程ID、User账号、Host来源IP、db当前连接的库、Command连接状态、Time已经持续的时间、State状态、Info正在执行的语句。Command和State字段是排查重点。Command Sleep表示空闲连接Command Query表示正在执行查询State字段如果出现Waiting for table metadata lock或者长时间停留在statistics、copy to tmp table往往意味着有锁等待或者大查询卡住了。高发场景是慢查询堆积。比如应用连接池里的一堆请求全部卡在同一个大查询上SHOW PROCESSLIST会看到多条Query且Time都很大。这时候你可以用KILL 12345;直接杀掉卡死的线程其中12345是Id字段的值。注意KILL是有权限限制的普通账号只能杀自己的连接生产环境一般需要管理员操作。这条命令我已经用过无数次特别适合那种“数据库CPU突然飙高、应用超时告警”的紧急时刻。4.2 全局参数与状态SHOW VARIABLES 与 SHOW STATUSSHOW VARIABLES是查“配置类”信息SHOW STATUS是查“运行统计类”信息两者经常被搞混。我的记忆技巧是VARIABLES回答“MySQL是怎么配置的”STATUS回答“MySQL跑得怎么样”。常用的VARIABLES查看SHOW VARIABLES LIKE max_connections; SHOW VARIABLES LIKE port; SHOW VARIABLES LIKE datadir; SHOW VARIABLES LIKE character_set_server;max_connections是最大连接数datadir是数据文件目录这些在排查问题时要经常看。修改配置后用SHOW VARIABLES确认是否生效也是最稳妥的验证方式。常用的STATUS查看SHOW STATUS LIKE Threads_connected; SHOW STATUS LIKE Threads_running; SHOW STATUS LIKE Uptime; SHOW STATUS LIKE Com_select;Threads_connected表示当前连接数Threads_running表示正在执行的线程数。Threads_running长期飙到几十甚至上百说明有明显并发压力。Com_select统计从启动到现在执行了多少SELECT把它配合Uptime用能粗算出QPS水平。顺带说一个线上常用的“查看两连击”SHOW STATUS LIKE Threads_connected; SHOW VARIABLES LIKE max_connections;把这两个结果放在一起对比如果连接数已经接近max_connections那连接池告警的根源基本就清楚了——不是网络断了是连接被占满后面的请求在排队。4.3 InnoDB 引擎内部状态怎么读如果数据库出现锁等待、死锁、事务长时间不提交这类问题SHOW PROCESSLIST只能看到现象想看到引擎内部的详细信息就得用SHOW ENGINE INNODB STATUS\G输出是一大段文本首次看会被吓到其实重点看两个段落。一个是TRANSACTIONS段里面会列出当前活跃事务、事务状态、如果正在锁等待会明确标出LOCK WAIT并显示等待哪个事务的锁。另一个是LATEST DETECTED DEADLOCK段只有发生过死锁才会出现包含了死锁双方的SQL语句和持有锁的情况这是分析死锁问题的第一手材料。SG这个输出有个特点它是实时生成的快照且只有当前有活动事务时信息才比较全。所以排查死锁的正确姿势是先SHOW PROCESSLIST找到相关线程ID再SHOW ENGINE INNODB STATUS看引擎视角两条命令配合起来才能拼出完整画面。单纯依赖任何一条都可能漏掉一半线索。5. 配置、日志、初始密码排查问题时最该会的查看技巧5.1 配置文件在哪、怎么看MySQL的配置查看有两层一层是直接读配置文件一层是查运行中的系统变量。两者有冲突时以运行中的变量为准也就是SHOW VARIABLES的结果更“真实”因为配置文件改完后如果没重启可能并没有生效。Linux下配置文件常见路径/etc/my.cnf/etc/mysql/my.cnf/usr/local/mysql/etc/my.cnfWindows下一般是“C:\ProgramData\MySQL\MySQL Server 8.0\my.ini”。想确认当前mysqld启动时到底读了哪些配置文件可以执行mysqld --verbose --help | grep -A 1 Default options它会按读取顺序列出配置文件路径。这是排查“明明改了my.cnf却没生效”的利器。比如你有两个配置文件以为改的是/etc/my.cnf但实际/usr/local/mysql/etc/my.cnf的优先级更高后者把参数覆盖了改动自然没用。另一种快速总览运行参数的方式mysqladmin variables -uroot -p不过它输出的内容太多日常我还是推荐SHOW VARIABLES LIKE精确查看想看哪条就查哪条效率更高。5.2 错误日志、慢查询日志、通用日志怎么开怎么看日志是“查看”数据库历史行为最重要的入口。三类日志用途完全不同日志内容典型查看场景错误日志启动报错、崩溃堆栈、权限问题服务起不来、初始化失败慢查询日志执行时间超过阈值的SQL线上慢SQL分析通用日志所有客户端执行的SQL审计、追踪误操作先看错误日志在哪SHOW VARIABLES LIKE log_error;Linux默认在数据目录下文件名一般是主机名.err。刚安装MySQL时如果日志提示密码相关的内容也可能是错误日志文件。当年CentOS上RPM安装MySQL后查看初始临时密码用的就是grep temporary password /var/log/mysqld.log如果你在安装时看到“rootlocalhost的随机密码已生成”之类的提示但没存下来去这个文件里翻是标准解法。慢查询日志相关参数SHOW VARIABLES LIKE slow_query_log; SHOW VARIABLES LIKE long_query_time; SHOW VARIABLES LIKE slow_query_log_file;临时开启慢查询SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1;long_query_time单位是秒设成1表示超过1秒的查询记录进去。然后直接查看慢日志文件tail -f /var/lib/mysql/机器名-slow.log更省事的是用自带工具统计mysqldumpslow -s at /var/lib/mysql/机器名-slow.log-s at表示按平均执行时间排序能快速找出最该优化的那批SQL。通用日志默认关闭因为它会把所有SQL都写下来并发高的时候磁盘占用很吓人。临时查看可以这样开启SET GLOBAL general_log ON; SHOW VARIABLES LIKE general_log_file;用完记得关掉否则日志文件会一路膨胀这是我吃过亏的地方。5.3 容器化部署的MySQL怎么进去查看现在MySQL跑在容器里的情况越来越多很多人找不到“进去查看”的入口。其实容器化之后思路很简单先把命令送进容器再执行正常MySQL命令。docker exec -it my-mysql mysql -uroot -pmy-mysql是容器名后面紧跟的mysql就是容器内的MySQL客户端。如果只想看版本docker exec -it my-mysql mysql -VK8s环境则换成kubectl exec -it mysql-pod-name -- mysql -uroot -p容器里MySQL的配置文件路径和物理机类似通常是/etc/my.cnf数据目录是/var/lib/mysql。日志不要进容器里翻直接看容器日志反而更快docker logs my-mysql | tail -100另外容器内查看MySQL进程是否在跑docker exec -it my-mysql ps aux | grep mysqld如果容器日志里反复出现“Access denied for user rootlocalhost”这类内容说明账号密码层面有问题再用上面第4章的连接数查看命令配合排查基本能一步步逼近真相。6. 数据字典 information_schema进阶玩家都在用的“透视眼”6.1 information_schema 到底存了什么MySQL每个实例都有一个叫information_schema的库里面保存的是所有数据库、表、列、索引、进程、事务等元数据。它本身不存放业务数据但通过它可以“透视”整个实例的全局情况。我第一次理解它的定位是把它类比成操作系统的任务管理器加资产管理器——既能看运行状态又能看资源占用。最常用的几个视图TABLES每个表的大小、行数估算、碎片COLUMNS每个字段的定义STATISTICS索引信息PROCESSLIST当前连接本质就是SHOW PROCESSLIST的数据来源ROUTINES存储过程和函数TRIGGERS触发器。直接在库名前面加information_schema.前缀来查询比如SELECT * FROM information_schema.tables WHERE table_schema test\G这样逐条看不方便一般我们会用聚合查询下面给几个我反复在用的模板。6.2 用数据字典看库大小、找大表、查碎片统计所有库的大小执行SELECT table_schema, ROUND(SUM(data_length index_length) / 1024 / 1024, 2) AS size_mb FROM information_schema.tables GROUP BY table_schema ORDER BY size_mb DESC;data_length是数据部分字节数index_length是索引部分字节数两者相加除以1024再除以1024就是MB。通常在磁盘告警时我第一条就查这个看看哪个库膨胀得最厉害。查看某个库内最大的10张表SELECT table_name, table_rows, ROUND((data_length index_length) / 1024 / 1024, 2) AS size_mb FROM information_schema.tables WHERE table_schema test ORDER BY size_mb DESC LIMIT 10;再次提醒table_rows是估算值和真实行数差距可能很大尤其频繁增删的表。它更适合用來快速定位“哪些表可能很大”而不是做精确统计。想要精确就COUNT(*)但大表COUNT会扫全表谨慎用。查数据碎片SELECT table_schema, table_name, data_free FROM information_schema.tables WHERE data_free 100 * 1024 * 1024;data_free单位是字节条件写了100MB以上。碎片主要来自大量DELETE和随机UPDATEInnoDB的表文件不会立刻收缩。确认碎片后可以通过OPTIMIZE TABLE 表名;清理。执行OPTIMIZE会把表重建一次生产环境务必在低峰期操作。6.3 主从复制状态与远程表同步如果你要看的MySQL上有主从复制那么“查看”的需求还包括复制状态。MySQL 5.7及以下用SHOW MASTER STATUS; SHOW SLAVE STATUS\GMySQL 8.0.22之后SLAVE字样逐步被REPLICA替换SHOW MASTER STATUS; SHOW REPLICA STATUS\G执行后重点看这几项Slave_IO_Running和Slave_SQL_Running是否为YesSeconds_Behind_Master是从库落后主库的秒数Last_SQL_Errno和Last_SQL_Error是最近一次同步报错。IO线程负责拉取主库binlogSQL线程负责把binlog应用到本地哪个线程不是Yes问题就在对应环节。有不少开发问“怎么把远程库的这张表同步到本地”这其实也是“查看迁移”的典型需求。如果只是一次性同步最简单的做法是mysqldump导出再导入# 远程导出单表数据 mysqldump -h远程IP -P3306 -uroot -p 数据库名 表名 table.sql # 本地导入 mysql -h127.0.0.1 -uroot -p 本地库名 table.sql只想导表结构不带数据加上--no-data只想导数据不重建表加上--no-create-info。如果需要持续同步那就要配置正式的主从复制并在从库上用replicate-do-table库.表指定只同步某一张表。具体配置过程比较长这里先记住查看状态的方法配置之前先确认log_bin已开启SHOW VARIABLES LIKE log_bin;没开binlog的话主从复制无从谈起。7. 查看过程中的高发翻车现场与排查套路7.1 error 2002 连不上 socket 怎么办热搜词里有一条很典型的报错ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock。这几乎是每台MySQL新机器都会遇到的拦路虎。报错本身已经说得很直白——客户端想通过socket文件连本地MySQL但连不上。排查思路按顺序来。先看MySQL进程在不在ps aux | grep mysqld如果找不到mysqld进程说明服务没起来那就看错误日志cat /var/log/mysqld.log | tail -50如果进程在再看socket文件是否存在ls -l /tmp/mysql.sock文件不存在多半是mysqld没起来或者在别的地方生成了socket文件存在就要对比客户端连接用的socket路径和MySQL实际生成的socket路径是否一致。看一下配置grep -E socket|port /etc/my.cnf如果socket被改到/var/run/mysqld/mysqld.sock客户端还按默认/tmp/mysql.sock去连自然就报error 2002。解决办法要么指定正确socket连接mysql -S /var/run/mysqld/mysqld.sock -uroot -p要么干脆走TCPmysql -h127.0.0.1 -P3306 -uroot -p这里我特别强调一个经典误区mysql -uroot -p走socketmysql -h127.0.0.1 -uroot -p走TCP。如果你在代码里用localhost作为数据库地址连接的也是socket改成127.0.0.1才会走TCP。很多“程序连不上、命令行却能连上”的问题根源就在这里。7.2 权限不够导致看不到数据怎么办用普通账号登录后执行SHOW DATABASES发现列表里只有几个库或者执行SELECT报SELECT command denied这不是MySQL坏了是权限受限。先看自己有哪些权限SHOW GRANTS FOR app_user%;看所有用户列表SELECT user, host FROM mysql.user;如果确实需要查看权限用管理员账号授权GRANT SELECT ON test.users TO app_user%; FLUSH PRIVILEGES;GRANT的粒度可以到库或表甚至字段级。一个常见的生产规范是只给业务账号SELECT权限不给DROP、DELETE等高危权限避免手滑。所以当你发现某个账号“查不了”先不要想着绕过去停下来确认这个账号应该有什么权限更重要。我还遇到过一种情况账号权限正确但客户端报Access denied for user rootlocalhost。这通常是因为root账号只允许从localhost登录而你从别的机器远程用root连接就被拒绝。快速验证方式就是在本机上执行一遍同样命令能通则说明是host限制问题需要检查账号对应的host范围。7.3 图形客户端连不上SSL、驱动、端口视角图形工具连MySQL报错和命令行报错常常是不同维度的。首当其冲是SSL问题。很多新版本MySQL默认开了SSL要求而旧客户端或某些连接方式没做SSL协商就会报SSL connection error。解决思路有两种要么在连接参数里显式关闭SSL比如命令行客户端加--ssl-modeDISABLED要么在Navicat、DBeaver的连接设置里把SSL相关选项关掉或选择“首选但不用”。其次是端口问题。确认目标机器的3306端口能不能通telnet 127.0.0.1 3306排除连接问题时也要看MySQL的bind_addressSHOW VARIABLES LIKE bind_address;默认值*表示允许所有IP访问如果被设置成127.0.0.1那就只有本机能连远程客户端自然连不上。此时需要改配置并重启或者确认是否需要对外开放。最后是驱动问题常见的表现是DBeaver首次连接时提示找不到驱动。离线环境下载对应版本的mysql-connector-java在DBeaver连接设置的“驱动属性”或“库管理”里添加jar包就能解决。这类问题不属于SQL知识但真的是查看MySQL前最容易卡住的一环顺手记一下能省半小时。写到这里“mysql怎么查看”这个问题算是被拆得七七八八了。我的体会是查看命令本身都不难难的是搞清楚自己要查哪个层面。结构、数据、状态、配置、日志、元数据各有一套对应的查看姿势先定位需求属于哪一层再选工具和命令效率会高出非常多。把这篇存下来下次遇到数据库告警或者连接报错从进程、日志、状态三个方向入手大概率能在十分钟内找到线索。
返回列表