MySQL总共支持四种连接方式访问数据库,如下表格所示,其中Linux平台环境下,主要有两种连接方式,一种是TCP/IP连接方式,另外一种是socket方式。Name pipe和Share memory是Windows平台下独有的连接方式。

那么,MySQL数据库中,我们能否查看会话具体使用的连接方式呢(例如,使用TCP/IP连接方式)?如果有的话,总共有哪一些方法呢? 下面简单总结一下。

方法1:status命令查看

如下所示,socket方式连接数据库的话,会有UNIX socket这样的信息(红色部分信息)

mysql>status;
--------------
mysqlVer8.0.33forLinuxonx86_64(MySQLCommunityServer-GPL)

Connectionid:9
Currentdatabase:
Currentuser:root@localhost
SSL:Notinuse
Currentpager:stdout
Usingoutfile:''
Usingdelimiter:;
Serverversion:8.0.33MySQLCommunityServer-GPL
Protocolversion:10
Connection:LocalhostviaUNIXsocket
Servercharacterset:utf8mb4
Dbcharacterset:utf8mb4
Clientcharacterset:utf8mb4
Conn.characterset:utf8mb4
UNIXsocket:/tmp/mysql.sock
Binarydataas:Hexadecimal
Uptime:4hours8min7sec

Threads:3Questions:45Slowqueries:9Opens:153Flushtables:3Opentables:72Queriespersecondavg:0.003
--------------

mysql>

如下所示,TCP/IP方式连接数据库的话,会有xxx.xxx.xxx.xxx via TCP/IP以及TCP port这样的信息(红色部分的信息)

mysql>status
--------------
mysqlVer8.0.33forLinuxonx86_64(MySQLCommunityServer-GPL)

Connectionid:10
Currentdatabase:
Currentuser:test@10.160.2.55
SSL:CipherinuseisTLS_AES_256_GCM_SHA384
Currentpager:stdout
Usingoutfile:''
Usingdelimiter:;
Serverversion:8.0.33MySQLCommunityServer-GPL
Protocolversion:10
Connection:10.160.2.53viaTCP/IP
Servercharacterset:utf8mb4
Dbcharacterset:utf8mb4
Clientcharacterset:utf8mb4
Conn.characterset:utf8mb4
TCPport:3306
Binarydataas:Hexadecimal
Uptime:4hours8min47sec

Threads:3Questions:48Slowqueries:9Opens:153Flushtables:3Opentables:72Queriespersecondavg:0.003
--------------

mysql>

但是status命令有一个很大的弊端,只能查看当前会话的连接方式,不能查看其它会话的连接信息,而我们一般主要是查看其它会话的连接方式。所以,这个命令非常有局限性。

方法2:通过通用查询日志(general log)查看

如下所示,你在通用查询日志(general log)中,你可以看到会话的连接的方式(红色部分信息),但是一般情况下,MySQL数据库并不会开启通用查询日志,所以对于这种方法,我们仅需知道有这么一种方法,但是其实很少使用,就像你知道走路能走到北京去一样,你根本不可能选择这种方法。

2023-11-09T16:16:13.614201+08:0011Queryshowvariableslike'%general_log%'
2023-11-09T16:16:26.614163+08:0011Queryselectuser,hostfrommysql.user
2023-11-09T16:18:21.214091+08:0011Queryshowvariableslike'%port%'
2023-11-09T16:18:42.378325+08:0012Connecttest@10.160.3.104onusingSSL/TLS
2023-11-09T16:18:42.378492+08:0012ConnectAccessdeniedforuser'test'@'10.160.3.119'(usingpassword:YES)
2023-11-09T16:18:47.802135+08:0013Connecttest@10.160.3.104onusingSSL/TLS
2023-11-09T16:18:47.802659+08:0013Queryselect@@version_commentlimit1
2023-11-09T16:18:57.006583+08:0011Quit
2023-11-09T16:19:28.448989+08:0014Connectroot@localhostonusingSocket
2023-11-09T16:19:28.449468+08:0014Queryselect@@version_commentlimit1
2023-11-09T16:19:30.701042+08:0014Quit

方法3:MySQL的Enterprise Audit log查看

这种方法仅仅适用于MySQL企业版,MySQL社区版无法使用这种方法,所以也有一定的局限性。如下所示:

<AUDIT_RECORD>
<TIMESTAMP>2023-11-09T10:28:58UTC</TIMESTAMP>
<RECORD_ID>16_2023-11-09T10:28:00</RECORD_ID>
<NAME>Connect</NAME>
<CONNECTION_ID>8</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER>root</USER>
<OS_LOGIN/>
<HOST>localhost</HOST>
<IP/>
<COMMAND_CLASS>connect</COMMAND_CLASS>
<CONNECTION_TYPE>SharedMemory</CONNECTION_TYPE>
<PRIV_USER>root</PRIV_USER>
<PROXY_USER/>
<DB/>
</AUDIT_RECORD>

方法4:通过performance_schema.threads查看

performance_schema.threads中有个字段connection_type,它记录了会话的连接方式,所以,我们可以通过这个表查看会话的连接方式。而且这种方法最方便,实用。

CONNECTION_TYPE的取值如下:

Theprotocolusedtoestablishtheconnection,orNULLforbackgroundthreads.Permittedvaluesare:

TCP/IP(TCP/IPconnectionestablishedwithoutencryption),
SSL/TLS(TCP/IPconnectionestablishedwithencryption),
Socket(Unixsocketfileconnection),
NamedPipe(Windowsnamedpipeconnection),
SharedMemory(Windowssharedmemoryconnection).

查看所有非后台线程的连接方式:

selectprocesslist_id
,processlist_user
,processlist_host
,thread_id
,connection_type
fromperformance_schema.threads
whereprocesslist_userisnotnull
orderbythread_id;

–查看某个会话的连接方式:

selectprocesslist_id
,processlist_user
,processlist_host
,thread_id
,connection_type
fromperformance_schema.threads
whereprocesslist_userisnotnull
andprocesslist_id=xxx--xxx用具体会话ID替换
orderbythread_id;

扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐”一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.