原文链接: https://blog.csdn.net/qq_42533216/article/details/121489614
引言
调试 MySQL 的时候, 本来想抓包看看, 结果死活抓不到包, 后来看到了这个老哥的博客, 感觉受到了启发, 特此转载过来.
问题
在 mysql 的启动过程中有时会遇到下述错误
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
请问 mysql.sock 这个文件到底起什么作用? 如何避免发生如此错误?
答案一
这个 mysql.sock 应该是 mysql 的主机和客户机在同一 host(物理服务器) 上的时候, 使用 unix domain socket 做为通讯协议的载体, 它比 tcp 快. 通常遇到这个问题的原因就是你的 mysql server 没运行起来.
问题来了,unix domain socket 是啥,它和tcp有啥区别?
看看你的 /tmp/mysql.sock
这个文件存在否? 正常情况下它应该在那里的, 或者用 netstat
看看结果中是否有Active UNIX domain sockets
.
netstat 命令你会用吗?
答案二
这个文件是用于 socket 连接的文件. 也就是只有你的守护进程启动起来这个文件才存在,但是你的 mysql 程序 (这个程序是客户端, 服务器端时 mysqld) 可以选择是否使用 mysql.sock 文件来连接 (因为这个方法只适合在 Unix 主机上面连接本地的 mysqld), 对于非本地的任何类型的主机. 这些在 MySQL 的手册 (包括晏子翻译的中文版本, 覆盖 3.23/4.0 版本) 都有说明. 只要看看就可以明白.
前面朋友说不能连接, 最大可能就是 mysqld 的这个守护进程没有启动.
答案三
Mysql 有两种连接方式:
- TCP/IP
- socket
下面是我关注的重点了
对 mysql.sock 来说, 其作用是 mysql 客户端程序 mysql 与 mysql 服务器端程序 mysqlserver 处于同一台机器, 发起本地连接时可用. 例如你无须定义连接 host 的具体 IP, 只要为空或 localhost 就可以. 在此种情况下, 即使你改变 mysql 的外部 port 也是一样可能正常连接.
因为 你在 my.ini 中或 my.cnf 中改变端口后, mysql.sock 是随每一次 mysql server 启动生成的. 已经根据你在更改完 my.cnf 后重启 mysql 时重新生成了一次, 信息已跟着变更.
那么对于外部连接, 必须是要变更 port 才能连接的.
找不到 mysql.sock 的处理方法, 出现以下的信息:
Got an error: Connection error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
mysql.sock 突然消失算是常见的问题. 如果是第一次安装 MySQL 后运行时出现, 那只要找出 mysql.sock 在哪里就可以了. 以上的信息表明, mysql.sock 应该是在 /var/lib/mysql/
下 , 如果你找了没找到, 就:
$ locate mysql.sock
就会出来了, 接着你就可以
$ mysqladmin -S /路径/mysql.sock -u root
如果是原来很正常的, 突然有一天系统告诉你找不到 mysql.sock 这鬼文件了, 怎么办? 那只好用/etc/rc.d/init.d/mysql restart 或者 service mysql restart 重启服务了
如果还不行. 就先
$ ps -aux | grep mysql
找 mysql 的进程.
$ kill mysql 进程号
确定全部 kill 光, 再 /etc/rc.d/init.d/mysql restart
或者 service mysql restart
重启服务.
文章评论