MySQL ERROR 1040: Too many connections


この章では、サーバに ERROR 1040: Too many connectionsエラーが発生した場合の処理の心得について説明します.
max_接続ビュー
##        
SHOW VARIABLES LIKE "max_connections";
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 512   |
+-----------------+-------+

##           
SHOW VARIABLES LIKE 'Max_used_connections';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 499   |
+----------------------+-------+

処理シナリオ
この問題には一般的に2つの処理案があり,解決策は非常に容易であり,max_connections接続数を増やすだけでよい.
現在のセッションのmysql最大接続数を増やす
SET GLOBAL max_connections = 1000;

上のmysql接続値は一時的に1000に増加しましたが、現在のセッションにのみ適用されます.mysqlサービスを再起動するか、システムを再起動すると、この値はデフォルト値にリセットされます.
mysql最大接続数を永続的に増加
mysql接続数を永続的に増やすには、mysqlプロファイル、すなわち/etc/my.cnfを編集する必要があります.sudo vim /etc/my.cnf
##   
max_connections = 1000

ファイルを保存してMySQLを再起動すると有効になります.
どのくらい拡張すればいいですか?Max_connextionsは大きいほど良いわけではありませんが、どのように構成しますか?
方式一
MySQLの同時性を向上させるには、メモリに大きく依存し、innodbのメモリけいさんモードが公式に提供されています.
innodb_buffer_pool_size
+ key_buffer_size
+ max_connections * (sort_buffer_size + read_buffer_size + binlog_cache_size)
+ max_connections * 2MB

方式2
設置スケール拡張:
max_used_connections / max_connections * 100% = [85, 90]%
/ は80%〜90%区間に達し、最適化または拡張を提案した.
拡張
以下では、MySQLのパフォーマンスに影響を与える一般的な状況についても説明します.
スレッド
SHOW STATUS LIKE  'Threads%';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| Threads_cached    | 1      | 
| Threads_connected | 217    |
| Threads_created   | 29     |
| Threads_running   | 88     |
+-------------------+--------+

SHOW VARIABLES LIKE 'thread_cache_size';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| thread_cache_size | 10     |
+-------------------+-------+
  • Threads_Cachedスレッドのキャッシュ数
  • Threads_接続の現在開いている接続数
  • Threads_createdは、接続を処理するためのスレッド数を作成します.
  • Threads_running未スリープスレッド数
  • もしThreads_createdが大きいとthread_を増やす可能性がありますcache_size値.キャッシュミス率はThreads_として計算できます.created/Connections
    表ロックの表示
    SHOW GLOBAL STATUS LIKE 'table_locks%';
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | Table_locks_immediate | 90    |
    | Table_locks_waited    | 0     |
    +-----------------------+-------+
  • Table_locks_immediateがテーブルロック要求を直ちに取得する回数
  • Table_locks_waitedはテーブルロックに対するリクエストの回数をすぐに取得できず、待機する必要があります.この値が高すぎると、パフォーマンスに問題が発生し、接続の解放に影響を及ぼす可能性があることを示します.
    スロークエリ
    show variables like '%slow%';
    
    +---------------------------+----------------------------------------------+
    | Variable_name             | Value                                        |
    +---------------------------+----------------------------------------------+
    | slow_launch_time          | 2                                            |
    | slow_query_log            | On                                           |
    +---------------------------+----------------------------------------------+

    スレッドの詳細
    ##            
    SHOW PROCESSLIST;
    +--------+----------+------------------+--------------+---------+-------+-------------+------------------+
    | Id     | User     | Host             | db           | Command | Time  | State       | Info             |
    +--------+----------+------------------+--------------+---------+-------+-------------+------------------+
    |      3 | xxxadmin | localhost        | NULL         | Sleep   |     1 | cleaning up | NULL             |
    |      4 | xxxadmin | localhost        | NULL         | Sleep   |     0 | cleaning up | NULL             |
    |      5 | xxxadmin | localhost        | NULL         | Sleep   |     6 | cleaning up | NULL             |
    +--------+----------+------------------+--------------+---------+-------+-------------+------------------+

    まとめ
    もちろん、以上は大まかな解決策にすぎず、いずれの方法を使っても、実際のビジネスシーンと結びつけて拡張する必要があります.
    また,生産環境に対して適切なアラーム閾値を設定することも必要である.
    最後に、プログラミング時に、MySQL文でデータベースを呼び出してSQLを実行すると、スレッド操作MySQLが割り当てられるので、呼び出しが終了した後、接続を回収し、漏洩を避ける必要があります.
    参考記事
    https://dev.mysql.com/doc/ref...
    https://dev.mysql.com/doc/ref...
    https://dev.mysql.com/doc/ref...
    MySQL Calculator