SQLSTATE[HY000] [1040] Zu viele Verbindungen Lösung

当网站遇到 SQLSTATE[HY000] [1040] Too many connections 怎么办?

这个错误表示 服务器的当前连接数超过了配置的最大允许连接数(默认 151),导致新连接被拒绝。通常发生在高并发网站(如 WordPress、Laravel)中,原因包括应用未及时释放连接、突发流量或配置不足。别担心,它通常可快速修复,但需结合监控避免复发。

在 MySQL 世界中遇到的最常见错误之一是臭名昭著的错误 1040:

SQLSTATE[HY000] [1040] Zu viele Verbindungen Lösung

实际上,这意味着 MySQL 实例已达到其允许的最大客户端连接数限制。在连接关闭之前,服务器将不会接受任何新连接。

我想讨论一些防止这种情况的实用建议,或者如果你发现自己处于这种情况,如何恢复。

精确调整 max_connections 参数

此设置定义了 MySQL 实例可接受的最大连接数。设置最大连接数的“原因”取决于服务器的可用资源和应用程序的使用模式。允许不受控制的连接可能会导致服务器崩溃,这可能比阻止进一步的连接“更糟糕”。Max_connections 是一个用于保护服务器的值,而不是修复与劫持连接相关的问题。

与服务器的每个连接都会消耗固定数量的开销,例如管理连接的“线程”和用于管理连接的内存,以及可变资源(例如用于创建内存表的内存)。测量应用程序的资源模式并找到超过该连接数的危险点非常重要。

Percona 监控和管理 (PMM) 可以帮助您找到这些值。查看内存使用模式、正在运行的线程,并将它们与连接数关联起来。PMM 还可以显示连接活动的峰值,让您了解距离阈值的距离。请根据服务器的资源限制进行相应的调整。

下面看到的是一个具有非常稳定的连接模式的服务器,并且最大使用量和最大连接数之间有很大空间。

MySQL:如何修复Too many connections 错误:(HY000/1040):连接数过多

首先调整mysql配置文件,然后重新启动MySQL

