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.cc 및
sql / 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;
시도 해봐 !!!