우수한 소프트웨어와 실용적인 튜토리얼
当网站遇到 SQLSTATE[HY000] [1040] Too many connections 怎么办?
这个错误表示 MySQL 服务器的当前连接数超过了配置的最大允许连接数(默认 151),导致新连接被拒绝。通常发生在高并发网站(如 WordPress、Laravel)中,原因包括应用未及时释放连接、突发流量或配置不足。别担心,它通常可快速修复,但需结合监控避免复发。
在 MySQL 世界中遇到的最常见错误之一是臭名昭著的错误 1040:
实际上,这意味着 MySQL 实例已达到其允许的最大客户端连接数限制。在连接关闭之前,服务器将不会接受任何新连接。
我想讨论一些防止这种情况的实用建议,或者如果你发现自己处于这种情况,如何恢复。
精确调整 max_connections 参数
此设置定义了 MySQL 实例可接受的最大连接数。设置最大连接数的“原因”取决于服务器的可用资源和应用程序的使用模式。允许不受控制的连接可能会导致服务器崩溃,这可能比阻止进一步的连接“更糟糕”。Max_connections 是一个用于保护服务器的值,而不是修复与劫持连接相关的问题。
与服务器的每个连接都会消耗固定数量的开销,例如管理连接的“线程”和用于管理连接的内存,以及可变资源(例如用于创建内存表的内存)。测量应用程序的资源模式并找到超过该连接数的危险点非常重要。
Percona 监控和管理 (PMM) 可以帮助您找到这些值。查看内存使用模式、正在运行的线程,并将它们与连接数关联起来。PMM 还可以显示连接活动的峰值,让您了解距离阈值的距离。请根据服务器的资源限制进行相应的调整。
下面看到的是一个具有非常稳定的连接模式的服务器,并且最大使用量和最大连接数之间有很大空间。
MySQL:如何修复Too many connections 错误:(HY000/1040):连接数过多
首先调整mysql配置文件,然后重新启动MySQL
# # 이 그룹은 MariaDB 서버에서 읽습니다. # 서버(클라이언트는 아님)에서만 볼 수 있는 옵션에 사용합니다. # 이것은 독립 실행형 데몬과 내장형 서버에서 읽습니다. [server] # 이것은 mysqld 독립 실행형 데몬에만 해당합니다. [mysqld] # # * 기본 설정 # #user = mysql pid-file = /run/mysqld/mysqld.pid basedir = /usr #datadir = /var/lib/mysql #tmpdir = /tmp # 끊어진 역방향 DNS는 연결 속도를 상당히 늦추고 이름 확인은 # "도메인 이름으로 호스트" 액세스 권한이 없는 경우 건너뛰어도 안전합니다. #skip-name-resolve # skip-networking 대신 기본값은 이제 localhost에서만 수신하는 것인데, 이는 호환성이 더 좋고 보안성이 떨어지지 않습니다. bind-address = 127.0.0.1 # # * 미세 조정 # 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 # 이것은 시작 스크립트를 대체하고 필요한 경우 MyISAM 테이블을 확인합니다 # 처음으로 만질 때 #myisam_recover_options = BACKUP #max_connections = 100 #table_cache = 64 myisam_recover_options = BACKUP max_connections = 9999 table_open_cache = 40000 # # * 로깅 및 복제 # # 참고: 구성된 로그 파일이나 해당 디렉토리는 # 생성되어야 하며 mysql 사용자가 쓸 수 있어야 합니다. 예: # $ sudo mkdir -m 2750 /var/log/mysql # $ sudo chown mysql /var/log/mysql # 두 위치 모두 cronjob에 의해 회전됩니다. # 이 로그 유형은 성능을 저하시킨다는 점에 유의하세요. # 필요한 경우 짧은 테스트 기간 동안 런타임에만 이 설정을 변경하는 것이 좋습니다! #general_log_file = /var/log/mysql/mysql.log #general_log = 1 # systemd에서 실행할 때 오류 로깅은 stdout/stderr을 통해 journald로 전송되고 # 레거시 init을 실행할 때 오류 로깅은 # /etc/mysql/conf.d/mariadb.conf.d/50-mysqld_safe.cnf로 인해 syslog로 전송됩니다. # 별도의 파일에 오류 로깅을 저장하려면 이 옵션을 활성화합니다. #log_error = /var/log/mysql/error.log # 특히 지속 시간이 긴 쿼리를 보려면 느린 쿼리 로그를 활성화합니다. #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 # 부하 테스트를 기준으로 1~5초를 권장합니다 slow_query_log = 1 # 느린 쿼리 로그를 활성화합니다(활성화하지 않은 경우) slow_query_log_file = /var/log/mysql/mariadb-slow.log log_slow_verbosity = query_plan,explain # 실행 계획을 기록합니다 log_queries_not_using_indexes = 1 # 인덱스를 사용하지 않는 쿼리를 기록합니다 log_slow_admin_statements = 1 # 관리 명령문을 기록합니다 # 다음은 백업 로그를 쉽게 재생하거나 복제하는 데 사용할 수 있습니다. # 참고: 복제본을 설정하는 경우 변경해야 할 수 있는 다른 설정에 대해서는 README.Debian을 참조하세요. #server-id = 1 #log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 #max_binlog_size = 100M # # * SSL/TLS # # 설명서는 # 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 # # * 문자 집합 # # MySQL/MariaDB 기본값은 Latin1이지만 Debian에서는 전체 # utf8 4바이트 문자 집합을 기본값으로 사용합니다. client.cnf의 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci도 참조하세요. # # * InnoDB # # InnoDB는 기본적으로 /var/lib/mysql/에 10MB 데이터 파일을 사용하여 활성화됩니다. # InnoDB 관련 옵션은 매뉴얼을 참조하세요. 옵션이 매우 많습니다! # 가장 중요한 것은 버퍼 사용을 위해 InnoDB에 시스템 RAM의 80 %를 제공하는 것입니다. # 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 # 이것은 임베디드 서버에만 해당됩니다. [임베디드] # 이 그룹은 MySQL이 아닌 MariaDB 서버에서만 읽습니다. # MySQL과 MariaDB에 동일한 .cnf 파일을 사용하는 경우 # MariaDB 전용 옵션을 여기에 넣을 수 있습니다. [mariadb] # 이 그룹은 MariaDB-10.11 서버에서만 읽을 수 있습니다. # 다른 버전의 MariaDB에 동일한 .cnf 파일을 사용하는 경우 # 이전 서버에서 인식하지 못하는 옵션에 이 그룹을 사용합니다. [mariadb-10.11]