Develop
Python3 (SQL Alchemy) - MySQL server has gone away 에러 해결
Dork94
2020. 3. 11. 22:52
Database 서버를 교체하고 기존 코드를 돌려보니, 크롤링을 하던 도중 ERROR 2006 (HY000): MySQL server has gone away 에러가 심심찮게 발생했다.
그래서 해결법을 찾아보았고 잘 되는것 같아 공유한다.
원인으로는 DB 서버측, 클라이언트 측이 있을 수 있다.
# 서버 설정 |
보통 클라이언트에서 네트워킹이 장시간 없으면 서버 측에서 설정한 설정 값에 따라 연결을 끊거나, 서버에서 지정한 버퍼 (데이터 양)을 초과하면 서버에서 RST 패킷을 보내 연결을 끊는 것 같다.
대표적으로 관련된 설정 값은 아래와 같다.
connect_timeout
max_allowed_packet
net_buffer_length
max_allowed_packet
wait_timeout
mysql에서 설정을 바꾸기 위해서는 db에 접속하여 아래와 같이 명령어를 입력해주면 된다 (영구적으로 바꾸기 위해서는 ini 파일을 수정하여야 함).
mysql> SET GLOBAL max_allowed_packet=64*1024*1024;
# 클라이언트 설정 |
클라이언트로는 현재 파이썬의 SQL Alchemy를 이용하고 있으며, pymysql 모듈을 이용하여 접속하고 있다.
클라이언트에서 engine을 create할때 pool_pre_ping 옵션을 True로 추가해주면 된다.
아마도, 일정시간 연결이 없어도 ping (e.g., SELECT 1)을 보내서 연결을 유지하도록 하는 것 같다.
engine = db.create_engine('mysql+pymysql://{0}:{1}@{2}/{3}'.format(id,password,host,db_name), pool_pre_ping=True)