MySQL は対応するクライアント プロセスにどのように接続しますか?

MySQL は対応するクライアント プロセスにどのように接続しますか?

質問

特定の MySQL 接続について、それがどのクライアント プロセスからのものであるかをどのように知ることができますか?

ハンドシェイクレスポンス

MySQL クライアントが MySQL サーバーに接続すると、ユーザー名とパスワードがサーバーに送信されるだけでなく、現在のプロセス ID、オペレーティング システム名、ホスト名などの情報もサーバーに送信されます。このデータ パケットは HandshakeResponse と呼ばれ、公式 Web サイトにそのフォーマットの詳細な説明があります。

接続ドライバーを自分で変更し、これを使用して接続時に送信される情報を確認できるようになりました。

2020-05-19 15:31:04,976 - mysql-connector-python.mysql.connector.protocol.MySQLProtocol.make_auth - メインスレッド - 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 パケットのバイト形式は次のとおりです。送信されるデータはパケットの最後にあります。

4 つの機能フラグ、CLIENT_PROTOCOL_41 は常に設定されています
4 最大パケットサイズ
1文字セット
文字列[23] 予約済み(すべて[0])
文字列[NUL] ユーザー名
 機能とCLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA {の場合
lenenc-int 認証応答の長さ
文字列[n] 認証応答
 } それ以外の場合、機能と CLIENT_SECURE_CONNECTION が
1 認証応答の長さ
文字列[n] 認証応答
 } それ以外 {
文字列[NUL] 認証応答
 }
 機能とCLIENT_CONNECT_WITH_DB {
文字列[NUL] データベース
 }
 機能とCLIENT_PLUGIN_AUTH {
文字列[NUL] 認証プラグイン名
 }
 機能とCLIENT_CONNECT_ATTRS {
lenenc-int すべてのキー値の長さ
lenenc-str キー
lenenc-str 値
  'すべてのキーと値の長さ' にデータがある場合、キーと値のペアがさらにあります
 }

解決

前述の内容から、MySQL クライアントが現在のプロセス ID を MySQL サーバーに送信していることがわかります。これが問題を解決するための最も基本的な可能性を提供します。サーバーはこの情報を受信すると、performance_schema.session_connect_attrs に保存します。

最初のステップは、関心のある接続、その接続元の IP、およびその processlist_id について information_schema.processlist を照会することです。

mysql> information_schema.processlist から * を選択します。
+----+---------+--------------------+--------------------+--------+-----------+-----------+----------------------------------------------+
| ID | ユーザー | ホスト | DB | コマンド | 時間 | 状態 | 情報 |
+----+---------+--------------------+--------------------+--------+-----------+-----------+----------------------------------------------+
| 8 | ルート | 127.0.0.1:57760 | performance_schema | クエリ | 0 | 実行中 | information_schema.processlist から * を選択 |
| 7 | appuser | 172.16.192.1:50198 | NULL | スリープ | 2682 | | NULL |
+----+---------+--------------------+--------------------+--------+-----------+-----------+----------------------------------------------+
セットに2行(0.01秒)

2番目のステップは、performance_schema.session_connect_attrsを介して接続のプロセスIDを照会することです。

mysql> processlist_id = 7 の場合、session_connect_attrs から * を選択します。               
+----------------+-----------------+------------------------+------------------+
| プロセスリスト ID | ATTR_NAME | ATTR_VALUE | ORDINAL_POSITION |
+----------------+-----------------+------------------------+------------------+
| 7 | _pid | 58471 | 0 |
| 7 | _プラットフォーム | x86_64 | 1 |
| 7 | _source_host | NEEKYJIANG-MB1 | 2 |
| 7 | _client_name | mysql-connector-python | 3 |
| 7 | _client_license | GPL-2.0 | 4 |
| 7 | _クライアントバージョン | 8.0.20 | 5 |
| 7 | _os | macOS-10.15.3 | 6 |
+----------------+-----------------+------------------------+------------------+
セット内の行数は 7 です (0.00 秒)

