我曾经在凌晨两点被一个电话叫醒,电话那头是刚接手公司数据库运维的同事,语气很急:"MySQL连不上了,密码肯定没错,但就是报错!"我让他把完整的报错贴过来,他发了这么一行:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)我看完跟他说:"这跟密码没关系,服务多半没起来,或者客户端根本没找到MySQL。"他愣了一下:"啥?不是密码错了吗?"——这就是新手和资深运维之间最常见的认知差。这个报错在MySQL使用过程中出现频率极高,几乎每一个用过MySQL的人都会被它卡过一次。它本身不难解决,但背后涉及的排查思路、配置逻辑和故障场景,值得好好梳理清楚。
这篇文章我会从报错本身的含义讲起,再把完整的排查链路走一遍,最后把高频场景、配置文件里的坑,以及它周边容易出现的"兄弟报错"一次性讲透。不管是刚入门的学生、写业务代码的开发,还是兼顾运维的后端工程师,按这篇文章的思路去处理,基本不会再被ERROR 2002卡住。
1. 别被这串英文吓到:报错信息到底在说什么
1.1 一个凌晨的MySQL"假死"
说回开头的那个场景。同事当时的操作是执行mysql -uroot -p,输入密码后收到了ERROR 2002。他第一反应是"密码错了",连续试了几次都不对,于是急得给我打电话。
事实上,只要我们把报错信息拆开看,就能发现它讲的根本不是密码问题。Can't connect to local MySQL server through socket '/tmp/mysql.sock'这句话的核心信息是:MySQL客户端尝试通过一个本地socket文件去连接MySQL服务端,但连接失败了。而结尾的(2)是系统错误码,对应Linux下的ENOENT,意思是"文件或目录不存在"。
也就是说,客户端在/tmp/mysql.sock这个路径下根本找不到socket文件。这才是一切问题的起点。密码对不对,服务器验证都还没到那一步——它连门都没摸到。
1.2 拆解报错:连接的是socket,不是端口
很多新手在这里会产生一个根本性的误解:MySQL不是跑在3306端口上吗?为什么报错里说的是socket文件?
要理解这个问题,得先搞清楚MySQL连接有两种方式:
第一种是TCP/IP连接。客户端通过网络协议访问服务器的3306端口,这种方式可以跨机器、跨网络,只要网络通、防火墙放行、账号允许远程登录,就能连上。命令比如mysql -h 192.168.1.10 -P 3306 -uroot -p。
第二种是Unix socket连接。这种连接方式只能在MySQL服务所在的同一台机器上使用。客户端通过一个本地文件——也就是socket文件——与服务端进程通信。这个文件不是普通的数据文件,它是进程间通信(IPC)的端点。MySQL服务端启动时会创建这个文件,客户端连接时通过读写这个文件与服务器交换数据。整个过程不走网络协议栈,速度快、开销低,适合本机访问。
当我们执行不带-h参数的mysql -uroot -p时,MySQL客户端默认走的就是socket连接。而客户端默认寻找的socket路径是编译时内置的——大多数发行版和官方包默认是/tmp/mysql.sock,但也可能是/var/lib/mysql/mysql.sock或/var/run/mysqld/mysqld.sock,这取决于你用的什么系统、什么安装方式。
下面这张表把两种连接方式的区别列一下:
| 对比项 | TCP/IP连接 | Unix socket连接 |
|---|---|---|
| 使用场景 | 本机或远程 | 仅限本机 |
| 连接要素 | IP地址 + 端口号 | socket文件路径 |
| 关键命令 | mysql -h 127.0.0.1 -P 3306 | mysql -uroot -p(默认) |
| 受防火墙影响 | 是 | 否 |
| 性能 | 有网络协议栈开销 | 更快,进程间直接通信 |
| 报错特征 | ERROR 2003 Can't connect to MySQL server on 'host' | ERROR 2002 Can't connect through socket |
说得直白一点:报错信息里出现"through socket '/tmp/mysql.sock'",意味着客户端压根没走TCP,而是试图在本地找那个socket文件。如果找不到,自然就抛出了ERROR 2002。这就解释了为什么这个报错几乎只出现在本机连接MySQL的场景中。
1.3 socket与TCP:两种连接方式怎么选
知道了两种连接方式之后,你可能会有个疑问:我平时该用哪种?
我的建议是:同一台机器上做管理操作,用socket连接完全没问题,而且性能更好;但如果你的应用和数据库不在同一台机器,或者你希望模拟远程访问,就用TCP连接。关键是,你心里得清楚当前执行的那条命令到底走的哪条路。
有一个特别容易让人踩坑的细节:mysql -h localhost和mysql -h 127.0.0.1看起来差不多,但行为完全不同。在MySQL客户端里,localhost会被特殊处理为socket连接,而127.0.0.1才会真正走TCP/IP。也就是说,即使你写了-h localhost,它依然去找socket文件。如果你想测试TCP连接是否正常,一定要用-h 127.0.0.1或具体的机器IP。
注意:排查ERROR 2002时,如果有人建议你"试试加-h 127.0.0.1绕过socket",这个思路是可行且有效的。如果加上
-h 127.0.0.1之后能连上,说明TCP链路是通的,问题就锁定在socket链路或socket文件上;如果TCP也连不上,那就要往服务进程本身的方向排查。
2. 从报错到定位:五步检查链路
遇到ERROR 2002,别慌,更别一上来就重装MySQL。绝大多数情况下,按照下面这个顺序检查,五分钟之内就能定位问题。
2.1 第一步:先判断mysqld进程活没活
最优先要确认的,是MySQL服务端进程是否在运行。如果进程压根没启动,后面所有检查都是白费功夫。
ps -ef | grep mysqld不看grep自己那条(为避免干扰可以用ps -ef | grep [m]ysqld),只要看有没有mysqld进程即可。如果有,说明服务在跑;如果没有,说明服务没起来。
更严谨一点,可以同时看看3306端口是否处于监听状态:
ss -tlnp | grep 3306正常情况下会看到类似这样的输出:
LISTEN 0 128 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=1234,fd=32))端口在监听、进程在运行,说明服务端大概率是正常的。这时候问题多半出在socket路径不一致或权限上,继续往下看。如果进程不在、端口也没监听,那问题的性质就变了——不是"连不上",而是"服务没启动",跳到3.1节去处理。
这里有个细节:有时候mysqld进程在跑,但3306端口没有监听。这种情况通常意味着MySQL启动时绑定失败了,或者配置里指定了特殊的bind-address,又或者服务正在启动中还没完全就绪。总之,进程存在不等于服务可用,两者要交叉确认。
2.2 第二步:看socket文件在不在
确认服务在跑之后,直接去看看报错信息里提到的那个文件是否存在:
ls -l /tmp/mysql.sock如果文件存在,说明客户端要找到的东西其实在;如果提示No such file or directory,那就是文件缺失。这看起来是个很简单的检查,但结论的指向完全不同:
- 文件不存在:说明服务端没在这个路径创建socket文件,要么是路径配置不一致,要么是启动过程中崩溃导致文件没建出来。
- 文件存在:连接还是失败,那问题可能是权限不足,或者socket文件是"僵尸"残留(服务端没正常退出,但进程已经不在),后面章节会展开。
2.3 第三步:查错误日志,这里才有真相
很多人一遇到数据库问题就埋头试命令,其实真正的答案往往在错误日志里。MySQL的error log记录了服务启动、运行、崩溃的几乎所有关键信息。
不同系统、不同安装方式的日志路径不一样,常见位置有这么几个:
| 系统/场景 | 日志路径 |
|---|---|
| RHEL/CentOS,yum安装 | /var/log/mysqld.log |
| Debian/Ubuntu,apt安装 | /var/log/mysql/error.log |
| 通用二进制包 | datadir目录下,通常是/var/lib/mysql/主机名.err |
| 使用systemd | journalctl -u mysqld 或 journalctl -u mysql |
| Docker容器 | docker logs 容器名 |
查看日志的重点是找到最近一次启动的记录:
tail -50 /var/log/mysqld.log如果服务启动失败,日志里通常会有明确的提示,比如InnoDB: Unable to lock ./ibdata1(数据目录权限/占用问题)、Disk is full(磁盘满了)、Can't create/write to file '/tmp/mysql.sock'(socket目录无写权限)等。这些信息能直接告诉你要往哪个方向修复。
2.4 第四步:核对配置里的实际socket路径
日志没看出明显问题时,就要怀疑是不是客户端和服务端的socket路径不一致了。
MySQL的socket路径是在配置文件中指定的。先找出配置文件在哪:
mysql --help | grep 'Default options' -A 1输出会告诉你配置文件按什么顺序加载,通常依次是/etc/my.cnf、/etc/mysql/my.cnf、~/.my.cnf等。然后查看配置文件里有没有socket相关配置:
grep -r "socket" /etc/my.cnf /etc/mysql/ 2>/dev/null重点看两个部分的配置:
[mysqld]段下的socket,这是服务端创建socket文件的路径。[client]段下的socket,这是客户端默认连接的socket路径。
正常情况下这两个值应该指向同一个文件。如果服务端写的是/var/lib/mysql/mysql.sock,而客户端配置或客户端默认路径是/tmp/mysql.sock,那就会出现ERROR 2002——服务端建的文件客户端根本不去找。
确认服务端到底把socket建在哪,还可以用另一个方法:
mysqladmin -uroot -p var | grep socket或者直接看MySQL变量:
SHOW VARIABLES LIKE 'socket';这个命令需要能连上MySQL才能执行,所以如果完全连不上,最可靠的方式还是看配置文件和错误日志。
3. 高频场景处理方案:从"启动失败"到"路径不一致"
定位思路清楚了,接下来把实际工作中最常见的几个场景和对应解决方案一一过一遍。你遇到的ERROR 2002,大概率就是下面这几种情况之一。
3.1 场景A:服务确实没起来
这是最常见的情况。尤其在某些云服务器或刚装好的环境里,MySQL默认可能没有设置开机自启,或者上次关机时服务异常退出。处理方式按系统不同略有区别:
如果你的环境是systemd管理:
systemctl start mysqld # RHEL/CentOS系 systemctl start mysql # Debian/Ubuntu系 systemctl enable mysqld # 设置开机自启如果你的环境比较老,没有systemd,用service命令:
service mysqld start service mysql start如果手动启动也报错,那就别反复试了,直接看日志(参考2.3节)。我处理过的启动失败案例里,"磁盘满"和"数据目录权限不对"占了很大比例。可以用df -h快速确认磁盘,ls -ld /var/lib/mysql确认目录权限,数据目录的所有者应该是mysql:mysql。
另外说一个8.0版本特有的小知识点:MySQL 8.0安装后,初始密码是随机的,写在日志里。我见过不止一个新手因为不知道初始密码,误以为数据库坏了。用下面这个命令找到初始密码:
grep 'temporary password' /var/log/mysqld.log拿到初始密码后登录,再执行ALTER USER修改密码,就可以正常使用了。
3.2 场景B:socket路径不一致
第二种特别常见的情况,就是客户端和服务端的socket路径没有对齐。前面2.4节讲了怎么查实际路径,这里用一个真实例子说明。
我之前在某发行版上用官方二进制包部署MySQL 8.0,默认配置里[mysqld]的socket指向/var/lib/mysql/mysql.sock。但MySQL自带的命令行客户端mysql运行时,默认找的路径是/tmp/mysql.sock——这就是编译时的默认值,不会因为你数据目录不同而自动变化。
于是我每次执行mysql -uroot -p都会报ERROR 2002,非常恼人。解决办法很直接:在MySQL配置文件里增加一个统一的socket指向,让服务端和客户端都指向同一个文件。
[mysqld] socket=/var/lib/mysql/mysql.sock [client] socket=/var/lib/mysql/mysql.sock改完配置后重启MySQL,问题就解决了。这时候ls -l /var/lib/mysql/mysql.sock能看到socket文件,客户端也能正常连上了。
这里也提醒大家一个思路:socket连接不报错的条件,是服务端创建socket文件的路径、客户端寻找的路径、以及该路径对应的文件实际存在,三件事必须同时成立。任何一环断了,都会出现ERROR 2002。
3.3 场景C:/tmp目录被清,socket文件不翼而飞
这种情况在Linux服务器上尤其容易出现,坑过很多人。/tmp目录本身是一个"临时目录",系统可能定期清理,很多发行版还会通过systemd-tmpfiles-clean.timer等服务自动删除一定时间内未被访问的临时文件。
而MySQL默认把socket文件放在/tmp下,于是问题就来了:服务器跑得好好的,某天你突然发现MySQL连不上了,报错正是ERROR 2002。查了进程、端口、日志都一切正常,_l_一下发现/tmp/mysql.sock没了。
这种情况的处理方法有两种。
第一种,临时处理:重启MySQL,让它重新创建socket文件。虽然MySQL还保存着之前的连接,但socket文件需要重新生成,重启一下最省事。
第二种,根治:把socket文件挪出/tmp目录。比如统一放到/var/run/mysqld/或/var/lib/mysql/下,再加上systemd的RuntimeDirectory机制或者让mysql用户对该目录有持久写权限,这样就不会被/tmp的清理机制误伤。
我个人强烈建议用第二种。生产环境里,socket文件放在/tmp是一个隐患,不值得为了一张整洁的默认配置去赌服务器的清理策略。你可以在配置文件里把socket指向/var/run/mysqld/mysql.sock,同时确保该目录存在且mysql用户对它可写。
注意:如果你修改了socket路径,一定要同步修改
[client]段的配置,否则客户端还是会在默认路径找socket,又会回到路径不一致的坑里。
3.4 场景D:权限和SELinux惹的祸
这一类问题稍微隐蔽一点,报错看起来是"找不到socket",实际原因是"没有权限访问"。
情况一:socket文件存在,但当前用户没有权限访问。socket文件本身有权限属性,如果MySQL创建socket时设置的目录或文件权限过严,系统其他用户就无法通过它连接。检查一下目录的权限:
ls -ld /var/run/mysqld/正常情况下应该类似drwxr-xr-x mysql mysql,如果目录权限变成drwx------,普通用户访问时就会报错。解决办法是修正权限:
chown mysql:mysql /var/run/mysqld chmod 755 /var/run/mysqld情况二:SELinux阻挡了MySQL对特定目录的访问。这一般出现在开启SELinux的CentOS/RHEL系统上。如果socket文件配置在一个SELinux策略不允许的路径,MySQL服务端自己都创建不了文件,更别说客户端连接了。
判断方法:用getenforce查看SELinux状态,如果返回Enforcing,再用ausearch -m avc -ts recent查一下是否有SELinux拒绝记录。解决方式有两种,一劳永逸的做法是修改SELinux规则,让它放行MySQL的socket写入;如果只是想快速恢复,临时把SELinux设为Permissive模式再试,等确认问题原因后再决定怎么处理。
关于SELinux,生产环境建议的做法是,要么完整地配好策略,要么在可控的环境下合理关闭。最怕的就是遇到权限问题不去查SELinux,蒙着头排查半天,最后发现是策略拦截。
3.5 场景E:Docker容器里连接MySQL
现在的开发环境里,Docker跑MySQL已经非常普遍了。容器场景下的ERROR 2002,排查逻辑和宿主机一样,但多了一层"容器内外路径隔离"的问题。
用Docker MySQL镜像时要注意:官方镜像里MySQL服务端的socket路径通常是/var/run/mysqld/mysqld.sock,不是/tmp/mysql.sock。你在容器内执行mysql -uroot -p没问题,因为容器内客户端和服务端的socket路径是对齐的。但如果你在宿主机上执行mysql -uroot -p,宿主机上既没有mysqld进程,也没有那个socket文件,自然就会报ERROR 2002。
在Docker场景下,正确连接MySQL的方式有两种:
第一种,进入容器内部执行:
docker exec -it mysql容器名或ID mysql -uroot -p第二种,通过端口映射使用TCP连接:
mysql -h 127.0.0.1 -P 3306 -uroot -p前提是启动容器时做了端口映射,比如-p 3306:3306。
这里特别提醒一点:宿主机上执行mysql命令并不等于在容器里执行。很多新手用Docker跑MySQL后,在宿主机执行mysql -uroot -p,理所当然地以为能连上容器里的数据库,结果被ERROR 2002教育了一顿。记住,socket连接只存在于同一进程命名空间内部,容器内外是两个世界。
如果你希望在宿主机上直接连接容器里的MySQL,最推荐的做法就是走TCP端口映射。把3306端口映射出来后,别人的应用、你自己的开发工具,都通过127.0.0.1:3306来连,清爽又直接。
4. my.cnf里那些和socket有关的坑
如果你已经在生产环境摸爬滚打过一段时间,应该能体会到:很多"疑难杂症"的根源并不在系统层面,而在配置文件里。socket连接相关的配置坑,我梳理一下最常踩的几个。
4.1 [mysqld]改了socket,[client]也要跟着改
这个前面已经提过,但值得单独强调,因为它实在是太容易被忽略了。很多教程、博客在讲"如何修改MySQL socket路径"时,都只写[mysqld]段的配置,结果读者照做后,服务端是正常了,客户端却开始报错。
MySQL配置文件按段(section)区分作用范围:[mysqld]段影响服务端,[client]段影响所有客户端工具(mysql、mysqldump等)。如果你想修改socket路径,务必同时在这两段里都写好,否则就会出现"服务端把socket建在A路径,客户端仍在B路径找"的错位局面。
完整的配置示例:
[mysqld] socket=/var/run/mysqld/mysql.sock datadir=/var/lib/mysql [client] socket=/var/run/mysqld/mysql.sock改完配置后,记得重启MySQL,然后用mysql -uroot -p验证是否能连上。如果还报错,就检查一下客户端工具是否读了这份配置——有些自定义安装的客户端,配置文件加载路径可能不一样。
4.2 多实例部署时的socket隔离
一台机器上跑多个MySQL实例时(可能是不同版本,也可能是主从测试环境),每个实例默认都用3306端口显然不行,socket文件路径也不能共用,否则会冲突。
这种场景下的常规做法是给每个实例分配独立的端口和socket文件,比如:
# 实例1 [mysqld1] port=3307 socket=/var/run/mysqld/mysqld1.sock # 实例2 [mysqld2] port=3308 socket=/var/run/mysqld/mysqld2.sock连接不同实例时,用各自的socket路径或端口:
mysql -uroot -p -S /var/run/mysqld/mysqld1.sock mysql -uroot -p -h 127.0.0.1 -P 3308-S参数就是用来指定socket文件路径的。当你手上有多个实例、无法确定当前连接的是哪个时,搞清楚socket路径就是定位的关键。
多实例还有一个坑:你启动第二个实例时,如果忘了改socket路径,会发现第一个实例的socket文件被覆盖或启动直接失败。socket文件相当于一个实例的身份标识,绝对不能共用。
4.3 PHP/Python连接MySQL时的socket配置
业务代码连接数据库时,也会面临socket路径的配置问题。这对写应用的同学来说是个隐藏雷区。
以PHP的PDO_MySQL和mysqli扩展为例,它们的默认socket路径是在编译时指定的,不一定和你MySQL实际生成的socket路径一致。如果PHP配置里没写socket路径,或者写错了路径,应用连接数据库时就会报"connect to MySQL server through socket"之类的错误,表现和ERROR 2002完全一致。
PHP中可以在配置文件中设置:
mysqli.default_socket=/var/run/mysqld/mysql.sock pdo_mysql.default_socket=/var/run/mysqld/mysql.sock改完配置后记得重启PHP-FPM或Apache。
Python的PyMySQL在走socket连接时,如果不传host参数,默认也会尝试找本机的socket文件,路径一般是编译默认值。更清晰的做法是显式指定:
import pymysql connection = pymysql.connect( unix_socket='/var/run/mysqld/mysql.sock', user='root', password='yourpass', database='test', )或者干脆在代码里使用TCP连接:
connection = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yourpass', database='test', )我给你的建议是:应用代码统一走TCP连接,指定host和port,不要依赖默认socket路径。因为应用的运行环境多变,socket路径在不同系统上可能完全不同,而TCP连接的自包含特性让它更可控。socket连接适合人肉在服务器上执行管理命令,代码层面用TCP更可靠。
4.4 参数的优先级问题
MySQL配置还有一个通用规则:命令行参数优先级高于环境变量,环境变量高于配置文件。也就是说,你在启动服务时如果显式指定了--socket=/tmp/mysql.sock,那么它覆盖配置文件里的所有socket设置。
这个规则对排查问题非常有帮助。比如你明明在配置文件里写了socket路径是/var/lib/mysql/mysql.sock,但服务端实际生成的还是/tmp/mysql.sock,那你就要怀疑是不是启动脚本里或systemd服务单元文件里带了额外的启动参数,把它给覆盖了。
查看systemd服务单元里是否指定了额外参数:
systemctl cat mysqld看到ExecStart那一行,确认里面有没有写--socket=之类的参数。如果有,你需要决定是改启动参数还是改配置文件,确保两者一致。
优先级这个规则很多人不清楚,但它往往是"配置文件看起来改对了,但就是不生效"的幕后黑手。
5. ERROR 2002的"兄弟报错"速查
排查ERROR 2002的过程中,我们经常会碰到一堆看起来类似的报错。把它们的关系搞明白,你以后排查问题会快很多。这里列几个和ERROR 2002最容易混淆、也最高频出现的错误码。
5.1 ERROR 1045 Access denied:最容易混淆的邻居
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)这是一个认证错误。它和ERROR 2002最核心的区别是:1045说明你已经成功连上了MySQL服务器,但是用户或密码认证没通过。2002是"找不到服务端",1045是"找到服务端但你不被承认"。
刚入门的人经常把这两个混为一谈。我见过不少人在ERROR 2002时反复试密码,或者在ERROR 1045时去看socket路径,方向全错了。区分方法很简单:看报错前几个词,2002说"Can't connect",1045说"Access denied"。
1045的常见原因包括:密码真的错了、账号不允许从当前主机登录、账号根本不存在。处理方式重点是授权和密码重置,不是socket路径。
5.2 ERROR 2013 Lost connection:连接中途断开
ERROR 2013 (HY000): Lost connection to MySQL server during query这个报错的意思是:连接已经建立起来了,但执行查询的中途网络断了或者服务端把连接断了。它和2002不是一个阶段的问题——2002发生在"建立连接"之前,2013发生在"建立连接后的执行过程中"。
常见诱因有:max_allowed_packet设置太小、网络超时(wait_timeout、net_read_timeout等)、查询执行时间超过了服务端限制、或者服务在查询中途崩溃。排查时优先看慢查询日志和错误日志,再逐步调整相关的超时参数。
5.3 ERROR 1524与ERROR 1290:新版MySQL与skip-grant-tables的特殊情况
下面这两个报错和认证机制、特殊启动模式有关,也经常出现在从MySQL旧版本升级到新版本的过程中。
ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded是MySQL 8.4及之后版本用户可能会遇到的问题。MySQL 8.4开始,默认的认证插件从mysql_native_password切换为caching_sha2_password,旧插件默认不再加载。如果你从旧版本升级,而用户仍然使用旧插件认证,连接时就会报插件未加载。解决办法是改用新的认证插件,或按官方文档在配置里重新启用旧插件(但这只适合临时过渡,不建议长期使用)。
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option则是另一种情况:服务以跳过权限表的方式启动时,虽然能连上,但大多数需要权限校验的操作(比如ALTER USER、DROP DATABASE)会被拒绝,报错信息会提示你目前处于skip-grant-tables模式。这个模式通常用于忘记密码时重置密码,操作完成之后,一定要记得恢复正常模式并重启MySQL,否则数据库处于裸奔状态,安全隐患非常大。
把下面这个速查表存下来,遇到类似报错时先对号入座:
| 错误码 | 报错特征 | 本质阶段 | 常见原因 | 解决方向 |
|---|---|---|---|---|
| ERROR 2002 | Can't connect through socket | 建立连接前 | socket文件不存在、路径不一致、服务未启动 | 查进程、查路径、查日志 |
| ERROR 2003 | Can't connect to MySQL server on host | 建立连接前 | TCP端口不通、服务未监听 | 查端口、查防火墙、查网络 |
| ERROR 1045 | Access denied for user | 连接已建立,认证失败 | 密码错误、用户权限、host限制 | 重置密码、检查授权表 |
| ERROR 2013 | Lost connection during query | 连接建立后中断 | 网络超时、包过大、服务崩溃 | 调参数、查日志 |
| ERROR 1524 | Plugin is not loaded | 认证阶段 | 认证插件未加载 | 改用caching_sha2_password或重新启用插件 |
| ERROR 1290 | skip-grant-tables mode | 权限校验阶段 | 以跳过权限表模式运行 | 正常重启MySQL |
我个人排查这类问题多年,养成的一个习惯是:无论报错多吓人,先看三个地方——进程状态、socket文件路径、错误日志。90%的ERROR 2002都能在这三步里找到答案。另外一个体会是,socket路径这种东西,从一开始就统一规划好,写进配置文件并同步到团队文档里,能省掉后面大量的沟通成本。如果你也被这个报错折磨过,希望这篇文章能让你少走几趟弯路。