SQLSTATE[HY000] [1040] 연결이 너무 많음 솔루션

내 웹사이트에서 SQLSTATE[HY000] [1040] 연결이 너무 많습니다.라는 오류가 발생하면 어떻게 해야 합니까?

이 오류는 다음을 나타냅니다. 서버의 현재 연결 수가 구성된 최대 허용 연결 수(기본값 151개)를 초과하여 새 연결이 거부되었습니다. 이는 동시성이 높은 웹사이트(예: WordPress, Laravel)에서 애플리케이션이 연결을 신속하게 해제하지 못하거나, 트래픽이 갑자기 급증하거나, 구성이 불충분한 경우 자주 발생합니다. 걱정하지 마세요. 이 문제는 대개 빠르게 해결되지만, 재발을 방지하기 위해 모니터링이 필수적입니다.

MySQL 환경에서 가장 흔히 발생하는 오류 중 하나는 악명 높은 오류 1040입니다.

SQLSTATE[HY000] [1040] 연결이 너무 많음 솔루션

실제로 이는 MySQL 인스턴스가 허용되는 최대 클라이언트 연결 한도에 도달했음을 의미합니다. 서버는 연결이 닫힐 때까지 새로운 연결을 허용하지 않습니다.

이런 상황을 예방하기 위한 몇 가지 실질적인 조언이나, 이런 상황에 처했을 때 회복하는 방법에 대해 논의하고 싶습니다.

max_connections 매개변수를 미세 조정합니다.

이 설정은 MySQL 인스턴스가 허용할 수 있는 최대 연결 수를 정의합니다. 최대 연결 수를 설정하는 이유는 서버의 가용 리소스와 애플리케이션의 사용 패턴에 따라 달라집니다. 제어되지 않은 연결을 허용하면 서버가 다운될 수 있으며, 이는 추가 연결을 차단하는 것보다 더 심각한 결과를 초래할 수 있습니다. Max_connections는 서버를 보호하기 위한 값이며, 연결 하이재킹과 관련된 문제를 해결하기 위한 것이 아닙니다.

서버에 대한 각 연결은 연결을 관리하는 "스레드"와 연결 관리에 사용되는 메모리 등 고정된 양의 오버헤드를 소모하며, 가변적인 리소스(예: 메모리 내 테이블 생성에 사용되는 메모리)도 소모합니다. 애플리케이션의 리소스 패턴을 측정하고 이 연결 수를 초과할 위험이 있는 지점을 파악하는 것이 중요합니다.

Percona Monitoring and Management(PMM)를 사용하면 이러한 값을 찾을 수 있습니다. 메모리 사용량 및 실행 중인 스레드 패턴을 확인하고 연결 수와 상관 관계를 파악할 수 있습니다. PMM은 연결 활동의 급증을 표시하여 임계값에 얼마나 근접했는지 확인할 수도 있습니다. 서버의 리소스 제약 조건에 따라 적절히 조정하세요.

아래에 보이는 것은 최대 사용량과 최대 연결 수 사이에 많은 여유가 있는 매우 안정적인 연결 패턴을 갖춘 서버입니다.

MySQL: 연결이 너무 많은 오류를 수정하는 방법: (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]
점수

댓글남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다