max_allowed_packet 에 대해..
max_allowed_packet 이란?
MySQL 서버와 Client 사이의 패킷(단일 메시지: SQL구문 또는 row)의 사이즈를 제한하는 값입니다.
또는 mysql_stmt_send_long_data() C API 사용 시 보내는 파라미터의 최대 사이즈 값입니다.
max_allowed packet 사이즈 설정
패킷 메시지의 버퍼 사이즈는 net_buffer_length 값(default 16KB)에 의해 초기 세팅되지만, max_allowed_packet 의 값(max 1G)까지 늘어날 수 있습니다. BLOB 컬럼이나 긴 문자열을 사용한다면 이 값을 늘려놓을 수 있겠습니다. 사용하려는 BLOB 의 가장 큰 값 보다는 크게 설정해야 합니다. 값은 1024의 배수로 설정됩니다. 이 값을 늘려도 무방합니다. Long Query 를 사용하거나 큰 사이즈의 결과값을 넘겨줄 때만 추가 메모리를 할당하기 때문입니다.
그럼 default 값은 왜이렇게 작을까요? 이것은 클라이언트와 서버 사이에서 잘못된 패킷을 포착하고 실수로 큰 패킷을 사용하여 메모리가 부족해지는 것을 방지하기 위한 예방 조치입니다.
또한 max_allowed_packet 값을 변경했다면, 거기에 맞춰서 클라이언트의 설정도 변경해줘야 합니다.
복제시 영향
이것은 복제구조에서도 동일하게 적용받기 때문에 이 사이즈가 작은 경우 복제 시 IO thread 가 멈출 수 있습니다.
더군다나 row-based 복제 구조이고, 사이즈가 큰 text or blob 을 복제해야한다면 멈출 가능성이 있습니다. 따라서 가장 큰 row size 를 보고 부족하지 않도록 지정해야 합니다.
데이터 타입과 max_allowed_packet
text, blob 데이터 타입은 고유의 사이즈 제한들이 있지만 이것은 저장할 수 있는 제한이고, 통신의 제약은 max_allowed_packet 이라고 보면 되겠습니다.
또한 JSON 컬럼에 들어갈 수 있는 값의 크기를 제한하기 때문에 max_allowed_packet 보다 클 수는 없습니다.
에러상황
위에서 설명한 패킷 제한(max_allowed_packet)보다 큰 쿼리를 사용하면 ER_NET_PACKET_TOO_LARGE 에러를 발생 시키고 커넥션을 종료합니다. 일부 클라이언트에서는 커뮤니케이션 패킷(통신 패킷)이 너무 크기 때문에 Lost connection to MySQL server during query 에러를 내기도 합니다.