序文皆さんの多くは、次のようなエラー メッセージに遭遇したことがあると思います。この問題が発生した場合、どうすればよいでしょうか? 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 データベースの基本的な知識と操作について説明します。ご参考ま...
border-radius:10px; /* すべての角は半径 10px で丸められます*/ bor...
新しい CSS プロパティ contain を紹介する前に、読者はページの再描画と再配置が何であるか...
1. Expressライブラリとジェネレータをインストールするcmdを開いて、次のコマンドを入力しま...
1. 機能主にコンポーネントの状態を保持したり、再レンダリングを回避したりするために使用されます。 ...
この記事では主に、Vue + SpringBoot でページ分割されたリストデータを実装する方法を紹...
Tomcat自体の最適化Tomcat メモリ最適化起動時に大きなメモリ ブロックが必要であることを ...
開発およびデバッグのプロセスでは、新しいコードと古いコードの違いを比較する必要があります。比較には、...
目次1. 概要2. dockerを使用してTomcatをデプロイし、Skywalkingに接続する要...
ステップ1: MySQLでbinlogが有効になっていることを確認する '%log_bin%...
CentOS7をダウンロード私がダウンロードしたイメージはCentOS-7-x86_64-DVD-1...
多くのウェブサイトでは、ユーザーが簡単に検索したり他のページに移動したりできるように、上部にナビゲー...
次のコードは、MySQL 5.7.22 バイナリ パッケージのインストール方法を紹介しています。具体...
CentOS 7にPostgreSQL 11をインストールする PostgreSQL: 世界で最も先...
目次SQLを理解するSELECTを理解するエイリアス定数をクエリし、固定定数列を追加します。重複行を...