database/sql

mysql server has gone away

아르르르를를르 2020. 8. 5. 10:50

job scheduler로 동작주기가 15시간인 모듈을 개발하였다. 

서비스 올리고 나니 처음 동작할 때 무조건 "ERROR 2006 (HY000): MySQL server has gone away"가 났다.

db 서버와 연결이 끊긴 거 같은데 구글링해보니 원인은 mysql 기본설정값과 연관이 있다.

 

1. max_allowed_packet = 16M

insert, update문 등으로 인해 전송패킷 사이즈가 크면 발생한다. 쿼리 내용이 많아서 그런 것이므로 값을 늘려주면 된다. 기본값은 1M로 설정되어 있을 것이다. mysql을 docker로 운영하는 경우 my.cnf 파일에서 값을 변경하여 서버가 재시작되더라도 값이 반영될 수 있도록 하자.

 

2. wait_timeout = 28800

wait_timeout 값 28800 은 8시간이내에 쿼리동작이 없으면 서버 부하를 위해 연결을 끊어버린다는 의미이다. 나의 경우 이 경우에 해당되었다.

그렇다고 이 값을 늘리기엔 db서버 부하 이슈가 발생할 수 있으니 다른 방법을 찾아보았다.

 

3. pool_pre_ping

개발모듈에서 mysqlclient로 python sqlalchemy를 orm으로 사용하고 있다.

engine = create_engine("mysql+pymysql://user:pw@host/db", pool_pre_ping=True)

 

pool_pre_ping은 disconnect_handling을 비관적(소극적)으로 해결하는 방법으로 db서버 접속전에 "select 1;" 과 같은 간단한 쿼리문을 ping처럼 날려 connection을 확인하고, 연결하는 역할을 한다. 나는 비관적 방법을 택했고, 그 뒤에 에러가 발생하지 않는 것을 확인하였다.

 

좀 더 낙관적으로 disconnect_handling 하는 방법은 다음과 같은데, connection pool을 설정시간마다 disconnect 한 뒤, 새로 recycle 해준다. 

create_engine("mysql://scott:tiger@localhost/test", pool_recycle=3600)

 

 

참고사이트 :

https://docs.sqlalchemy.org/en/13/faq/connections.html

https://docs.sqlalchemy.org/en/13/core/pooling.html

https://docs.sqlalchemy.org/en/13/core/engines.html#sqlalchemy.create_engine.params.pool_recycle

 

'database > sql' 카테고리의 다른 글

each method each connection?  (0) 2021.11.18
tinyInt(1) 과 tinyInt(2) 차이  (0) 2020.07.07
column유형  (0) 2020.03.12
process 관련 명령어  (0) 2020.01.20
count(*) 와 count(col) 속도 비교  (0) 2020.01.17