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.

Answer

MySQL Connections의 조용한 킬러 중 하나는 MySQL Packet입니다.

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

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

MySQL 네트워크 통신 코드는 쿼리가 항상 존재한다는 가정하에 작성되었습니다. 합리적으로 짧기 때문에 MySQL 용어로는 패킷 이라고하는 하나의 청크로 서버에 전송되고 처리 될 수 있습니다. 서버는 패킷을 저장하기 위해 임시 버퍼에 메모리를 할당하고이를 완전히 맞추기 위해 충분한 요청을합니다. 이 아키텍처는 서버의 메모리 부족을 방지하기위한 예방 조치를 필요로합니다.이 옵션이 수행하는 패킷 크기 제한입니다.

이 옵션과 관련된 관심 코드는 다음에서 찾을 수 있습니다. sql / net_serv.cc . my_net_read () 를 살펴본 다음 my_real_read에 대한 호출을 따릅니다. () 그리고 net_realloc () 에 특히주의하세요.

이 변수는 또한 많은 문자열 함수의 결과 길이를 제한합니다. sql / field.cc sql / intem_strfunc.cc

를 참조하십시오.

MySQL 패킷에 대해 알고 있으면 개발자 / DBA가 여러 BLOB를 수용 할 수 있도록 크기를 조정할 수 있습니다. 비록 그들이 매우 큰 경우에도 하나의 패킷 안에. 확실히 패킷이 너무 작 으면 이와 관련하여 열린 연결에 문제가 발생합니다.

에 따르면 MySQL 설명서

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

  • 많은 행을 삽입하는 INSERT 또는 REPLACE 문도 이러한 종류의 오류를 유발할 수 있습니다. 이러한 문 중 하나는 삽입 할 행 수에 관계없이 서버에 단일 요청을 보냅니다. 따라서 INSERT 또는 REPLACE 당 전송되는 행 수를 줄여 오류를 방지 할 수 있습니다.

권장

max_allowed_packet 를 훨씬 더 큰 숫자로 변경합니다. ld는 현재 데이터 세트에있는 가장 큰 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; 

사용해보세요 !!!

댓글

  • 아주 좋은 설명입니다.
  • @RolandoMySQLDBA 언급 된 모든 솔루션을 시도한 후에도 5.7.28에서 여전히 오류가 발생합니다. 추가 문제 해결을위한 팁

답변

대부분 기본적으로 최대 연결 수는 100 개입니다. 구성 매개 변수를 늘려보십시오.

max_connections = 400, my.cnf에서 설정 한 후 서버를 재부팅하거나 동적으로 설정합니다.

 set @@global.max_connections = 400; 

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

답변

이전 후 최근에이 문제가 발생했습니다. MySQL Enterprise 5.1.x 에서 5.7.x 로, 애플리케이션에 중요한 코드 변경없이 “ note “가 나타나기 시작했습니다.

제 경우에 나타나는 “ note “의 근본 원인은 연결이 열려있는 상태에서 종료되는 프로그램이었습니다.연결이 닫히지 않는 상황은 좀 더 복잡하고 MySQL이 아니라 ACE, 스레드 및 TSS와 관련이있었습니다.

Answer

여기에 언급되지 않았으므로이 문제의 다른 원인을 포함합니다. 제 경우에는 mysql 명령 줄 클라이언트를 사용하는 동안 interactive_timeout의 낮은 값 30 초로 인해 오류가 발생했습니다.
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_interactive_timeout
세션간에 지속되지만 서버가 다시 시작되지는 않습니다.

SET GLOBAL interactive_timeout=6000; 

답변

MariaDB 10.3.24에서 동일한 문제를 발견했습니다. 위의 모든 이유와 일부 이유 때문에 경고가 발생할 수 있습니다. 제 경우에는 필드 중 하나에 대해 빈 사전 값이있는 데이터베이스 테이블 중 하나의 레코드 때문이었습니다.

+ —- + ——– + | 아이디 | 구성 | + —- + ——– + | 3 | {} | + —- + ——– +

테스트로 “{}”를 “()”로 변경하고 메시지가 중지되었습니다. 누군가에게 도움이되는 경우를 대비하여.

답변

이 my.ini 줄이 내 문제를 해결했습니다.

log_error_verbosity=1 

참조 링크

댓글

  • 저는 ' 기본 문제를 해결했다고 생각하지 않지만 단순히 로그 기록을 중지했습니다.
  • 같은 메시지가 " 참고 ". log_error_verbosity = 2를 사용하면 실제로 " 문제 " (그러나 " 경고 "는 처리해야하며 무시해서는 안됩니다.)

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다