# # Diese Gruppen werden vom MariaDB-Server gelesen. # Verwenden Sie es für Optionen, die nur der Server (aber nicht die Clients) sehen sollen. # Dies wird vom eigenständigen Daemon und eingebetteten Servern gelesen [Server] # Dies ist nur für den eigenständigen mysqld-Daemon [mysqld] # # * Grundeinstellungen # #user = mysql pid-file = /run/mysqld/mysqld.pid basedir = /usr #datadir = /var/lib/mysql #tmpdir = /tmp # Beschädigtes Reverse-DNS verlangsamt Verbindungen erheblich und die Namensauflösung kann # sicher übersprungen werden, wenn keine Zugriffsberechtigungen „Host nach Domänenname“ vorhanden sind. #skip-name-resolve # Anstatt „Skip-Networking“ wird jetzt standardmäßig nur auf # localhost gelauscht, was kompatibler und nicht weniger sicher ist. bind-address = 127.0.0.1 # # * Feinabstimmung # key_buffer_size = 512M max_allowed_packet = 2G thread_stack = 192K thread_cache_size = 1024 tmp_table_size = 1024M max_heap_table_size = 1024M open_files_limit = 0 #key_buffer_size = 128M #max_allowed_packet = 1G #thread_stack = 192K #thread_cache_size = 8 # Dies ersetzt das Startskript und überprüft MyISAM-Tabellen bei Bedarf # beim ersten Zugriff #myisam_recover_options = BACKUP #max_connections = 100 #table_cache = 64 myisam_recover_options = BACKUP max_connections = 9999 table_open_cache = 40000 # # * Protokollierung und Replikation # # Hinweis: Die konfigurierte Protokolldatei oder ihr Verzeichnis muss erstellt werden # und für den MySQL-Benutzer beschreibbar sein, zB: # $ sudo mkdir -m 2750 /var/log/mysql # $ sudo chown mysql /var/log/mysql # Beide Speicherorte werden vom Cronjob rotiert. # Beachten Sie, dass dieser Protokolltyp die Leistung beeinträchtigt. # Es wird empfohlen, dies zur Laufzeit nur für kurze Testzeiträume zu ändern, falls nötig! #general_log_file = /var/log/mysql/mysql.log #general_log = 1 # Beim Ausführen unter systemd geht die Fehlerprotokollierung über stdout/stderr an journald # und beim Ausführen von Legacy-Init geht die Fehlerprotokollierung an syslog aufgrund von # /etc/mysql/conf.d/mariadb.conf.d/50-mysqld_safe.cnf # Aktivieren Sie dies, wenn Sie die Fehlerprotokollierung in einer separaten Datei haben möchten #log_error = /var/log/mysql/error.log # Aktivieren Sie das Protokoll für langsame Abfragen, um Abfragen mit besonders langer Dauer anzuzeigen #log_slow_query_file = /var/log/mysql/mariadb-slow.log #log_slow_query_time = 10 #log_slow_verbosity = query_plan,explain #log-queries-not-using-indexes #log_slow_min_examined_row_limit = 1000 long_query_time =5 # Empfohlen 1–5 Sekunden, basierend auf Belastungstests slow_query_log = 1 # Protokoll für langsame Abfragen aktivieren (falls nicht aktiviert) slow_query_log_file = /var/log/mysql/mariadb-slow.log log_slow_verbosity = query_plan,explain # Ausführungsplan aufzeichnen log_queries_not_using_indexes = 1 # Abfragen aufzeichnen, die keine Indizes verwenden log_slow_admin_statements = 1 # Administrative Anweisungen aufzeichnen # Folgendes kann als einfach wiederzugebende Sicherungsprotokolle oder zur Replikation verwendet werden. #-Hinweis: Wenn Sie eine Replik einrichten, lesen Sie README.Debian, um weitere #-Einstellungen zu erfahren, die Sie möglicherweise ändern müssen. #server-id = 1 #log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 #max_binlog_size = 100M # # * SSL/TLS # # Die Dokumentation finden Sie unter # https://mariadb.com/kb/en/securing-connections-for-client-and-server/ #ssl-ca = /etc/mysql/cacert.pem #ssl-cert = /etc/mysql/server-cert.pem #ssl-key = /etc/mysql/server-key.pem #require-secure-transport = on # # * Zeichensätze # # MySQL/MariaDB Standard ist Latin1, aber in Debian verwenden wir standardmäßig den vollständigen # UTF-8-4-Byte-Zeichensatz. Siehe auch client.cnf character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # # * InnoDB # # InnoDB ist standardmäßig mit einer 10 MB großen Datendatei in /var/lib/mysql/ aktiviert. # Weitere InnoDB-bezogene Optionen finden Sie im Handbuch. Es gibt viele! # Am wichtigsten ist es, InnoDB 80 % des System-RAM für die Puffernutzung zu geben: # https://mariadb.com/kb/en/innodb-system-variables/#innodb_buffer_pool_size #innodb_buffer_pool_size = 8G innodb_buffer_pool_size = 48G innodb_buffer_pool_instances = 16 innodb_log_file_size = 12G innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT innodb_io_capacity = 2000 innodb_read_io_threads = 8 innodb_write_io_threads = 8 # dies ist nur für eingebettete Server [embedded] # Diese Gruppe wird nur von MariaDB-Servern gelesen, nicht von MySQL. # Wenn Sie dieselbe .cnf-Datei für MySQL und MariaDB verwenden, # können Sie hier nur MariaDB-Optionen einfügen [mariadb] # Diese Gruppe wird nur von MariaDB-10.11-Servern gelesen. # Wenn Sie dieselbe .cnf-Datei für MariaDB verschiedener Versionen verwenden, # verwenden Sie diese Gruppe für Optionen, die ältere Server nicht verstehen [mariadb-10.11]
Punktzahl

Das ist eine gute Idee

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * Mark