序文皆さんの多くは、次のようなエラー メッセージに遭遇したことがあると思います。この問題が発生した場合、どうすればよいでしょうか? MySQL 5.7 以前のバージョンでは、「接続が多すぎます」というエラーが表示され、スーパーユーザー root でログインできません。インスタンスを再起動する以外に、良い解決策はありません。しかし、MySQL 8.0 では、接続管理にいくつかの最適化が行われました。見てみましょう。 エラー 1040 (HY000): 接続が多すぎます 接続管理MySQL 8.0 では、接続管理に 2 つの大きな変更が加えられました。1 つは追加の接続を許可すること、もう 1 つは専用の管理ポートです。 追加の接続MySQL 8.0 では、現在の接続数が最大接続数に達すると、サーバーは 1 つの追加接続を許可し、CONNECTION_ADMIN 権限を持つユーザーが接続できるようにします。簡単なテストを行ってみましょう。 (1)テストを容易にするために、まず接続の最大数を調整する mysql> グローバル max_connections=3 を設定します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) (2)最大接続数に達するまでセッションを開く mysql> プロセスリストを表示します。 +----+-+---------------------------------+-------+---------+---------+------------------------+------------------+ | ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 | +----+-+---------------------------------+-------+---------+---------+------------------------+------------------+ | 15 | event_scheduler | localhost | NULL | デーモン | 154190 | 空のキューを待機中 | NULL | | 54 | root | localhost | NULL | クエリ | 0 | 開始 | プロセスリストを表示 | | 55 | テスト | 127.0.0.1:59120 | NULL | スリープ | 19 | | NULL | | 56 | テスト | 127.0.0.1:59136 | NULL | スリープ | 9 | | NULL | +----+-+---------------------------------+-------+---------+---------+------------------------+------------------+ セット内の 4 行 (0.00 秒) mysql> 'threads_connected' のようなグローバル ステータスを表示します。 +-------------------+------+ | 変数名 | 値 | +-------------------+------+ | スレッド接続数 | 3 | +-------------------+------+ セット内の 4 行 (0.01 秒) (3)通常のユーザーテストでは接続を試み、「接続が多すぎます」というエラーメッセージが報告される $ mysql -utest -p -h127.0.0.1 -P10080 パスワードを入力してください: エラー 1040 (08004): 接続が多すぎます (4)スーパーユーザールートが接続に成功する $ mysql -uroot -p パスワードを入力してください: MySQL モニターへようこそ。コマンドは ; または \g で終わります。 MySQL接続IDは60です サーバーバージョン: 8.0.20 MySQL コミュニティサーバー - GPL Copyright (c) 2000, 2020, Oracle およびその関連会社。無断複写・転載を禁じます。 OracleはOracle Corporationおよびその関連会社の登録商標です。 その他の名称は各社の商標である場合があります。 所有者。 ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。 マイSQL> (5)現在の接続数を再度確認する(max_connections + 1) +----+-+---------------------------------+-------+---------+---------+------------------------+------------------+ | ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 | +----+-+---------------------------------+-------+---------+---------+------------------------+------------------+ | 15 | event_scheduler | localhost | NULL | デーモン | 155064 | 空のキューを待機中 | NULL | | 54 | root | localhost | NULL | クエリ | 0 | 開始 | プロセスリストを表示 | | 55 | テスト | 127.0.0.1:59120 | NULL | スリープ | 893 | | NULL | | 56 | テスト | 127.0.0.1:59136 | NULL | スリープ | 883 | | NULL | | 60 | ルート | ローカルホスト | NULL | スリープ | 141 | | NULL | +----+-+---------------------------------+-------+---------+---------+------------------------+------------------+ セット内の行数は 5 です (0.00 秒) mysql> 'threads_connected' のようなグローバル ステータスを表示します。 +-------------------+------+ | 変数名 | 値 | +-------------------+------+ | スレッド接続数 | 4 | +-------------------+------+ セット内の 4 行 (0.00 秒) (6)スーパーユーザーrootが再度接続を試みますが、「接続数が多すぎます」というエラーメッセージも表示されます。 $ mysql -uroot -p パスワードを入力してください: エラー 1040 (HY000): 接続が多すぎます 上記のテストから、MySQL 8.0 では許可される接続数は max_connections+1 であり、この追加接続は CONNECTION_ADMIN 権限を持つユーザーにのみ許可されることがわかります。この追加の接続を通じて、DBA はスーパーユーザー root を使用して接続し、セッションの強制終了などの管理操作を実行してインスタンスを直接再起動するのを回避し、コストを削減して効率を向上させることができます。 管理ポートある程度、接続が多すぎるという問題に対して、追加の接続によって一時的な解決が得られます。ただし、追加の接続は 1 つだけなので、「接続が奪われる」や「端末が異常に切断される」などの事故が発生する可能性があります。そのため、MySQL 8.0.14 バージョンでは、非常に重要な新機能である管理ポートが導入されました。これにより、SERVICE_CONNECTION_ADMIN 権限を持つユーザーは、接続数に制限なく、特定の IP と PORT を介して接続できるようになります。 (1)まず関連するパラメータを導入する admin_address: リスニングIPアドレス admin_port: リスニングポート create_admin_listener_thread: 管理接続をリスニングするための別のスレッドを作成するかどうか (2)上記のパラメータを設定することで、管理ポートを有効にすることができます。 mysql> 'admin%' のようなグローバル変数を表示します。 +---------------+-----------+ | 変数名 | 値 | +---------------+-----------+ | 管理者アドレス | 127.0.0.1 | | 管理者ポート | 33062 | +---------------+-----------+ セット内の 2 行 (0.00 秒) # netstat -lntp | grep 33062 tcp 0 0 127.0.0.1:33062 0.0.0.0:* LISTEN 20042/mysqld (3)次にテスト mysql> プロセスリストを表示します。 +----+-+---------------------------------+-------+---------+---------+------------------------+------------------+ | ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 | +----+-+---------------------------------+-------+---------+---------+------------------------+------------------+ | 15 | event_scheduler | localhost | NULL | デーモン | 168750 | 空のキューを待機中 | NULL | | 54 | root | localhost | NULL | クエリ | 0 | 開始 | プロセスリストを表示 | | 55 | テスト | 127.0.0.1:59120 | NULL | スリープ | 14579 | | NULL | | 56 | テスト | 127.0.0.1:59136 | NULL | スリープ | 14569 | | NULL | +----+-+---------------------------------+-------+---------+---------+------------------------+------------------+ セット内の 4 行 (0.00 秒) mysql> 'threads_connected' のようなグローバル ステータスを表示します。 +-------------------+------+ | 変数名 | 値 | +-------------------+------+ | スレッド接続数 | 3 | +-------------------+------+ セット内の 1 行 (0.00 秒) (4)通常のユーザーテストでは接続を試み、「接続が多すぎます」というエラーメッセージが報告されます。 $ mysql -utest -p -h127.0.0.1 -P10080 パスワードを入力してください: エラー 1040 (08004): 接続が多すぎます (5)スーパーユーザールートは管理ポートを介して正常に接続を試みる $ mysql -uroot -p -h127.0.0.1 -P33062 パスワードを入力してください: MySQL モニターへようこそ。コマンドは ; または \g で終わります。 MySQL接続IDは62です サーバーバージョン: 8.0.20 MySQL コミュニティサーバー - GPL Copyright (c) 2000, 2020, Oracle およびその関連会社。無断複写・転載を禁じます。 OracleはOracle Corporationおよびその関連会社の登録商標です。 その他の名称は各社の商標である場合があります。 所有者。 ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。 マイSQL> (6)さらにいくつかのセッションを開き、スーパーユーザールートを使用し、管理ポートを介して正常に接続し、最大接続数max_connectionsによって制限されない。 mysql> プロセスリストを表示します。 +----+-+---------------------------------+-------+---------+--------+------------------------+------------------+ | ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 | +----+-+---------------------------------+-------+---------+---------+------------------------+------------------+ | 15 | event_scheduler | localhost | NULL | デーモン | 169035 | 空のキューを待機中 | NULL | | 54 | root | localhost | NULL | クエリ | 0 | 開始 | プロセスリストを表示 | | 55 | テスト | 127.0.0.1:59120 | NULL | スリープ | 14864 | | NULL | | 56 | テスト | 127.0.0.1:59136 | NULL | スリープ | 14854 | | NULL | | 62 | ルート | 127.0.0.1:47660 | NULL | スリープ | 151 | | NULL | | 63 | ルート | 127.0.0.1:47760 | NULL | スリープ | 52 | | NULL | | 64 | ルート | 127.0.0.1:47768 | NULL | スリープ | 43 | | NULL | | 65 | ルート | 127.0.0.1:47780 | NULL | スリープ | 35 | | NULL | | 66 | ルート | 127.0.0.1:47790 | NULL | スリープ | 24 | | NULL | | 67 | ルート | 127.0.0.1:47800 | NULL | スリープ | 16 | | NULL | | 68 | ルート | 127.0.0.1:47808 | NULL | スリープ | 8 | | NULL | +----+-+---------------------------------+-------+---------+---------+------------------------+------------------+ セット内の行数は 11 です (0.00 秒) mysql> 'threads_connected' のようなグローバル ステータスを表示します。 +-------------------+------+ | 変数名 | 値 | +-------------------+------+ | スレッド接続数 | 10 | +-------------------+------+ セット内の 1 行 (0.00 秒) 新しい管理ポート機能により、DBA は接続数が多すぎるという問題を心配する必要がなくなったと言えます。 要約するMySQL 8.0 では、接続数が多すぎるという状況に対処するために、追加接続と管理ポートという 2 つの新機能が導入され、DBA が問題を便利かつ迅速に解決できるようになりました。ただし、これはあくまでも一時的な緊急措置です。最も根本的な理由は、アプリケーション側の構成 (同時実行制限、SQL パフォーマンス、接続プール構成など) を確認して、このような問題を完全に回避することです。 以上がMySQL 8.0の新機能である管理ポートの使い方の紹介の詳しい内容です。MySQL 8.0の新機能である管理ポートの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Docker が MySQL イメージをプルするのが遅すぎる問題を解決する
はじめに: MySQL を使用してテーブルを作成する場合、通常は自動インクリメント フィールド (A...
目次1. プロトタイプチェーン継承2. コンストラクタの借用(古典的な継承) 3. 組み合わせ継承4...
今日は、CSS を使用してクールな画像カルーセル コンポーネントを作成する方法を学びます。その原理は...
0. 新しい操作: mkdir abc #新しいフォルダを作成 touch abc.sh #新しいフ...
目次1. 問題2. 解決策1. オブジェクトをanyとして宣言する2. オブジェクトのインターフェー...
この記事では、カードフリップ効果を実現するためのVueの具体的なコードを例として紹介します。具体的な...
目次オープニングシーンv-for を使用した直接レンダリングカスタムコンポーネントで直接レンダリング...
序文最近、古いプロジェクトから残ったいくつかの SQL 最適化の問題に対処するのに忙しくしています。...
この記事では、MySQL 8.0.16 winx64.zipのインストールと設定方法の具体的なコード...
1. 一般的に、CentOS では mariadb がデフォルトでインストールされているため、まず ...
導入面接官がこんな質問をしたことはありませんか?データベースをどのように最適化しますか?では、この質...
目次概要コードの実装要約する概要アダプタ パターンは、デザイン パターンの動作パターンのパターンです...
Tomcat の上位バージョンでは、デフォルト モードは NIO モードを使用することになります。...
Linux では、アプリケーションをダウンロードしてインストールすると、起動時にアプリケーション名...
ラベル表示モード(重要) divタグとspanタグ1. スタイルはまったく同じですが、ラベルが異なり...