目录
背景
第一部分 TCP/IP Socket
第二部分 UNIX Domain Socket
第三部分 Mysql的两种连接方式
参考文献及资料
背景
我们在使用Mysql客户端和Mysql交互的时候,如果客户端是远程(非本机)那么底层是通过TCP/IP的Socket方式进行交互。但是如果客户端和数据库在同一台服务器上时,Mysql支持通过UNIX Domain Socket方式交互。
Mysql客户端和Mysql数据库服务通信,不管是本机还是远程,其本质是两个计算机进程之间的通信。根据位置的不同分为:本机进程通信和网络间进程通信。
本机进程通信。Linux通常有:管道、信号量、消息队列、信号、共享内存、UNIX Domain Socket套接字。
网络间进程通信。TCP/IP Socket
本文将介绍将介绍这两种交互方式。
第一部分 TCP/IP Socket
提到通信,那么首先需要解决是身份识别问题。对于本机进程,不同的进程都有操作系统分配的进程号(process ID)作为唯一标识。但是网络间进程通信时候,PID就不能作为唯一标识了,另外操作系统支持的网络协议不同。所以网络间进程通信需要解决唯一身份标识和网络协议识别问题。
在网络编程中,TCP/IP和Socket两个概念没有必然的联系。Socket编程接口在设计的时候,也能支持其他的网络协议。所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象封装,形成了几个最基本的函数接口。例如create,listen,accept,connect,read和write等等。
第二部分 UNIX Domain Socket
UNIX domain socket 用于本机进程通信更有效率。不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号、路由和应答等,只是将应用层数据从一个进程拷贝到另一个进程。UNIX domain socket与 TCP/IP Socket相比较,在同一台主机的传输速度前者是后者的两倍。
另外下面的命令可以查看当前操作系统中UNIX domain socket通信清单:
netstat -a -p –unix第三部分 Mysql的两种连接方式3.1 UNIX Domain Socket方式
客户端部署在Mysql本机,配置好环境变量,就可以使用下面的命令登录Mysql。
[root@mysql ~]# mysql -uroot -P*****Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 1Server version: 5.5.46-log MySQL Community Server (GPL)Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.root@[(none)]>
这时候就是通过UNIX Domain Socket方式和Mysql进行交互的。只是这时候我们没有指定参数–socket,这个参数指定就是UNIX Domain Socket依赖的socket 类型的文件。Mysql默认这个参数为:–socket=/tmp/mysql.sock。如果安装Mysql时候,配置文件my.cnf中下面配置错误或文件丢失,就会报错。
[client] socket=/tmp/mysql.sock
报错找不到sock文件:
[root@mysql ~]# mysql -uroot -P*****ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
遇到这种报错的处理方法:
使用find命令查找文件路径,调整配置,使其归位。如果文件不再配置文件指定位置,这时候需要在命令中指定具体的路径,命令如下:
[root@mysql ~]# mysql -uroot -P***** -S /path/of/mysql.scok
重新创建。可以简单地通过重启Mysql服务重新创建得到它。因为服务在启动时重新创建它。
另外可以通过查看Mysql变量信息来查看这个文件路径配置路径:
mysql> SHOW VARIABLES LIKE ‘socket’; ————— —————– | Variable_name | Value | ————— —————– | socket | /tmp/mysql.sock | ————— —————– 1 row in set (0.00 sec)mysql -uroot -S/tmp/mysql.sock3.2 TCP/IP Socket方式
在本机使用UNIX Domain Socket方式无法登陆时候,还可以使用TCP/IP Socket方式。命令需要指定IP信息,如:
[root@mysql ~]# mysql -h192.1.1.20ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.1.1.20’ (111)[root@mysql ~]# mysql -h192.1.1.20 -P3307Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 3Server version: 5.5.46-log MySQL Community Server (GPL)Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.root@[(none)]>
那么如果本机中同时指定两个参数时候,Mysql会默认使用TCP/IP Socket的方式连接。
[root@mysql ~]# mysql -h192.1.1.20 -P3306 -S /path/of/mysql.scokWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 2Server version: 5.5.46-log MySQL Community Server (GPL)Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.root@[(none)]>
对于和远程Mysql服务交互,需要指定远程Mysql服务监听IP和端口即可,不再赘述。
参考文献及资料
1、Linux进程间通信方式有哪些?,链接:https://zhuanlan.zhihu.com/p/63916424
2、UNIX Domain Socket IPC,链接:http://docs.linuxtone.org/ebooks/C&CPP/c/ch37s04.html