지금 추천 엔진을 만들고 있는데 주기적으로 사용자의 데이터를 가공해서 어떤 데이터를 만들어내야 하는 상황이다. 지금으로서는 하루에 한 번 정도 처리하면 되는 정도로 보이고 데이터의 양이 많지 않아서 scheduled event를 만들어 procedure를 한번씩 콜 하는 걸로 구현했다. 추출한 데이터를 저장할 때에는 json 오브젝트를 텍스트로 저장한다. Procedure 내에서 GROUP_CONCAT()과 CONCAT()을 이용해 json 오브젝트를 만들어 컬럼 값으로 입력하니 잘 된다. 그런데 문제는 유저 데이터의 크기가 클 때 group_concat_max_len 조건으로 인해 제대로 된 json 오브젝트가 잘려 나간 채 저장이 된다는 거였다. 찾아보니 group_concat_max_len의 defaut 값은 1024로 작았다. 


값을 확인하는 방법

SHOW VARIABLES LIKE 'group_concat_max_len';


그래서 이 값을 변경하기 위해 아래 명령을 실행했다. 

SET SESSION group_concat_max_len = 102400;


일단 procedure 내에서 이렇게 처리를 하면 문제 없이 데이터를 텍스트로 저장할 수 있다. MySQL 설정에서 group_concat_max_len의 값을 변경해 데이터베이스를 재실행하는 것이 가장 깔끔한 방식이다. 그래서 DevOps 통해서 group_concat_max_len 값을 영구적으로 값을 변경하려고 했는데 8시간 차이가 나는 원격 근무 중이고 티켓 만들어 요청하기도 귀찮아서 procedure 내에서 매 번 세션의 값을 바꿔 실행하는 것으로 만족하기로 했다. 프로덕션 가기 전에는 제대로 바꾸는 게 좋겠다. 





Posted by 코딩새싹
,