processlist_id = 7 の接続は、172.16.192.1 のプロセス 58471 によって開始されていることがわかります。

診る

ipython を使用してデータベースに接続したところ、ps から表示された結果は 58471 とまったく同じで、クエリ結果と一致していました。

 ps -ef | grep 58471
 501 58471 57741 0 3:24 PMttys001 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 接続の対応するクライアント プロセスの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL mysqladmin クライアントの使用の概要
  • MySql クライアントが数秒で終了する問題を解決する (my.ini が見つからない)
  • PHP Swoole 非同期 MySQL クライアント実装例
  • Node.js mysqlクライアントが認証プロトコルをサポートしていない問題を解決する
  • mysql8.0.11クライアントがログインできない問題の解決方法
  • 絵文字と問題解決のためのMySQL/Javaサーバーサポートの詳細な説明
  • NodeJS サーバー開発入門 (Express+MySQL)
  • アプリケーション サーバー用の MySQL 接続プール (高い同時実行性をサポート)
  • MySQLクライアントとサーバーのプロトコルの解釈

<<:  Docker で Tomcat、MySQL、Redis をインストールするための詳細な手順

>>:  テーブル内の要素のドラッグと並べ替えの問題について簡単に説明します

推薦する

HTML チェックボックスとラジオボタンスタイルの美化の簡単な例

HTML チェックボックスとラジオボタンスタイルの美化の簡単な例チェックボックス: XML/HTML...

CSS3でアニメーションを実装する3つの方法

これは、面接者の CSS に関する基本的な知識をテストするものです。 CSSでアニメーションを実装す...

mysql+mycat、負荷分散、マスタースレーブレプリケーション、読み取り/書き込み分離操作に基づく安定した高可用性クラスタを構築します。

データベースのパフォーマンス最適化には、一般的にクラスタリングが採用されています。Oracle クラ...

LinuxでIPを表示する方法の例

ネットワークの問題のトラブルシューティング、新しい接続のセットアップ、ファイアウォールの構成を行うと...

hasLayout によって発生する CSS バグの一覧

IE には長い間問題がありました。誰もがテストを受けたとき、誰もが笑顔でしたが、それはただのニヤニヤ...

Linux が Sudo 権限昇格の脆弱性を公開、どのユーザーでも root コマンドを実行可能

Linux で最も一般的に使用される重要なユーティリティの 1 つである Sudo は、ほぼすべての...

Saltstack に Zabbix サービスをデプロイする方法を説明します

目次SaltstackがZabbixサービスを導入httpd、mysql、phpをインストールするh...

LinuxでIPアドレスが表示されない問題の解決方法

目次序文解決:ステップ1ステップ2序文環境: VMware Workstation 上に Linux...

MySqlサブクエリINの実装と最適化

目次IN が遅いのはなぜですか? INとEXISTSのどちらが速いでしょうか?効率を向上させるにはど...

Vue プロジェクトをパッケージ化して Apache サーバーにデプロイする手順

開発環境では、vue プロジェクトは、ローカルで Express サーバーを構築することをベースにし...

MySQL 5.7.17 とワークベンチのインストールと設定のグラフィックチュートリアル

この記事では、MySQL 5.7.17ワークベンチのインストールと設定方法を参考までに紹介します。具...

Linux カーネル デバイス ドライバー システム コールに関する注意事項

/**************************** * システムコール**********...

Ubuntu システムでタイムゾーンと時刻を変更する方法

Linux コンピュータには 2 つの時間があります。1 つはハードウェア時間 (BIOS に記録さ...

Linux は、ディレクトリが存在するかどうかを判断するために if を使用します。

Linux で if を使用してディレクトリが存在するかどうかを判断する方法方法は次のとおりです。...

フロントエンドの上級者向けコースでは、JavaScript のストレージ機能の使い方を学習します。

目次序文背景実施計画の考え方js ストレージ機能ソリューション設計やっと要約する序文どの SaaS ...