MySQL Connections의 자동 킬러 중 하나는 MySQL Packet입니다. MySQL 복제의 I / O 스레드조차도 이로 인해 피해를 입을 수 있습니다.
MySQL 문서 에 따르면
올바르지 않거나 너무 큰 서버로 쿼리를 보내면 이러한 오류가 발생할 수도 있습니다. mysqld가 너무 크거나 순서가 잘못된 패킷을 받으면 클라이언트에 문제가 있다고 가정하고 연결을 닫습니다. 큰 쿼리가 필요한 경우 (예 : 큰 BLOB 열을 사용하는 경우) 기본값이 1MB 인 서버의 max_allowed_packet 변수를 설정하여 쿼리 제한을 늘릴 수 있습니다. 클라이언트 쪽에서 최대 패킷 크기를 늘려야 할 수도 있습니다. 패킷 크기 설정에 대한 자세한 내용은 C.5.2.10 절.“패킷이 너무 큼”에 나와 있습니다.
많은 행을 삽입하는 INSERT 또는 REPLACE 문도 이러한 종류의 오류를 일으킬 수 있습니다. 이 명령문 중 하나는 삽입 될 행 수에 관계없이 단일 요청을 서버로 보냅니다. 따라서 INSERT 또는 REPLACE 당 전송되는 행 수를 줄임으로써 종종 오류를 피할 수 있습니다.
최소한 mysqldump'd에서 온 머신과로드하는 머신의 패킷 크기가 동일해야합니다.
취할 수있는 두 가지 접근 방식이있을 수 있습니다.
접근법 # 1 : --skip-extended-insert를 사용하여 mysqldump를 수행
이렇게하면 MySQL 패킷에 여러 BLOB, TEXT 필드가 넘치지 않게됩니다. 이렇게하면 SQL INSERT가 한 번에 하나씩 수행됩니다. 주요 단점은
- mysqldump는 훨씬 크다
- 이러한 덤프를 다시로드하는 데 훨씬 오래 걸립니다.
접근법 # 2 : max_allowed_packet 증가
이것을 구현하는 것은 mysql을 다시 시작하기 때문에 선호되는 접근법 일 수 있습니다. MySQL 패킷이 무엇인지 이해하면이를 분명히 알 수 있습니다.
"MySQL 내부 이해"(ISBN 0-596-00957-7)의 99 페이지 에 따르면 , 1-3 항에 설명되어 있습니다.
MySQL 네트워크 통신 코드는 쿼리가 항상 합리적으로 짧다는 가정하에 작성되었으므로 서버에서 하나의 청크로 서버로 보내고 처리 할 수 있습니다 .이를 MySQL 용어 로 패킷 이라고합니다 . 서버는 패킷을 저장하기 위해 임시 버퍼를위한 메모리를 할당하고이를 완전히 맞추기에 충분한 요청을합니다. 이 아키텍처는 서버에 메모리가 부족하지 않도록주의해야합니다.이 옵션은 패킷 크기를 제한합니다.
이 옵션과 관련하여 관심있는 코드는
sql / net_serv.cc에 있습니다. 한 번 봐 가지고 my_net_read ()를 , 다음의 호출에 따라 my_real_read을 () 와에 특히주의
) (net_realloc .
이 변수는 또한 많은 문자열 기능의 결과 길이를 제한합니다. 자세한 내용은 sql / field.cc 및
sql / intem_strfunc.cc 를 참조하십시오.
이 설명을 감안할 때 대량 INSERT를 만들면 MySQL 패킷이 다소 빠르게로드 / 언로드됩니다. max_allowed_packet이 주어진 데이터로드에 비해 너무 작을 때 특히 그렇습니다.
결론
대부분의 MySQL 설치에서 나는 보통 이것을 256M 또는 512M으로 설정합니다. 데이터로드에서 "MySQL이 사라졌습니다"오류가 발생하면 더 큰 값으로 실험해야합니다.
max_allowed_packet
900M으로 설정을 시도했지만 사용하고--skip-extended-insert
(그리고 당신이 옳습니다-huuuge db-dumps를 만듭니다), 여전히 실패합니다. 나는 아마도 해결할 수 있다고 덤프에서 특정 줄을 의심하고 있습니다. 그러나 여전히 이상합니다. CentOS 서버에서 덤프를 올바르게 가져올 수 있습니다.