Among Us - Black Crewmate
본문 바로가기
공부/Database

MySQL 'max_allowed_packet' 설정 필요성

by k.engineer 2024. 5. 24.

 

 

 

 

 

 

 

 

데이터베이스 작업을 하면서 DB에 데이터를 넣으면서 난 오류가 있었다.

사용자 NAS에서 파일을 DB로 복사한 뒤 DB에 있는 내용을 전달하는 과정 중 NAS에서 DB에 저장을 완료했다고 log가 있으나(Response Status 200)...DB에 정보가 없어서 전달이 되지 않는 경우였다(Not Found 404).

해결방안으로 모든 로직이 끝나는 시점에 log.error 를 찍어보는 수밖에... 나는 신입이다..내가 만든 로직도 아니고 API연동이라 사용자 로직은 보지도 못한다..오직 error를 찾기 위해 노가다 log를 찍어야한다!!.

*회사 로직과 로그는 보여주지 못해서 예로 google에서 정보를 찾아 작성합니다.

 

NAS와 DB연동 때 log가 없었다;; 물론 누가 개발했는지 모른다. 실패해도 저장 성공 알람창을 보여주더라..


1.로그 확인 결과

SQL []; Packet for query is too large (22020096 > 16777216). You can change this value on the server by
 setting the max_allowed_packet' variable.;

 16M로 설정되어 있고, 그 용량 보다 더 큰 값이라 저장이 안 되고 있었다. 


2. max_allowed_packet란?

- MySQL의 max_allowed_packet은 클라이언트와 서버 간에 전송할 수 있는 단일 패킷의 최대 크기를 정의하는 설정 변수입니다. 이 설정은 MySQL 서버가 허용할 수 있는 최대 데이터 크기를 결정하며, 데이터 전송 시 안정성과 성능을 보장하기 위해 중요합니다.

 

mysql 3.23 버전에서는 이 값을 16Mb까지 설정 가능하고 4.0.1 이상부터는 1GB까지 가능하다.


3. max_allowed_packet 설정이 왜 중요한가

  • 대용량 데이터 전송
    대용량 데이터를 포함하는 쿼리(예: 대형 파일, 이미지, 텍스트 데이터)를 실행할 때, max_allowed_packet 값이 너무 작으면 "MySQL server has gone away" 오류가 발생할 수 있습니다. 이는 패킷 크기가 설정된 최대 크기를 초과했기 때문입니다.
  • 데이터 무결성
    적절한 패킷 크기를 설정하지 않으면 데이터 전송 중 일부 패킷이 손실될 수 있으며, 이는 데이터 무결성 문제를 야기할 수 있습니다. 올바른 설정은 안정적인 데이터 전송을 보장합니다.
  • 서버 서능 및 리소스 관리
    max_allowed_packet 값을 너무 크게 설정하면 메모리 사용량이 증가할 수 있으며, 이는 서버의 성능에 부정적인 영향을 미칠 수 있습니다. 적절한 값으로 설정하여 메모리와 네트워크 리소스를 효율적으로 관리해야 합니다.

4.설정 방법

 

그럼 이제 크기를 키우는 설정을 해보자.

*여기 DB내에 쿼리를 입력할 수 없어서 ini 파일을 찾아서 설정하기로 했다. 

[mysqld]
datadir=D:/DB/data
port=3307
innodb-page-size=65536
innodb_buffer_pool_size=4096M
character-set-server=utf8mb4

//밀어넣어버리기
max_allowed_packet=32M

[client]
port=****
plugin-dir=D:\DB/lib/plugin

 

경로를 찾아 타고 타고 들어가 my.ini 파일을 찾았다. Notepad++ 실행시켜서 'max_allowed_packet = 32M' 입력했다. 

다시 TEST.. 아직도 에러..아 화면 보여주고싶다 모든 log.error가 출력되기 때문에 Tomcat log가 어마어마하다;; 

 

문제점 확인. 

my.ini 설정 후 DB를 재시작해야 적용된단다..마음이 앞서나갔다.

 

재시작 완료!


5.결과

 

결과는 성공 에러가 안나서 로그 확인이 안 된다.. 용량 허용치 보다 낮으니 성공메시지만 출력하게 된 거.

웹에서 저장된 거 확인이 가능하고 전달하는 거 까지 완료. 

 

그럼 이제 뭐다? ㅋㅋ log가 너무 쌓여서 다시 log.error 쓴 거 다 지우고,,, 퇴근!

초보개발자가 경험으로 공부 중인데 읽어주셔서 감사합니다.

 

 

 

* 만약 사용자 DB에 접근 가능하면 google에 검색하면 쿼리로 처리하는 방법도 많다.