MySQL 如何連接對應的客戶端進程
問題
對于一個給定的 MySQL 連接,我們如何才能知道它來自于哪個客戶端的哪個進程呢?
HandshakeResponse
MySQL-Client 在連接 MySQL-Server 的時候,不只會把用戶名密碼發(fā)送到服務端,還會把當前進程id,操作系統(tǒng)名,主機名等等信息也發(fā)到服務端。這個數據包就叫 HandshakeResponse 官方有對其格式進行詳細的說明。
我自己改了一個連接驅動,用這個驅動可以看到連接時發(fā)送了哪些信息。
2020-05-19 15:31:04,976 - mysql-connector-python.mysql.connector.protocol.MySQLProtocol.make_auth - MainThread - INFO - conn-attrs {'_pid': '58471', '_platform': 'x86_64', '_source_host': 'NEEKYJIANG-MB1', '_client_name': 'mysql-connector-python', '_client_license': 'GPL-2.0', '_client_version': '8.0.20', '_os': 'macOS-10.15.3'}
HandshakeResponse 包的字節(jié)格式如下,要傳輸的數據就在包的最后部分。
4 capability flags, CLIENT_PROTOCOL_41 always set 4 max-packet size 1 character set string[23] reserved (all [0]) string[NUL] username if capabilities & CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA { lenenc-int length of auth-response string[n] auth-response } else if capabilities & CLIENT_SECURE_CONNECTION { 1 length of auth-response string[n] auth-response } else { string[NUL] auth-response } if capabilities & CLIENT_CONNECT_WITH_DB { string[NUL] database } if capabilities & CLIENT_PLUGIN_AUTH { string[NUL] auth plugin name } if capabilities & CLIENT_CONNECT_ATTRS { lenenc-int length of all key-values lenenc-str key lenenc-str value if-more data in 'length of all key-values', more keys and value pairs }
解決方案
從前面的內容我們可以知道 MySQL-Client 確實向 MySQL-Server 發(fā)送了當前的進程 id ,這為解決問題提供了最基本的可能性。當服務端收到這些信息后雙把它們保存到了 performance_schema.session_connect_attrs。
第一步通過 information_schema.processlist 查詢關心的連接,它來自于哪個 IP,和它的 processlist_id 。
mysql> select * from information_schema.processlist; +----+---------+--------------------+--------------------+---------+------+-----------+----------------------------------------------+ | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | +----+---------+--------------------+--------------------+---------+------+-----------+----------------------------------------------+ | 8 | root | 127.0.0.1:57760 | performance_schema | Query | 0 | executing | select * from information_schema.processlist | | 7 | appuser | 172.16.192.1:50198 | NULL | Sleep | 2682 | | NULL | +----+---------+--------------------+--------------------+---------+------+-----------+----------------------------------------------+ 2 rows in set (0.01 sec)
第二步通過 performance_schema.session_connect_attrs 查詢連接的進程 ID
mysql> select * from session_connect_attrs where processlist_id = 7; +----------------+-----------------+------------------------+------------------+ | PROCESSLIST_ID | ATTR_NAME | ATTR_VALUE | ORDINAL_POSITION | +----------------+-----------------+------------------------+------------------+ | 7 | _pid | 58471 | 0 | | 7 | _platform | x86_64 | 1 | | 7 | _source_host | NEEKYJIANG-MB1 | 2 | | 7 | _client_name | mysql-connector-python | 3 | | 7 | _client_license | GPL-2.0 | 4 | | 7 | _client_version | 8.0.20 | 5 | | 7 | _os | macOS-10.15.3 | 6 | +----------------+-----------------+------------------------+------------------+ 7 rows in set (0.00 sec)
可以看到 processlist_id = 7 的這個連接是由 172.16.192.1 的 58471 號進程發(fā)起的。
檢查
我剛才是用的 ipython 連接的數據庫,ps 看到的結果也正是 58471 與查詢出來的結果一致。
ps -ef | grep 58471 501 58471 57741 0 3:24下午 ttys001 0:03.67 /Library/Frameworks/Python.framework/Versions/3.8/Resources/Python.app/Contents/MacOS/Python /Library/Frameworks/Python.framework/Versions/3.8/bin/ipython
以上就是MySQL 如何連接對應的客戶端進程的詳細內容,更多關于MySQL 連接對應的客戶端進程的資料請關注腳本之家其它相關文章!
相關文章
Lost connection to MySQL server during query的解決
經常在執(zhí)行sql語句時,會發(fā)現(xiàn)這個問題,一般就是連接mysql數據庫不穩(wěn)定2008-06-06mysql制作外鍵出現(xiàn)duplicate?key?name錯誤問題及解決
這篇文章主要介紹了mysql制作外鍵出現(xiàn)duplicate?key?name錯誤問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02