MySQL ERROR max_allowed_packet
에러 내용 max_allowed_packet Error
### Error updating database. Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1538 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
### The error may involve com.lianboxing.projectsub.transaction.dao.MarketDao.insertList-Inline
### The error occurred while setting parameters
### SQL: insert into market
( currency_id ,legal_id ,start_price ,end_price ,high_price ,min_price ,day_time ,type ,number ,mar_id ,period ,sign ,create_time ,update_time )
values
( ? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ) , ( ? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ) , ( ? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ) , ( ? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ) , ( ? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? )
### Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1538 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
; SQL []; Packet for query is too large (1538 > 1024). You can change this value on the server by
setting the max_allowed_packet' variable.;
nested exception is com.mysql.jdbc.PacketTooBigException:
Packet for query is too large (1538 > 1024).
You can change this value on the server by setting the max_allowed_packet' variable.
1. max_allowed_packet이란?
네트워크 문제나 MySQL 서버 또는 클라이언트의 버그로 인해 잘못된 패킷이 MySQL 서버로 전달될 경우 MySQL 서버에 심각한 문제를 일으킬 수 있습니다. 이러한 문제점을 없애고자 MySQL 서버는 모든 클라이언트의 패킷이 max_allowed_packet 설정값에 지정된 크기 이하일 것이라고 간주하고 처리하게 됩니다. 만약 max_allowed_packet이 32MB로 설정된 서버에서 실행해야 할 쿼리 문장이 그 이상이 되는 경우에는 이 값을 더 큰 값으로 변경해야 합니다. 이러한 문제는 BLOB나 TEXT 타입의 칼럼에 상당히 큰 데이터를 저장해야 하는 경우에 주로 발생합니다.
MySQL 서버와 통신할 때 클라이언트가 MySQL 서버로 쿼리 요청을 보내는 경우에는 무조건 하나의 패킷만 사용할 수 있으며, 쿼리의 실행 결과는 여러 개의 패킷으로 나눠서 전달받게 됩니다. 그래서 이 설정값은 클라이언트가 서버로 요청하는 쿼리 문장의 길이보다 큰 값으로 설정하기만 하면 됩니다.
출처 : https://12bme.tistory.com/49
2. 에러 해결 방법 및 순서
max_allowed_packet 설정 값보다 쿼리 패 킷의 값이 더 클때 발생하는 에러입니다. mysql 설정 파일에서 해당 변수값을 초과한 쿼리 패킷 용량보다 크게 설정하면 해결됩니다.
(1) mysql max_allowed_packet 설정
SET GLOBAL max_allowed_packet = 2,048,000,000; 는 2g
SET GLOBAL max_allowed_packet = 16777216; 는 16mb
SET SESSION max_allowed_packet = 16777216;
FLUSH PRIVILEGES;
FLUSH PRIVILEGES는 grant 테이블을 다시 불러와서 변경 사항을 반영한다. (grant 명령어를 사용하면, FLUSH PRIVILEGES 실행 필요 없음)
show variables where Variable_name = 'max_allowed_packet';
(2) 변경 후 mysql 서버 재시작
my.ini 위치
mysqld –verbose –help grep -A 1 ‘Default options’
위 명령어를 입력하면 하단에 my.cnf 위치를 확인할 수 있다.
vi /etc/mysql/my.cnf
아래와 같이 경로가 나온다.
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
참고
ini vs cnf 차이
Windows uses .ini files to initialise applications
Linux uses .cnf files to configure applications
출처 https://www.sitepoint.com/community/t/my-cnf-or-is-it-my-ini/4266/2
Error “Packet for query is too large”. Even if change the setting, it is still initialized
출처 https://stackoverflow.com/questions/57550908/error-packet-for-query-is-too-large-even-if-change-the-setting-it-is-still-i
댓글남기기