통신 오류를 읽는 MySQL 오류


42

MySQL 오류 로그에는 다음과 같은 경고가 거의 없습니다.

120611 16:12:30 [Warning] Aborted connection 2619503 to db: 'db_name' user: 'user_name' host: 'webapp_hostname' (Got an error reading communication packets)

데이터 자체가 손실되는 것을 보지 못했기 때문에이 경고의 의미 또는 원인과 원인을 해결하는 방법에 대해 궁금합니다. 이것은 RHEL 6.1 및 MySQL Enterprise 5.5에 있습니다.

답변:


50

MySQL Connections의 자동 킬러 중 하나는 MySQL Packet입니다.

먼저, MySQL 패킷이 무엇인지 알아 봅시다.

"MySQL 내부 이해"(ISBN 0-596-00957-7)의 99 페이지 에 따르면 다음은 MySQL 패킷을 설명하는 단락 1-3입니다.

MySQL 네트워크 통신 코드는 쿼리가 항상 합리적으로 짧다는 가정하에 작성되었으므로 서버에서 하나의 청크로 서버로 보내고 처리 할 수 ​​있습니다 .이를 MySQL 용어 로 패킷 이라고합니다 . 서버는 패킷을 저장하기 위해 임시 버퍼를위한 메모리를 할당하고이를 완전히 맞추기에 충분한 요청을합니다. 이 아키텍처는 서버에 메모리가 부족하지 않도록주의해야합니다.이 옵션은 패킷 크기를 제한합니다.

이 옵션과 관련하여 관심있는 코드는 sql / net_serv.cc에 있습니다. 한 번 봐 가지고 my_net_read ()를 , 다음의 호출에 따라 my_real_read을 () 와에 특히주의 ) (net_realloc .

이 변수는 또한 많은 문자열 기능의 결과 길이를 제한합니다. 자세한 내용은 sql / field.ccsql / intem_strfunc.cc 를 참조하십시오.

MySQL 패킷에 대해이 사실을 알면 개발자 / DBA는 크기가 크더라도 하나의 패킷 내에 여러 BLOB를 수용 할 수 있도록 크기를 조정할 수 있습니다. 패킷이 너무 작 으면 이와 관련하여 열린 연결에 문제가 발생할 수 있습니다.

MySQL 문서 에 따르면

  • 서버에 잘못되었거나 너무 큰 쿼리를 보내면 이러한 오류가 발생할 수도 있습니다. mysqld가 너무 크거나 순서가 잘못된 패킷을 받으면 클라이언트에 문제가 있다고 가정하고 연결을 닫습니다. 큰 쿼리가 필요한 경우 (예 : 큰 BLOB 열을 사용하는 경우) 기본값이 1MB 인 서버의 max_allowed_packet 변수를 설정하여 쿼리 제한을 늘릴 수 있습니다. 클라이언트 쪽에서 최대 패킷 크기를 늘려야 할 수도 있습니다. 패킷 크기 설정에 대한 자세한 내용은 C.5.2.10 절.“패킷이 너무 큼”에 나와 있습니다.

  • 많은 행을 삽입하는 INSERT 또는 REPLACE 문도 이러한 종류의 오류를 일으킬 수 있습니다. 이 명령문 중 하나는 삽입 될 행 수에 관계없이 단일 요청을 서버로 보냅니다. 따라서 INSERT 또는 REPLACE 당 전송되는 행 수를 줄임으로써 종종 오류를 피할 수 있습니다.

추천

기본값은 1M이므로 max_allowed_packet 을 훨씬 더 큰 숫자로 올리십시오 . 현재 데이터 세트에서 보유한 가장 큰 TEXT 또는 BLOB 필드의 약 10 배를 제안합니다.

max_allowed_packet을 256M으로 설정하려면 /etc/my.cnf 또는 my.ini에 추가 할 수 있습니다

[mysqld]
max_allowed_packet=256M

mysqld의 향후 재시작을 다루기 위해. 서버에 지금 값을 설치하려면 다음을 실행하십시오.

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

시도 해봐 !!!


아주 좋은 설명입니다.
Vasilis Lourdas 2018 년

4

기본적으로 max_connections는 기본적으로 100입니다. config 매개 변수를 늘려보십시오

max_connections = 400, my.cnf 설정 후 서버를 재부팅하거나 동적으로 설정하십시오.

    set @@global.max_connections = 400;

이 경고 메시지를 피하기 위해 위의 권장 사항을 시도하고 네트워크에 패킷 손실이 없는지 확인하십시오.


2

최근 MySQL Enterprise 5.1.x 에서 5.7.x로 이동 한 후이 문제가 발생 하여 응용 프로그램에 대한 중요한 코드 변경없이 ' note '가 나타납니다.

필자의 경우 ' note '가 나타나는 근본 원인은 연결이 열려있는 상태에서 종료하는 프로그램이었습니다. 연결이 닫히지 않는 상황은 조금 더 관련이 있었고 MySQL과 관련이 없으며 ACE, 스레드 및 TSS와 관련이 있습니다.


0

이 my.ini 라인은 내 문제를 해결했습니다.

log_error_verbosity=1

링크 참조


16
나는 당신이 근본적인 문제를 해결했다고 생각하지 않지만 단순히 기록을 중단했습니다.
user19292

1
"메모"로보고 된 것과 동일한 메시지가있었습니다. log_error_verbosity = 2를 사용하면 실제로 "문제"가 해결됩니다 (하지만 "경고"는 무시하지 말고 해결해야합니다)
xtian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.