MySQL客户端建立连接的两种类型

 

通常,默认情况下,客户端连接MySQL服务器有两种类型:

使用 Unix 套接字文件通过文件系统中的文件进行连接(默认/tmp/mysql.sock),

或者使用通过端口号连接的 TCP/IP(此类通常涉及远程网络交互)。

Unix 套接字文件连接比 TCP/IP 更快,但只能在连接到同一台计算机上的服务器时使用。

其中,

  • 当客户端连接MySQL服务器,如果没有指定-h或者指定-h为localhost,则会连接到本地的主机(即此时客户端位于服务器上)。
     在Unix 上,MySQL 程序对主机名进行 localhost特殊处理,客户端使用 Unix 套接字文件进行连接。选项--socketMYSQL_UNIX_PORT环境变量可用于指定套接字名称。
  • 否则,连接使用TCP/IP。

--protocol选项使您能够使用特定的传输协议,即使其他选项通常会导致使用不同的协议。也就是说, --protocol明确指定传输协议并覆盖前面的规则,即使对于 localhost.

要确保客户端与本地服务器建立 TCP/IP 连接,请使用--host或 -h指定主机名为 127.0.0.1(而不是 localhost),或者本地服务器的 IP 地址或名称。您还可以通过使用--protocol=TCP选项明确指定传输协议,即使对于localhost,也是如此。

 

接下来实际测试一下。

开启两个CRT的会话,分别为S1,S2。

以下按照顺序执行。

测试1,--no-defaults避免my.cnf中已有的[client]参数的影响。

其中,netstat前后均无任何输出,表示mysql连接没有产生tcp协议。

S1:[root@mysql ~]# netstat -anputwo | grep mysqld | grep ESTABLISHED

S2:[root@mysql ~]# mysql --no-defaults -uroot -proot -S /data/mysql3306/mysql3306.sock
...省略部分内容...
(root@localhost 11:54:54) [(none)]> 

S1:[root@mysql ~]# netstat -anputwo | grep mysqld | grep ESTABLISHED

 

 

测试2:产生了tcp连接的协议。

S1:[root@mysql ~]# netstat -anputwo | grep mysqld | grep ESTABLISHED

S2:[root@mysql ~]# mysql --no-defaults -uroot -proot -h127.0.0.1
...省略部分内容...
(root@127.0.0.1 12:01:22) [(none)]> 

S1:[root@mysql ~]# netstat -anputwo | grep mysqld | grep ESTABLISHED
tcp6       0      0 127.0.0.1:3306          127.0.0.1:61023         ESTABLISHED 1659/mysqld          keepalive (7212.78/0/0)

 

测试3:在确认MySQL正常开启提供服务的前提下:如下,其中报错找不到socket文件,表示-hlocalhost默认是会找socket文件来连接数据库的,只是找不到而已。

默认的socket文件被我另外定义在别处了。

[root@mysql ~]# mysql --no-defaults -uroot -proot -hlocalhost
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

 

测试4:

S1:[root@mysql ~]# netstat -anputwo | grep mysqld | grep ESTABLISHED

S2:[root@mysql ~]# mysql --no-defaults -uroot -proot -hlocalhost --protocol=tcp
...省略部分内容...
(root@127.0.0.1 12:10:21) [(none)]> 

S1:[root@mysql ~]# netstat -anputwo | grep mysqld | grep ESTABLISHED
tcp6       0      0 127.0.0.1:3306          127.0.0.1:61029         ESTABLISHED 1659/mysqld          keepalive (7173.83/0/0)

 

 其他:

除了netstat之外,也可以通过如下方式查看连接类型:

其中,CONNECTION_TYPE表示类型。

(root@localhost 17:24:45) [(none)]> SELECT * FROM performance_schema.threads WHERE PROCESSLIST_ID = connection_id() \G
*************************** 1. row ***************************
          THREAD_ID: 84
               NAME: thread/sql/one_connection
               TYPE: FOREGROUND
     PROCESSLIST_ID: 30
   PROCESSLIST_USER: root
   PROCESSLIST_HOST: localhost
     PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Query
   PROCESSLIST_TIME: 0
  PROCESSLIST_STATE: executing
   PROCESSLIST_INFO: SELECT * FROM performance_schema.threads WHERE PROCESSLIST_ID = connection_id()
   PARENT_THREAD_ID: NULL
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: Socket
       THREAD_OS_ID: 20592
     RESOURCE_GROUP: USR_default
   EXECUTION_ENGINE: PRIMARY
1 row in set (0.00 sec)

 

 

 

参考官网:

https://dev.mysql.com/doc/refman/8.0/en/connecting.html

https://dev.mysql.com/doc/refman/8.0/en/can-not-connect-to-server.html

https://dev.mysql.com/doc/refman/8.0/en/transport-protocols.html